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");
}
游戏就完成了。
本文发布于:2024-01-28 23:49:31,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170645697611186.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |