受欢迎的网站建设外贸平台实训总结
- 作者: 五速梦信息网
- 时间: 2026年04月20日 08:28
当前位置: 首页 > news >正文
受欢迎的网站建设,外贸平台实训总结,门户网站是如何做引流的,seo博客优化目录 一、游戏设计的整体思路二、各个步骤的代码实现1. 菜单及循环选择的实现2. 棋盘的初始化和显示3. 轮流下棋及结果判断实现4. 结果判断实现 三、所有代码四、总结 一、游戏设计的整体思路
#xff08;1#xff09;提供一个菜单让玩家选择人机对战、玩家对战或者退出游戏… 目录 一、游戏设计的整体思路二、各个步骤的代码实现1. 菜单及循环选择的实现2. 棋盘的初始化和显示3. 轮流下棋及结果判断实现4. 结果判断实现 三、所有代码四、总结 一、游戏设计的整体思路
1提供一个菜单让玩家选择人机对战、玩家对战或者退出游戏且一局结束以后还可以继续选择直到退出。 2使用一个 3*3 二维数组来表示一个棋盘存放双方的落子情况并进行显示。且显示时使用一些符号进行分隔让棋盘更加合理。 3初始棋盘应为空然后提示先手方下棋要对先手方落子位置进行判断是否合法是否该位置已经落子最后先手方下棋完毕后应检查棋局状态获胜、平局或继续同理后手方下棋。 4若平局或者任意一方获胜则结束对局显示结果。
本次代码使用多文件形式一共有三个文件一个头文件包含各种声明一个 .c 文件进行测试一个 .c 文件实现函数功能。
二、各个步骤的代码实现
- 菜单及循环选择的实现
1主函数代码的实现
// 头文件
#include stdio.h
#include Tic_tac_toe.hint main()
{// 所需变量int select 0;// 选择do{// 菜单menu();// 选择scanf(%d, select);// 判断switch (select){case 1 : // 人机对战PVE();break;case 2 :PVP(); // 玩家对战break;case 0 :printf(游戏结束\n);break;}} while (select);return 0;
}2头文件中的声明
// 菜单
void menu();3函数实现
// 菜单
void menu()
{printf(***********************************\n);printf(******* 1. PVE *******\n);printf(******* 2. PVP *******\n);printf(******* 0. exit *******\n);printf(***********************************\n);
}4运行效果如下
- 棋盘的初始化和显示
棋盘的初始化和显示分别设计为两个函数 —— InitBoard()、PrintBoard()。首先需要在主函数创建棋盘且大小使用符号常量方便替换。然后把棋盘的信息传入人机对战和玩家对战函数中并在头文件和实现文件中进行相应的声明和定义。
1主函数创建棋盘
int main()
{// 所需变量int select 0;char board[ROW][COL] { 0 }; // 创建棋盘//…
}2头文件进行相应声明
// 初始化棋盘
void InitBoard(char board[][COL], int row, int col);// 打印棋盘
void PrintBoard(char board[][COL], int row, int col);// 人机对战模式
void PVE(char board[][COL], int row, int col);// 玩家对战模式
void PVP(char board[][COL], int row, int col);3实现文件进行定义
// 初始化棋盘
void InitBoard(char board[][COL], int row, int col)
{int i;for (i 0; i row; i){int j;for (j 0; j col; j)board[i][j] ;}
}// 打印棋盘
void PrintBoard(char board[][COL], int row, int col)
{// 打印棋盘时需要适当添加符号分隔int i;for (i 0; i row; i){int j;for (j 0; j col; j)printf( —);// 下一行printf(\n);for (j 0; j col; j)printf(| %c , board[i][j]);// 补齐改行分隔printf(|);// 下一行printf(\n);}// 补齐最后一行分隔for (i 0; i col; i)printf( —);printf(\n);
}// 人机对战模式
void PVE(char board[][COL], int row, int col)
{printf(\n人机对战\n);// 初始化棋盘InitBoard(board, row, col);// 显示棋盘PrintBoard(board, row, col);
}// 玩家对战模式
void PVP(char board[][COL], int row, int col)
{printf(\n玩家对战\n);// 初始化棋盘InitBoard(board, row, col);// 显示棋盘PrintBoard(board, row, col);
}运行效果如下
- 轮流下棋及结果判断实现
这里假设人机对战时玩家使用符号 ‘#’机器人使用符号 ‘’玩家对战时一号玩家使用符号 ‘#’二号玩家使用符号 ‘’。玩家下棋和机器人下棋分别使用两个函数 —— PMove() 和 EMove()。PMove() 函数需要使用一个额外的变量判断是 1 号玩家下棋还是 2 号玩家下棋。
判断结果函数 is_win() 需要判断每行是否相同、每列是否相同倘若其中有一个实现则有一方获胜倘若没有则需要使用函数 is_full() 判断棋盘是否已满若满则平局否则继续。is_full() 函数也可以直接实现在 is_win() 函数内部。
1头文件函数声明
// 玩家下棋
void PMove(char board[][COL], int row, int col, int who);// 机器人下棋
void EMove(char board[][COL], int row, int col);// 判断是否获胜
void is_win(char board[][COL], int row, int col);2实现文件函数定义
// 玩家下棋
void PMove(char board[][COL], int row, int col, char who)
{// 所需变量int x, y;do{// 输入坐标printf(玩家下棋输入坐标中间用空格隔开\n);scanf(%d %d, x, y);// 判断合法性if ((x 0 || x row || y 0 || y col) || board[x - 1][y - 1] ! ){printf(坐标非法请重新输入\n);}else{board[x - 1][y - 1] who;break;}} while (1);
}// 机器人下棋
void EMove(char board[][COL], int row, int col)
{// 机器人是随机下棋的这里就要获取随机数了// 需要包含头文件 stdlib.h 和 time.h // 设置随机数种子srand((unsigned)time(0));printf(电脑下棋\n);while (1){int x rand() % row; // 0 - row - 1int y rand() % col; // 0 - col - 1if (board[x][y] ){board[x][y] *;break;}}
}// 判断是否获胜
char is_win(char board[][COL], int row, int col)
{// 判断每行int r 1;int i;for (i 0; i row; i){// 重置判断符号r 1;// 若首字符为空则下一行if (board[i][0] )continue;// 判断改行int j;for (j 1; j col; j){r * (board[i][j - 1] board[i][j]);// 判断if (!r)break;}if ®return board[i][0];}// 判断每列int c 1;int j;for (j 0; j col; j){// 重置判断符号c 1;// 首字符为空则下一列if (board[0][j] )continue;// 判断该列int i;for (i 1; i row; i){c * (board[i - 1][j] board[i][j]);// 判断if (!c)break;}if ©return board[0][j];}// 判断对角线int d 1;if (board[0][0] ! ){for (i 1; i row; i){d * (board[i - 1][i - 1] board[i][i]);// 判断if (!d)break;}if (d)return board[0][0];}if (board[0][col] ! ){d 1;for (i 1; i row; i){d * (board[i - 1][col - i 1] board[i][col - i]);// 判断if (!d)break;}if (d)return board[0][col];}// 判断棋盘是否已满int full 1;for (i 0; i row; i){for (j 0; j col; j){if (board[i][j] ){// 未满return C;}}}// 已满return D;}上述代码中 is_win() 函数中所使用的是通用判断方法即使改变了符号常量 ROW 和 COL 的值也可以是判断。如果实在理解不了可以只当 3*3 的特殊情况来实现判断当然也可能是我的代码写的不好。
3程序运行结果 这里值展示人机对战的三种结果
玩家获胜
电脑获胜
平均
- 结果判断实现 该代码直接放在了函数 PMove() 和函数 EMove() 中也可以单独写一个函数。 1实现文件函数定义 // 人机对战模式 void PVE(char board[][COL], int row, int col) {printf(\n人机对战\n);// 初始化棋盘InitBoard(board, row, col);// 显示棋盘PrintBoard(board, row, col);// 开始下棋int ret 0;do{// 玩家下棋PMove(board, row, col, #);// 显示棋盘PrintBoard(board, row, col);// 判断ret is_win(board, row, col);if (ret ! C)break;// 机器人下棋EMove(board, row, col);// 显示棋盘PrintBoard(board, row, col);// 判断ret is_win(board, row, col);if (ret ! C)break;} while (1);// 判断最终结果if (ret #)printf(玩家获胜\n);else if (ret *)printf(电脑获胜\n);elseprintf(平局\n); }// 玩家对战模式 void PVP(char board[][COL], int row, int col) {printf(\n玩家对战\n);// 初始化棋盘InitBoard(board, row, col);// 显示棋盘PrintBoard(board, row, col);// 开始下棋int ret 0;do{// 玩家 1 号下棋PMove(board, row, col, #);// 显示棋盘PrintBoard(board, col, row);// 判断ret is_win(board, row, col);if (ret ! C)break;// 玩家 2 号下棋PMove(board, row, col, *);// 显示棋盘PrintBoard(board, col, row);// 判断ret is_win(board, row, col);if (ret ! C)break;} while (1);// 判断最终结果if (ret #)printf(玩家 1 号获胜\n);else if (ret *)printf(玩家 2 号获胜\n);elseprintf(平局\n); }2演示结果 在上一次演示结果中已经体现。 三、所有代码 分三个文件分别是头文件 Tic_tac_toe.h测试文件 test.c和函数实现文件 Tic_tac_toe.c。 1Tic_tac_toe.h // 常量声明 #define ROW 3 #define COL 3// 函数声明// 菜单 void menu();// 初始化棋盘 void InitBoard(char board[][COL], int row, int col);// 打印棋盘 void PrintBoard(char board[][COL], int row, int col);// 玩家下棋 void PMove(char board[][COL], int row, int col, char who);// 机器人下棋 void EMove(char board[][COL], int row, int col);// 判断是否获胜 char is_win(char board[][COL], int row, int col);// 人机对战模式 void PVE(char board[][COL], int row, int col);// 玩家对战模式 void PVP(char board[][COL], int row, int col);2test.c // 头文件 #include stdio.h #include Tic_tac_toe.hint main() {// 所需变量int select 0;char board[ROW][COL] { 0 };// 选择do{// 菜单menu();// 选择scanf(%d, select);// 判断switch (select){case 1 : // 人机对战PVE(board, ROW, COL);break;case 2 :PVP(board, ROW, COL); // 玩家对战break;case 0 :printf(游戏结束\n);break;default :printf(选择错误请重新选择!\n);break;}} while (select);return 0; }3Tic_tac_toe.c // 头文件 #include stdio.h #include stdlib.h #include time.h #include Tic_tac_toe.h// 函数定义// 菜单 void menu() {printf(***********************************\n);printf(******* 1. PVE *******\n);printf(******* 2. PVP *******\n);printf(******* 0. exit *******\n);printf(***********************************\n); }// 初始化棋盘 void InitBoard(char board[][COL], int row, int col) {int i;for (i 0; i row; i){int j;for (j 0; j col; j)board[i][j] ;} }// 打印棋盘 void PrintBoard(char board[][COL], int row, int col) {// 打印棋盘时需要适当添加符号分隔int i;for (i 0; i row; i){int j;for (j 0; j col; j)printf( —);// 下一行printf(\n);for (j 0; j col; j)printf(| %c , board[i][j]);// 补齐改行分隔printf(|);// 下一行printf(\n);}// 补齐最后一行分隔for (i 0; i col; i)printf( —);printf(\n); }// 玩家下棋 void PMove(char board[][COL], int row, int col, char who) {// 所需变量int x, y;do{// 输入坐标printf(玩家下棋输入坐标中间用空格隔开\n);scanf(%d %d, x, y);// 判断合法性if ((x 0 || x row || y 0 || y col) || board[x - 1][y - 1] ! ){printf(坐标非法请重新输入\n);}else{board[x - 1][y - 1] who;break;}} while (1); }// 机器人下棋 void EMove(char board[][COL], int row, int col) {// 机器人是随机下棋的这里就要获取随机数了// 需要包含头文件 stdlib.h 和 time.h // 设置随机数种子srand((unsigned)time(0));printf(电脑下棋\n);while (1){int x rand() % row; // 0 - row - 1int y rand() % col; // 0 - col - 1if (board[x][y] ){board[x][y] *;break;}} }// 判断是否获胜 char is_win(char board[][COL], int row, int col) {// 判断每行int r 1;int i;for (i 0; i row; i){// 重置判断符号r 1;// 若首字符为空则下一行if (board[i][0] )continue;// 判断改行int j;for (j 1; j col; j){r * (board[i][j - 1] board[i][j]);// 判断if (!r)break;}if ®return board[i][0];}// 判断每列int c 1;int j;for (j 0; j col; j){// 重置判断符号c 1;// 首字符为空则下一列if (board[0][j] )continue;// 判断该列int i;for (i 1; i row; i){c * (board[i - 1][j] board[i][j]);// 判断if (!c)break;}if ©return board[0][j];}// 判断对角线int d 1;if (board[0][0] ! ){for (i 1; i row; i){d * (board[i - 1][i - 1] board[i][i]);// 判断if (!d)break;}if (d)return board[0][0];}if (board[0][col] ! ){d 1;for (i 1; i row; i){d * (board[i - 1][col - i 1] board[i][col - i]);// 判断if (!d)break;}if (d)return board[0][col];}// 判断棋盘是否已满int full 1;for (i 0; i row; i){for (j 0; j col; j){if (board[i][j] ){// 未满return C;}}}// 已满return D;}// 人机对战模式 void PVE(char board[][COL], int row, int col) {printf(\n人机对战\n);// 初始化棋盘InitBoard(board, row, col);// 显示棋盘PrintBoard(board, row, col);// 开始下棋int ret 0;do{// 玩家下棋PMove(board, row, col, #);// 显示棋盘PrintBoard(board, row, col);// 判断ret is_win(board, row, col);if (ret ! C)break;// 机器人下棋EMove(board, row, col);// 显示棋盘PrintBoard(board, row, col);// 判断ret is_win(board, row, col);if (ret ! C)break;} while (1);// 判断最终结果if (ret #)printf(玩家获胜\n);else if (ret *)printf(电脑获胜\n);elseprintf(平局\n); }// 玩家对战模式 void PVP(char board[][COL], int row, int col) {printf(\n玩家对战\n);// 初始化棋盘InitBoard(board, row, col);// 显示棋盘PrintBoard(board, row, col);// 开始下棋int ret 0;do{// 玩家 1 号下棋PMove(board, row, col, #);// 显示棋盘PrintBoard(board, col, row);// 判断ret is_win(board, row, col);if (ret ! C)break;// 玩家 2 号下棋PMove(board, row, col, *);// 显示棋盘PrintBoard(board, col, row);// 判断ret is_win(board, row, col);if (ret ! C)break;} while (1);// 判断最终结果if (ret #)printf(玩家 1 号获胜\n);else if (ret *)printf(玩家 2 号获胜\n);elseprintf(平局\n); }四、总结 本次三子棋的代码编写总体来说还可以基本上都实现了上述功能其中的某些代码本人均是根据符号常量来编写的也就是即使符号常量改变本代码依旧可以实现。当然本人水平有限有的地方看不懂可能是本人代码写的太烂这里先道个歉。 当然代码还有很多可以提升的地方比如优化棋盘可以使用鼠标来下棋提升电脑的水平等。
- 上一篇: 受欢迎的网站建设平台seo网站建设厦门
- 下一篇: 售后网站用什么模板品牌营销包括哪些方面
相关文章
-
受欢迎的网站建设平台seo网站建设厦门
受欢迎的网站建设平台seo网站建设厦门
- 技术栈
- 2026年04月20日
-
受欢迎的企业网站建设怎样做网站卖东西
受欢迎的企业网站建设怎样做网站卖东西
- 技术栈
- 2026年04月20日
-
受欢迎的建网站公司crm系统网站
受欢迎的建网站公司crm系统网站
- 技术栈
- 2026年04月20日
-
售后网站用什么模板品牌营销包括哪些方面
售后网站用什么模板品牌营销包括哪些方面
- 技术栈
- 2026年04月20日
-
售后网站用什么模板微信公众账号申请注册
售后网站用什么模板微信公众账号申请注册
- 技术栈
- 2026年04月20日
-
售卖网站建设实验报告西安网页制作与设计
售卖网站建设实验报告西安网页制作与设计
- 技术栈
- 2026年04月20日
