一. 基本流程
在写代码之前,我们首先要梳理好逻辑:
1.基本框架
2.菜单界面
3.创建棋盘
4.棋盘初始化
5.显示棋盘
6.玩家走
7.电脑走
8.判断胜负
二. 步骤
1.基本框架
int input = 0;
do
{
menu();
printf("请输入数字:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default :
printf("输入错误,请重新输入\n");
break;
}
} while (input);
2.菜单界面
void menu()
{
printf("**************************\n");
printf("**** 1.play 0. exit ****\n");
printf("**************************\n");
}
1.开始游戏 0.结束游戏
3.创建棋盘
棋盘用3行3列的二维数组来表示。
行和列可以用宏定义方法:
好处:
1. 修改棋盘很方便,只用改宏定义就可以
2. 提高代码可读性
#define ROW 3
#define COL 3
char board[ROW][COL] = { 0 };
4.棋盘初始化
把棋盘需要落子的地方初始化为’ '。
void InitBoard(char board[ROW][COL])
{
int i = 0;
for (i = 0; i < ROW; i++)
{
int j = 0;
for (j = 0; j < COL; j++)
{
board[i][j] = ' ';
}
}
}
5.显示棋盘
为了方便棋盘随着ROW和COL的变化而变化,采用循环的打印方法。
void Display(char board[ROW][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");
}
}
}
6.玩家走
用 * 代表玩家落的子
注意:
1.玩家落子要在棋盘范围内。
2.玩家落子的位置必须是空的(’ ')。
3.输入坐标不满足要重新输入。
void PlayerMove(char board[ROW][COL])
{
printf("玩家走\n");
printf("请输入坐标:>");
int x = 0;
int y = 0;
while (1)
{
scanf("%d %d", &x, &y);
if (1 <= x && x <= ROW && 1 <= x && y <= COL)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("坐标被占用,请重新输入\n");
}
}
else
{
printf("输入错误,请重新输入\n");
}
}
}
电脑走
电脑随机数生成坐标,# 表示电脑落子
注意:
1.在主函数使用srand((unsigned int)time(NULL));
2.要在空的地方下
void ComputerMove(char board[ROW][COL])
{
printf("电脑走\n");
while (1)
{
int x = rand() % ROW;
int y = rand() % COL;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
判断胜负
有四种情况:
1.玩家赢
2.电脑赢
3.都没赢,继续下
4.棋盘满了,平局
char BoardCheck(char board[ROW][COL])
{
int flag = ' ';
int i = 0;
int j = 0;
//横判断
for (i = 0; i < ROW; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2])
{
flag = board[i][1];
break;
}
}
//竖判断
for (i = 0; i < COL; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i])
{
flag = board[1][i];
break;
}
}
//斜判断
for (i = 0; i < ROW; i++)
{
for (j = 0; j < COL; j++)
{
if (board[0][0] == board[1][1] && board[1][1] == board[2][2])
{
flag = board[1][1];
break;
}
}
}
//平局判断
char flag1 = 'a';
for (i = 0; i < ROW; i++)
{
for (j = 0; j < COL; j++)
{
if (board[i][j] == ' ')
{
flag1 = ' ';
break;
}
}
}
if (flag1 == 'a')
{
return flag1;
}
return flag;
}
三. 结果演示
1.玩家胜利
2.电脑赢
3.平局