我们封装一个menu()函数实现菜单的打印
我们在这里写一个简单的菜单
void menu()
{printf("*************************\n");
printf("****** 1.play *****\n");
printf("****** 0.exit *****\n");
printf("*************************\n");
}
效果如下
我们想让这个游戏可以一直玩,需要循环来控制
我们封装一个test()函数来实现
void test()
{int input = 0;
do
{menu();//每次输入都打印菜单
printf("请输入:>");
scanf("%d", &input);
switch (input)
{case 1://如果选择1,游戏开始
game();
break;
case 0://如果选择0,跳出switch重新开始选择
printf("退出游戏\n");
break;
default://输入其他,提示输入错误,跳出后重新输入
printf("请重新输入\n");
}
} while (input);
}
在case1中我们封装了game()函数来实现游戏的逻辑
分文件执行因为我们这个游戏需要的函数比较多
所以我们在同一个项目中创建一个test.c文件用来测试,game.c文件来实现游戏逻辑,game.h文件来存放项目的头文件 和函数的声明.
我们想要下棋首先需要一个棋盘来存放我的棋子
所以我我创建一个二维数组来存放棋子
#define ROW 3
#define COL 3
char board[ROW][COL];
我们封装一个函数 int_board 将数组中所有元素初始化为空格
void int_board(char board[ROW][COL], int row, int col)
{//将棋盘所有元素初始化为空格
int i = 0;
for (i = 0; i< row; i++)
{int j = 0;
for (j = 0; j< col; j++)
{ board[i][j] = ' ';
}
}
}
为了使代码能够在我这个基础上改成其他大小的棋盘,我定义两个常量ROW和COL作为棋盘的长和宽
接下来我们需要打印一个下图所展现的的可视化棋盘
我们封装一个 print_board函数来实现我们棋盘的打印
void print_board(char board[ROW][COL], int row, int col)
{int i = 0;
for (i = 0; i< row; i++)
{int j = 0;
for (j = 0; j< col; j++)
{ printf(" %c ", board[i][j]);
if (j< col - 1)
printf("|");
}
printf("\n");
if (i< row - 1)
{ for (j = 0; j< col; j++)
{ printf("---");
if (j< col - 1)
printf("|");
}
printf("\n");
}
}
}
下棋逻辑的初始化我们想和电脑下棋
并且我下一步 电脑下一步如此循环直到 分出游戏胜负
每下一步棋就打印出我们的棋盘看看棋子下在了哪里
规定玩家下棋为‘ * ’
电脑下棋为‘ # ’
封装函数player_move作为玩家下棋的逻辑
封装函数computer_move作为电脑下棋的逻辑
函数is_win作为判断输赢的函数
while (1)
{//玩家移动
player_move(board, ROW, COL);
print_board(board, ROW, COL);
ret = is_win(board, ROW, COL);
if (ret != 'C')
{ break;
}
//电脑移动
computer_move(board, ROW, COL);
print_board(board, ROW, COL);
ret = is_win(board, ROW, COL);
if (ret != 'C')
{ break;
}
}
if (ret == '#')
printf("电脑赢了\n");
if (ret == '*')
printf("玩家赢了\n");
if (ret == 'Q')
printf("平局\n");
}
//判断输赢的代码要告诉我:电脑赢了?玩家赢了?玩家赢?游戏继续?
//电脑赢:#
//玩家赢:*
//平局:Q
//游戏继续:C
player_move函数computer_move函数和is_win函数的实现player_move函数的实现
void player_move(char board[ROW][COL],int row, int col)
{printf("玩家移动\n");
printf("请输入坐标:");//提示信息
int x = 0;
int y = 0;//下棋的坐标
while (1)
{scanf("%d%d", &x, &y);
if (x >0 && x< row + 1 && y>0 && y< col + 1)
{ if (board[x - 1][y - 1] == ' ')//如果此处是空格,说明没有棋子,可以下在这里
{ board[x - 1][y - 1] = '*';
break;
}
else//如果此处不是空格 说明已被占用
printf("该坐标已被占用,请重新输入\n");
}
else//若输入坐标不在数组范围内 重新输入
{ printf("输入错误,请重新输入\n");
}
}
}
computer_move函数的实现
我在此处给电脑的下棋逻辑是随机下棋
void computer_move(char board[ROW][COL], int row, int col)
{printf("电脑移动\n");
while (1)
{//调用rand函数时要使用srand函数,否则产生伪随机数
//但srand函数不能循环调用,所以我把srand放在test函数中,不在此处展现
int x = rand() % row;//产生0 - row-1之间的随机数
int y = rand() % col;
if (board[x][y] == ' ')//如果是空格,下棋
{ board[x][y] = '#';
break;
}
}
}
is_win函数的实现
逻辑是判断每行每列和对角线是否排满
如果排满就赢得游戏
char is_win(char board[ROW][COL], int row, int col)
{int cnt = 0;
int i = 0;
for (i = 0; i< row; i++)//判断每行
{int j = 0;
cnt = 0;
for (j = 1; j< col; j++)
{ if (board[i][j] == board[i][j - 1] && board[i][j] != ' ')
{ cnt++;
}
if (cnt == col-1)
{ return board[i][j];//电脑赢返回‘#’,玩家赢返回‘*’
}
}
}
for (i = 0; i< col; i++)//判断每列
{int j = 0;
cnt = 0;
for (j = 1; j< row; j++)
{ if(board[j][i]==board[j-1][i] && board[j][i]!=' ')
{ cnt++;
}
if (cnt == row-1)
{ return board[j][i];//电脑赢返回‘#’,玩家赢返回‘*’
}
}
}
//对角线
cnt = 0;
for (i = 1; i< col; i++)
{int j = i;
if (board[i][j] == board[i - 1][j - 1] && board[i][j] != ' ')
{ cnt++;
}
if (cnt == col - 1)
{ return board[i][j];//电脑赢返回‘#’,玩家赢返回‘*’
}
}
cnt = 0;
for (i = 0; i< col-1; i++)
{int j = col - i - 1;
if (board[i][j] == board[i + 1][j - 1] && board[i][j] != ' ')
{ cnt++;
}
if (cnt == col - 1)
{ return board[i][j];//电脑赢返回‘#’,玩家赢返回‘*’
}
}
if (is_full(board, row, col) == 1)//判断棋盘是否充满
{return 'Q';//充满就是平局 返回‘Q’
}
return 'C';//如果一轮过后谁都没赢,游戏继续
}
此处在判断棋盘是否充满时封装了is_full函数来判断
所以我们要对is_full函数定义
int is_full(char board[ROW][COL], int row, int col)
{int i = 0;
for (i = 0; i< row; i++)
{int j = 0;
for (j = 0; j< col; j++)
{ if (board[i][j] == ' ')
return 0;
}
}
return 1;
}
总结到此我们的三子棋小游戏的基本逻辑已经实现
游戏项目具体在链接: link
希望我的代码能对你产生帮助
IDE VS2022
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧