C语言小游戏–三子棋
文章目录
-
- 设计思路
- 三子棋源代码
-
- 头文件
- 主函数
- 函数主体
??三子棋是一种传统民间的小游戏,(别名圈圈叉叉,井字格棋)只需要一个井字格便可以快速玩一把,任一方只要三棋子连成一条线就算胜利。作为简单轻松的小游戏,相信不少人都玩过,我也在小学初中上课时和同桌没少玩。
文章图片
三子棋 (图片来自百度)
?? 而C语言也可以实现简单三子棋游戏,并和电脑做对手进行人机对战。设计思路如下:
设计思路
- 先展示游戏菜单利用swtich语句通过用户输入进行选择,具体操作代码如下。
void Menu()//菜单函数
{
printf(" _________________________________\n");
printf(" ||\n");
printf(" |1.开始游戏|\n");
printf(" |0. 退 出|\n");
printf(" ---------------------------------\n");
}int main()
{
int select = 0;
int quit = 0;
while (!quit){
printf("要来一把三子棋吗?\n");
Menu();
scanf("%d", &select);
switch (select){
case 1:
Game();
break;
case 0:
quit = 1;
break;
default:
printf("请输入正确的选择\n\n");
break;
}
}
printf("再见!\n");
结果图:
文章图片
- 需要一个棋盘(3*3)来保存用户和电脑落子。定义一个二维数组(char board[3][3])里面存放落子坐标未落子除保存空格。先将棋盘初始化为空格(InitBoard())然后进行显示。
文章图片
#define INIT ' '//棋盘初始化为空格
//棋盘初始化函数
static void InitBoard(char board[][COL],int row,int col)
{
for (int i = 0;
i < ROW;
i++){
for (int j = 0;
j < COL;
j++)
board[i][j] = INIT;
}
}
//显示棋盘
static void Show(char board[][COL], int row, int col)
{
system("cls");
system("cls");
// system函数代表执行系统命令,system("cls")就是执行命令“清屏”的意思
for (int i = 0;
i < COL;
i++){
printf("%d ", i+1);
}
printf("\n____________\n");
for (int i = 0;
i < ROW;
i++){
printf("%d", i+1);
for (int j = 0;
j < COL;
j++){
printf(" |%c ",board[i][j]);
}
printf("\n------------\n");
}
}
【c语言|C语言小游戏--三子棋】结果图:
文章图片
- 之后便进入了代码最核心也是游戏主要的功能**Game()**函数,将各个功能和流程架构组织起来,整个游戏开始和结束都在Game中进行。
#define ROW3//棋盘大小三行
#define COL3//棋盘大小三列
#define PLAYER'O'//玩家棋子为O
#define COMPUTER'X'//电脑棋子为X
#define DRAW 'D'//平局
#define NEXT 'N'//继续void Game()
{
char board[ROW][COL];
InitBoard(board, ROW, COL);
//初始化棋盘
srand((unsigned long)time (NULL));
//随机数种子
char result = 0;
while (1){
Show(board, ROW, COL);
//玩家落子
Player(board, ROW, COL);
result = End(board, ROW, COL);
//判断结果
if (result != NEXT){
break;
}
Show(board, ROW, COL);
//电脑落子
Computer(board, ROW, COL);
result = End(board, ROW, COL);
if (result != NEXT){
break;
} }
switch (result){//result带来的三种最终结果
case PLAYER:
printf("你赢了!!!\n\n\n");
break;
case COMPUTER:
printf("Game Over,你输给了电脑。\n\n\n");
break;
case DRAW:
printf("你和电脑下了个平手。\n\n\n");
break;
default :
printf("BUG????\n\n");
//不应该运行到这
break;
}
}
部分游戏结果:
文章图片
- 玩家和电脑的落子也是重要的一环,玩家落子(Player())通过键盘输入坐标选定落子位置下’O’,电脑(Computer())通过循环生成随机数坐标传入落子位置(因为棋盘较小可以用随机数较为简单的解决)。
这里注意要进行对落子位置判断是否合法以及是否已经有落子,即只有输入坐标 == 空格时才成功落子否则重新输入落子坐标。
static void Player(char board[][COL], int row, int col)
{
int x, y;
x = 0, y = 0;
while (1){
printf("请输入你想要下的棋子坐标(x,y)\n");
scanf("%d %d", &x, &y);
if (xROW || y>COL){
printf("请输入正确的坐标\n");
continue;
}
if (board[x - 1][y - 1] == INIT){
board[x - 1][y - 1] = PLAYER;
break;
}
else{ printf("这个位置已经有棋子了\n");
}
}} void Computer(char board[][COL], int row, int col)
{
while (1){
int x = rand() % ROW;
int y = rand() % COL;
if (board[x][y] == INIT){
board[x][y] = COMPUTER;
break;
}
}
}
- 在落子之后需要判断有没有出现结果,**End()**函数。在游戏进行中我们应考虑四种结果,玩家(Player)胜利,电脑(Computer)胜利,平局(DRAW),以及没人胜利切还有落子位置还需继续(NEXT)落子。
通过枚举遍历的方式简单直观的完成了对每个位置的检索。
static char End(char board[][COL], int row, int col)
{
for (int i = 0;
i < ROW;
i++){
if (board[i][0] == board[i][1] && \
board[i][1] == board[i][2] && \
board[i][1] != INIT){
return board[i][1];
}
} for (int j = 0;
j < COL;
j++){
if (board[0][j] == board[1][j] && \
board[1][j] == board[2][j] && \
board[1][j] != INIT){
return board[1][j];
}
}
if (board[0][2] == board[1][1] && \
board[1][1] == board[2][0] && \
board[1][1] != INIT){
return board[1][1];
}
if (board[0][0] == board[1][1] && \
board[1][1] == board[2][2] && \
board[1][1] != INIT){
return board[1][1];
}
for (int i = 0;
i < ROW;
i++){
for (int j = 0;
j < COL;
j++)
if (board[i][j]==INIT){
return NEXT;
}
}
return DRAW;
}
结果图:
文章图片
文章图片
三子棋源代码 头文件
#pragma once#include
#include
#include//生成随机数
#include //时间生成随机数种子
#pragma warning (disable:4996)#define ROW3//棋盘大小三行
#define COL3//棋盘大小三列
#define INIT ' '//棋盘初始化为空格
#define DRAW 'D'//平局
#define NEXT 'N'//继续
#define PLAYER'O'//玩家棋子为O
#define COMPUTER'X'//电脑棋子为Xextern void Menu();
extern void Game();
extern void InitBoard(char board[][COL], int row, int col);
extern void Show(char board[][COL], int row, int col);
extern char End(char board[][COL], int row, int col);
extern void Player(char board[][COL], int row, int col);
extern void Computer(char board[][COL], int row, int col);
主函数
#include "three.h"int main()
{
int select = 0;
int quit = 0;
while (!quit){
printf("要来一把三子棋吗?\n");
Menu();
scanf("%d", &select);
switch (select){
case 1:
Game();
break;
case 0:
quit = 1;
break;
default:
printf("请输入正确的选择\n\n");
break;
}
}
printf("再见!\n");
system("pause");
return 0;
}
函数主体
#include "three.h"void Menu()
{
printf(" _________________________________\n");
printf(" ||\n");
printf(" |1.开始游戏|\n");
printf(" |0. 退 出|\n");
printf(" ---------------------------------\n");
}static void InitBoard(char board[][COL],int row,int col)
{
for (int i = 0;
i < ROW;
i++){
for (int j = 0;
j < COL;
j++)
board[i][j] = INIT;
}
}static void Show(char board[][COL], int row, int col)
{
system("cls");
// system函数代表执行系统命令,system("cls")就是执行命令“清屏”的意思
for (int i = 0;
i < COL;
i++){
printf("%d ", i+1);
}
printf("\n____________\n");
for (int i = 0;
i < ROW;
i++){
printf("%d", i+1);
for (int j = 0;
j < COL;
j++){
printf(" |%c ",board[i][j]);
}
printf("\n------------\n");
}
}void Game()
{
char board[ROW][COL];
InitBoard(board, ROW, COL);
//初始化棋盘
srand((unsigned long)time (NULL));
//随机数种子
char result = 0;
while (1){
Show(board, ROW, COL);
Player(board, ROW, COL);
result = End(board, ROW, COL);
if (result != NEXT){
break;
}
Show(board, ROW, COL);
Computer(board, ROW, COL);
result = End(board, ROW, COL);
if (result != NEXT){
break;
}
}
Show(board, ROW, COL);
switch (result){
case PLAYER:
printf("你赢了!!!\n\n\n");
break;
case COMPUTER:
printf("Game Over,你输给了电脑。\n\n\n");
break;
case DRAW:
printf("你和电脑下了个平手。\n\n\n");
break;
default :
printf("BUG????\n\n");
//不应该运行到这
break;
}
}static char End(char board[][COL], int row, int col)
{
for (int i = 0;
i < ROW;
i++){
if (board[i][0] == board[i][1] && \
board[i][1] == board[i][2] && \
board[i][1] != INIT){
return board[i][1];
}
} for (int j = 0;
j < COL;
j++){
if (board[0][j] == board[1][j] && \
board[1][j] == board[2][j] && \
board[1][j] != INIT){
return board[1][j];
}
}
if (board[0][2] == board[1][1] && \
board[1][1] == board[2][0] && \
board[1][1] != INIT){
return board[1][1];
}
if (board[0][0] == board[1][1] && \
board[1][1] == board[2][2] && \
board[1][1] != INIT){
return board[1][1];
}
for (int i = 0;
i < ROW;
i++){
for (int j = 0;
j < COL;
j++)
if (board[i][j]==INIT){
return NEXT;
}
}
return DRAW;
}static void Player(char board[][COL], int row, int col)
{
int x, y;
x = 0, y = 0;
while (1){
printf("请输入你想要下的棋子坐标(x,y)\n");
scanf("%d %d", &x, &y);
if (xROW || y>COL){
printf("请输入正确的坐标\n");
continue;
}
if (board[x - 1][y - 1] == INIT){
board[x - 1][y - 1] = PLAYER;
break;
}
else{ printf("这个位置已经有棋子了\n");
}
}} void Computer(char board[][COL], int row, int col)
{
while (1){
int x = rand() % ROW;
int y = rand() % COL;
if (board[x][y] == INIT){
board[x][y] = COMPUTER;
break;
}
}
}
ps:随后我会补充更完整的解决思路。希望大家评论留言
推荐阅读
- javascript|【井字游戏】做一款回忆童年的游戏
- 灰狼算法|灰狼算法 c语言 代码,基于灰狼优化的模糊C—均值聚类算法
- C语言|C语言程序思路与几种常用的滤波
- C语言|程序环境和预处理 C语言入门到入土(进阶篇)
- C语言|C语言文件操作 C语言入门到入土(进阶篇)
- C语言|一篇解单链表(0基础看)(C语言)《数据结构与算法》
- C语言|一篇解自定义类型(结构体,位段,枚举,联合 C语言入门到入土(进阶篇))
- C语言|(指针)C语言从入门到入土(入门篇)
- C语言|如何让朋友也能玩自己写的游戏(.exe文件如何附带静态链接库)C语言从入门到入土(入门特别篇)