当前位置: 首页 > news >正文

网站建设的文章济宁市人才招聘网

网站建设的文章,济宁市人才招聘网,wap网站不流行,水印wordpress文章目录 项目思路一、分文件进行创建二、进入游戏前的目录2.1 目录的功能#xff1a;2.2 目录界面#xff1a;2.3 选择进入或退出游戏2.4 多次重玩功能 三、画出棋盘3.1 写出棋子3.2 初始化棋盘3.2 画出棋盘的框架3.3 代码实现 四、玩家落子4.1 落子逻辑4.2具体情况分类讨论… 文章目录 项目思路一、分文件进行创建二、进入游戏前的目录2.1 目录的功能2.2 目录界面2.3 选择进入或退出游戏2.4 多次重玩功能 三、画出棋盘3.1 写出棋子3.2 初始化棋盘3.2 画出棋盘的框架3.3 代码实现 四、玩家落子4.1 落子逻辑4.2具体情况分类讨论4.3代码示范 五、电脑落子5.1 电脑落子的逻辑5.2分类讨论5.3 代码示范 六、输赢判断6.1 分类讨论6.2 行和列的三字成线6.3 对角线的三字成线6.4平局6.5 代码实现6.5.1 判断输赢6.5.2 判断棋盘是否满 七、完整代码示范无注释7.1 test.c7.2 game.h7.3 game.c7.4 运行图片示例 写在最后 项目思路 分文件进行创建进入游戏前的目录画出棋盘玩家落子电脑落子输赢判断 接下来我们分步骤进行详细的解释说明。 一、分文件进行创建 在具体的项目实施中我们需要分成不同的文件进行创建和书写以此来保证项目的模块化。 那么在三子棋的实际书写中 源文件 测试游戏用的代码文件用test.c或者日期.c来作为文件名游戏实现的底层代码用game.c文件作为文件名 头文件 游戏实现中使用的各个函数的声明以及包含的其他库函数的头文件需要写在头文件game.h文件里 如图所示 二、进入游戏前的目录 2.1 目录的功能 在游戏开始时给玩家视觉上的帮助和提示让玩家可以选择进入游戏或者退出游戏将游戏形成一个可以不断重玩的循环 接下来我们分步骤进行书写 2.2 目录界面 void menu() {printf(***********************\n);printf(*****1、开始游戏*******\n);printf(*****0、退出游戏*******\n);printf(***********************\n); }接着在main函数里面进行调用 int main() {menu();return 0; }这样目录的表面就写好了接下来需要写玩家选择进入游戏和退出游戏的功能了 2.3 选择进入或退出游戏 选择功能的逻辑1进入游戏0退出游戏。 显然必备的库函数有scanfswitch、case和default。为了让游戏的体验更加良好可以再加一个printf增加视觉上的游玩帮助用户友好。 那么根据刚刚的逻辑可以写出如下的选择结构其中game函数虽然还没有写出来但是整体的框架可以先确定下来之后再往里慢慢写内容。 int main() {int input 0;menu();printf(请选择---);scanf(%d, input);switch (input){case 1:game();break;case 0:printf(退出游戏\n);break;default:printf(非法输入请重试\n);break;}return 0; }2.4 多次重玩功能 多次重玩功能需要一个循环结构。由于开游戏的时候菜单页面必定会打印所以菜单页面至少会运行一次故可以使用 do while 循环结构 使用这个结构的同时判断停止的条件就可以直接填写输入项因为输入0是退出而while为非0数字运行所以刚好可以填写输入项逻辑自洽。 int main() {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);return 0; }三、画出棋盘 3.1 写出棋子 在画棋盘的框架之前需要找一个容器把棋子容纳进去而3x3的棋盘很明显用二维数组来进行盛放最为合适。 故可以写一个二维数组当做棋盘下棋就下在二维数组里面。 char board[ROW][COL] { 0 };直接写到void game函数里面就行了。 3.2 初始化棋盘 棋盘应该是全部空的而不是初始化那样全部是0所以可以写一个函数把数组里面的数据全部初始化成空格。 逻辑遍历数组并赋值 代码示范 int i,j 0 ; void InitBoard(char board[ROW][COL], int row, int col) {for (i 0; i row; i){for (j 0; j col; j){board[i][j] ;}} }3.2 画出棋盘的框架 棋盘虽然也可以不画直接9个字符位置下棋但是太不美观所以可以画一个美观一些的棋盘。 参考已经画出来的 这个棋盘显然就比9个字符位美观多了接下来就分步骤拆解它的输出 第一行看起来是三个空格一个竖杠但实际上这里需要打印的不仅是棋盘的线还要打印数组里面的棋子。 同时代码不能写死可以在game.h里面定义一个ROW行COL列这样的话想要十乘十的棋盘直接在game.h里面改数字就可以直接改全部的行列了。 game.h内 #define ROW 3 #define COL 3这样接下来的棋盘打印就可以用ROW和COL代替原来的3了。 3.3 代码实现 为了打印棋盘这个功能我们需要声明并定义一个函数使用函数进行各个不同模块的功能实现是在项目中十分有必要的。 game.h内 接受的数据棋盘数组、行、列 void DisplayBoard(char board[ROW][COL], int row, int col);而函数的定义则放在game.c内 void DisplayBoard(char board[ROW][COL], int row, int col) {for (i 0; i row; i){//打印数据行for (j 0; j col; j)//使用for循环打印每一格的数据{printf( %c , board[i][j]);if (j COL - 1)//因为棋盘边缘没有边界线所以少打印一个“|”printf(|);}printf(\n);//这里的换行需要留意别漏了//打印分割线行if (i row - 1) {for (j 0; j row; j)//使用for循环打印每一格的分割线{printf(---);if (j row - 1)//打印“|”printf(|);//同理}}printf(\n);//这里的换行需要留意别漏了} }四、玩家落子 4.1 落子逻辑 玩家落子的逻辑是输入几行几列的坐标然后棋盘在对应的位置上出现一个符号相当于是落子。 4.2具体情况分类讨论 当玩家落子正确 将“ * ”放入数组 当玩家落子不在棋盘内 打印提示让玩家重新输入 当玩家落子时棋盘已经有子 打印提示让玩家重新输入 这三种情况需要不同的代码来实现 判断是否在棋盘内可以用坐标是否在棋盘的范围内的if语句判断判断是否已经落子可以用数组里的数据是否为空格来判断若不是空格即有子不能下如果都可以就放入数组一个 * 号然后break跳出循环 经过分析不难发现这里的循环是直到下到正确的棋才会跳出循环所以只需使用while循环条件里填1或者其他非0数字就可以一直循环了。 4.3代码示范 头文件中声明函数 void PlayerMove(char board[ROW][COL], int row, int col);源文件中定义函数 void PlayerMove(char board[ROW][COL], int row, int col) {printf(请输入棋子坐标);while (1){scanf(%d %d, i, j);//输入坐标if (i 0 i row j0 j col)//判断是否在棋盘内{if (board[i - 1][j - 1] )//判断是否有子{board[i - 1][j - 1] *;break;}elseprintf(已经落子请重新输入\n);}elseprintf(非法输入\n);} }五、电脑落子 5.1 电脑落子的逻辑 首先电脑落子是需要一个随机性的那么就可以使用srand和rand函数伪随机数加上时间戳构成一个真随机数再利用这个真随机数取一个模就可以在棋盘里下棋了。 5.2分类讨论 至于实际上的分类逻辑和玩家下棋不太一样只有两种情况 当电脑落子正确 将“ # ”放入数组 当电脑落子时棋盘已经有子 电脑重新落子 5.3 代码示范 函数声明 void ComputerMove(char board[ROW][COL], int row, int col);函数定义 void ComputerMove(char board[ROW][COL], int row, int col) {while (1) //和玩家落子同理不下对棋就继续下故while1{i rand() % row;//行的随机数取模j rand() % col;//列的随机数取模if (board[i][j] )//判断是否是空位{board[i][j] #;//落子break;//跳出循环}} }这里注意rand需要和srand函数配合使用 在main函数中 srand((unsigned int)time(NULL));在头文件中 #include stdio.h //printf和scanf函数需要 #include stdlib.h //随机数需要用 #include time.h //时间戳需要用六、输赢判断 输赢判断这里由于规则是三字成线且存在平局的情况故需要分类讨论。 6.1 分类讨论 行三字成线列三字成线对角线三字成线平局 6.2 行和列的三字成线 直接判断第一个棋子和第二个棋子是否相等再并上第二个棋子与第三个棋子是否相等。在判断相等的同时需要判断是否是空格如果是空格那就是没人赢。所以需要并上一个不等于空格的条件。 6.3 对角线的三字成线 同行列的判断条件只是数位坐标需要换成对角线的。 6.4平局 当棋盘落满且没有人胜出的时候就可以判定为平局。棋盘是否落满的逻辑遍历二维数组并判断是否为空格。如果每一个位置都不是空格那就是落满了返回1如果有任何一个位置是空格立马返回0。 6.5 代码实现 6.5.1 判断输赢 char IsWin(char board[ROW][COL], int row, int col) {//行for (i 0; i row; i)if (board[i][0] board[i][1] board[i][1] board[i][2] board[i][0]! )return board[i][0];//列for (i 0; i col; i)if (board[0][i] board[1][i] board[1][i] board[2][i] board[0][i] ! )return board[0][i];//对角线if (board[0][0] board[1][1] board[1][1] board[2][2] board[0][0] ! )return board[0][0];if (board[0][2] board[1][1] board[1][1] board[2][0] board[0][2] ! )return board[0][2];//平局if (IsFull(board,row,col) 1)return D;return C; }6.5.2 判断棋盘是否满 int IsFull(char board[ROW][COL], int row, int col) {for (i 0; i row; i){for (j 0; j col; j){if (board[i][j] )//遍历并判断是否是空格return 0;}}return 1; }注以上的函数都需要在头文件中进行声明声明格式同上 七、完整代码示范无注释 7.1 test.c #define _CRT_SECURE_NO_WARNINGS 1 #include game.h void menu() {printf(***********************\n);printf(*****1、开始游戏*******\n);printf(*****0、退出游戏*******\n);printf(***********************\n); }void game() {char ret 0;char board[ROW][COL] { 0 };InitBoard(board,ROW,COL);DisplayBoard(board,ROW,COL);while (1){PlayerMove(board, ROW, COL);DisplayBoard(board, ROW, COL);retIsWin(board, ROW, COL);if (ret ! C)break;ComputerMove(board, ROW, COL);DisplayBoard(board, ROW, COL);ret IsWin(board, ROW, COL);if (ret ! C)break;}//平局Drawif (ret #)printf(电脑赢\n);else if (ret *)printf(玩家赢\n);else if (ret D)printf(平局\n);elseprintf(程序出错\n); }int main() {int input 0;srand((unsigned int)time(NULL));do{menu();printf(请选择---);scanf(%d, input);switch (input){case 1:game();break;case 0:printf(退出游戏\n);break;default:printf(非法输入请重试\n);break;}}while (input);return 0; }7.2 game.h #pragma once #include stdio.h #include stdlib.h #include time.h #define ROW 3 #define COL 3 void InitBoard(char board[ROW][COL], int row, int col); void DisplayBoard(char board[ROW][COL], int row, int col); void PlayerMove(char board[ROW][COL], int row, int col); void ComputerMove(char board[ROW][COL], int row, int col); char IsWin(char board[ROW][COL], int row, int col); int IsFull(char board[ROW][COL], int row, int col);7.3 game.c #define _CRT_SECURE_NO_WARNINGS 1 #include game.h //初始化棋盘为空格 int i, j 0; void InitBoard(char board[ROW][COL], int row, int col) {for (i 0; i row; i){for (j 0; j col; j){board[i][j] ;}} }//打印棋盘 void DisplayBoard(char board[ROW][COL], int row, int col) {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 row; j){printf(---);if (j row - 1)printf(|);}}printf(\n);}}//玩家下棋 void PlayerMove(char board[ROW][COL], int row, int col) {printf(请输入棋子坐标);while (1){scanf(%d %d, i, j);if (i 0 i row j0 j col){if (board[i - 1][j - 1] ){board[i - 1][j - 1] *;break;}elseprintf(已经落子请重新输入\n);}elseprintf(非法输入\n);} }//电脑下棋 void ComputerMove(char board[ROW][COL], int row, int col) {while (1){i rand() % row;j rand() % col;if (board[i][j] ){board[i][j] #;break;}} }int IsFull(char board[ROW][COL], int row, int col) {for (i 0; i row; i){for (j 0; j col; j){if (board[i][j] )return 0;}}return 1; }char IsWin(char board[ROW][COL], int row, int col) {//行for (i 0; i row; i)if (board[i][0] board[i][1] board[i][1] board[i][2] board[i][0]! )return board[i][0];//列for (i 0; i col; i)if (board[0][i] board[1][i] board[1][i] board[2][i] board[0][i] ! )return board[0][i];//对角线if (board[0][0] board[1][1] board[1][1] board[2][2] board[0][0] ! )return board[0][0];if (board[0][2] board[1][1] board[1][1] board[2][0] board[0][2] ! )return board[0][2];//平局if (IsFull(board,row,col) 1)return D;return C; }7.4 运行图片示例 写在最后 如果本文对您有帮助可不可以给我一个小小的点赞呀❤~您的支持是我最大的动力。 博主小白一枚才疏学浅难免有所纰漏欢迎大家讨论和提出问题博主一定第一时间改正。 谢谢观看嘿嘿(๑•̀ㅂ•́)و✧~
http://www.zqtcl.cn/news/565783/

相关文章:

  • 免费建自己的网站网站标题 关键词 描述之间的关系
  • 提供响应式网站建设wordpress怎么做背景图片
  • 相亲网与做网站做网站的目的与意义
  • 做网站字体大小网站建设是属于虚拟产品吗
  • 网站的内链怎么做校园网建设网站特色
  • 优化网站标题企业的网站一般做哪些维护
  • 聊天网站备案南阳定制网站制作价格低
  • 广州镭拓科技网站建设公司长春招聘
  • 视频网站app怎么做跨境贸易电子商务服务平台
  • 丽水网站seo餐饮vi设计案例
  • 娄底网站建设报价山东省住房和建设厅注册中心网站
  • 公司网站建设工作重点网站建设吉金手指专业11
  • vue做前台网站怎么做钓鱼网站吗
  • 个人建设网站如何定位烟台h5网站开发
  • 广州网站定制多少钱html5游戏开发
  • 使用angularjs的网站域名怎么解析到服务器
  • 地方门户网站盈利模式宝塔 wordpress
  • 西安网站备案软件开发基础教程
  • 有服务器做网站软件系统开发怎样容易
  • 网站建设的公司有发展吗织梦婚纱网站模板
  • 淘宝销售书网站建设方案wordpress调用评论数据
  • 搭建网站需要什么软件苏州吴中区建设局工程网站
  • 长沙市网站推广公司wordpress 弹窗登录插件
  • 网站策划怎么做内容朔州网站建设公司
  • 宁波拾谷网站建设蚌埠网站建设中心
  • 青岛专业设计网站公司加拿大广播公司
  • 盘锦市建设局网站地址八桂职教网技能大赛
  • 投资建设一个网站多少钱和淘宝同时做电商的网站
  • 做动物网站的素材icp备案 网站备案
  • 找人建网站唐山网络运营推广