1.创建一个二维数组用来存放棋子的坐标。
2.初始化数组让它里面的元素都为空格。
2.设计一个简易的棋盘界面。
3.实现玩家走棋,电脑走棋的函数。
4.每次走完棋之后用判断是否赢。
首先弄一个简易的菜单用户输入数字选择相应的操作
void menu()
{
printf("*****************************\n");
printf("******** 1. play **********\n");
printf("******** 0. quit **********\n");
printf("*****************************\n");
}
然后设计主函数
游戏完成可以选择在此选择是否玩游戏,所以使用do while循环,至少执行一次游戏。
使用变量input来接收玩家的选择,然后使用switch语句来选择相应的操作。
int main()
{
srand((unsigned int)time(NULL));//随机数种子
int input = 0; // 接受玩家的选择
do
{
menu(); // 展示选择界面
scanf("%d", &input);//接收玩家的选择
switch (input)
{
case 1: //选择1进入游戏 执行game函数
game();
break;
case 0:
printf("退出游戏\n"); // 选择0退出游戏。
break;
default:
printf("输入错误\n");
break;
}
} while (input); //循环停止的条件为input不为0
}
游戏大致界面就成型了。接下来实现game函数。
完成游戏的话首先需要设置棋盘,在这里用一个3*3的二维数组来实现棋盘部分
1.首先对棋盘的所有元素进行初始化初始化为 ’ '(空格)
定义initboard函数 参数需要传一个二维数组,所以传入数组指针,和行数和列数。
函数定义
void initboard(char board[ROW][COL], int row, int col);
代码
void initboard(char board[ROW][COL],int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
2.使用简单的符号将二维数组隔开并将棋盘设置好了后将棋盘打印出来
使用简单的’|’ 和’-'字符设置成上面这样的棋盘
使用for循环实现棋盘的打印
代码
void display(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
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");
}
}
}
下来实现玩家走 和电脑走的部分。
因为是玩家走–电脑走–玩家走…直到棋盘满或者玩家或电脑赢,所以应该是一个循环体
这里game函数可以写成这样
void game()
{
char ret = 0;
char board[ROW][COL] = { 0 };
initboard(board, ROW, COL);
display(board, ROW, COL);
while (1)
{
//电脑走,玩家走的部分
//当其中一个玩家赢的话,使用break跳出循环
//或者当棋盘满了跳出循环
}
1.玩家走 (棋子为’o’)
使用两个变量 x y 分别接收玩家输入的坐标,并且将对应的坐标减一因为数组坐标从0开始,将坐标减一的话可以解决这个问题。
接收完后对棋盘中相应的坐标进行判断,当broad[x-1][y-1]不为’ ‘的时候,说明棋盘中没有棋子坐标合法,将board[x-1][y-1]的字符改为’o’。
void playermove(char board[ROW][COL], int row, int col)
{
while (1) //使用循环,实现对x y的判断
{
int x = 0;
int y = 0;
printf("玩家走\n");
scanf("%d%d", &x, &y);
if (x >= 1 && x <= row&&y >= 1 && y <= col) //检查x y是否超出边界
{
if (board[x - 1][y - 1] == ' ') //当棋盘中的元素不为空格的时候改变字符
{
board[x - 1][y - 1] = 'O';
break;
}
else //当里面有棋子的话重新进行循环重新输入坐标
{
printf("坐标内有棋子\n");
}
}
else //当坐标超出棋盘的边界时候弹出‘坐标错误’回到while循环中
{
printf("坐标错误\n");
}
}
}
当玩家走完棋子的时候调用display函数将棋盘打印出来。
void game()
{
char ret = 0;
char board[ROW][COL] = { 0 };
initboard(board, ROW, COL);
display(board, ROW, COL);
while (1)
{
playermove(board, ROW, COL);
display(board, ROW, COL);
}
2.电脑走(棋子为’x’)
使用rand函数生成两个数字x,y,并将其分别%row,和%col,生成两个0到2的数。
当坐标合法的时候改变棋盘中的字符。
void computermove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("电脑走\n");
while (1)
{
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = 'X';
break;
}
}
}
同理电脑走完后调用display函数将棋盘打印出来。
void game()
{
char ret = 0;
char board[ROW][COL] = { 0 };
initboard(board, ROW, COL);
display(board, ROW, COL);
while (1)
{
playermove(board, ROW, COL);
display(board, ROW, COL);
computermove(board, ROW, COL);
display(board, ROW, COL);
}
这时基本的三字棋操作就完成了。
接下来设计最主要的一部分 判断输赢。
当三字棋盘中的对角线,或者一行一列,中的棋子一样的话就对应相对的人赢。当然还要判断是否平局 ,当棋盘的中没有空的时候就说明棋盘满了!平局。当玩家赢的话函数返回字符“o”当电脑赢的话返回字符‘x’当平局的时候返回‘p’。
char iswin(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++) //判断一行中的棋子是否相同
{
if (board[i][j] == board[i][j + 1] && board[i][j + 1] == board[i][j + 2] && board[i][j + 2] != ' ')
{
return board[i][j + 2];//相同的话返回相应的棋子 电脑赢返回‘x’玩家赢返回‘o’
}
}
for (j = 0; j < col; j++)//判断一列中的棋子是否相同
{
int i = 0;
if (board[i][j] == board[i + 1][j] && board[i + 1][j] == board[i + 2][j] && board[i + 2][j] != ' ')
{
return board[i + 2][j];
}
}
for (i = 0; i < row; i++) //判断对角线一撇的棋子是否相同
{
j = i;
if (board[i][j] != ' '&&board[i][j] == board[i + 1][j + 1] && board[i + 1][j + 1]==board[i + 2][j + 2])
{
return board[i][j];
}
}
for (i = 0; i < row; i++) //判断一捺的棋子是否相同
{
if (board[i][row - 1] == board[i + 1][row - 2] && board[i + 1][row - 2] == board[i + 2][row - 3] && board[i][row - 1] != ' ')
{
return board[i][row - 1];
}
}
if (isfull(board, row, col) == 1) //当isfull函数为1的时候说明平局
{
return 'p';
}
else //不为1 游戏接着执行
return 'c';
}
int isfull(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;
}
游戏判断输赢就完成了 下来完善game函数
每次玩家或电脑走完后检查是否赢,是否平局,
void game()
{
char ret = 0;
char board[ROW][COL] = { 0 };
initboard(board, ROW, COL); //初始化棋盘
display(board, ROW, COL); //打印棋盘
while (1)
{
playermove(board, ROW, COL); //玩家走
display(board, ROW, COL); //走完后的棋盘
ret = iswin(board, ROW, COL); //检查是否赢
if (ret != 'c') //若赢或者平局的时候停止循环
break;
computermove(board, ROW, COL);//电脑走
display(board, ROW, COL); //电脑走完后的棋盘
ret = iswin(board, ROW, COL); //检查是否输赢
if (ret != 'c')
break;
}
if (ret == 'O') //跳出循环的时候一定是谁赢了或者平局
printf("玩家赢\n");
else if (ret == 'X')
printf("电脑赢\n");
else if (ret == 'p')
printf("平局\n");
}
游戏就完成了。