本文小编为大家详细介绍“如何用C语言代码实现三子棋小游戏”,内容详细,步骤清晰,细节处理妥当,希望这篇“如何用C语言代码实现三子棋小游戏”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
有一个3*3的棋盘
每次下棋后(电脑和玩家),棋盘会更新数据
会有菜单提示相关命令进行相关操作
下棋方法是输入坐标
每一局游戏结束后,会询问是否继续.
任何一个项目的实现,最重要的就是逻辑结构搭建,而各个功能的实现就是采取函数(模块化)进行细分.
所以我们需要搭建逻辑,那么逻辑结构是啥呢?
首先会跳出提示菜单,内容为 0退出游戏,1开始/继续游戏,其他键提示错误,并重新输入
按0后提示 “成功退出游戏”
按1开始游戏
#include <stdio.h> int main() { int input = 0; do { remind(); // 提示菜单 scanf("%d",&input); //开始输入命令 switch (input) { case 0: printf("成功退出游戏 "); break; case 1: playgame(); // 开始游戏 printf("是否继续游戏 "); break; default : printf("命令错误,请重新选择 "); break; } } while (input); return 0; }
前面的逻辑结构已经搭建,而我们需要实现的就是 playgame()模块.
那么他的功能逻辑是啥呢??
棋盘内容用二维数组存储
初始化棋盘(即棋盘上还没有下子).所以初始化是一个单独模块
对弈分为两个模块(电脑下子与玩家下子)
每一局对弈后,都要判断电脑或玩家是否赢.(所以又是一个单独的判断输赢模块)
#define row 3 #define col 3 void playgame() { char board[row][col]; // 存储下子内容 int result = 0; //用来接收Iswin函数判断的返回值 Initboard(board, row, col); //初始化棋盘,即最开始棋盘都没有下子 Displayboard(board, row, col); //显示棋盘,即显示棋盘目前的状态 while (1) //开始进行对弈,直到一方赢或者平局结束循环 { player(board, row, col); //玩家下子函数 if ((result = Iswin(board, row, col)) == 1) break; // Iswin函数的设定是如果玩家胜利,返回1 computer(board, row, col); //电脑下子函数 if ((result = Iswin(board, row, col)) == -1) break; // Iswin函数的设定是 如果电脑胜利,返回-1 if (!result) break; //返回0平局,如果既没有输赢也不是平局,则继续对弈 } if (result == 1) printf("恭喜您取得胜利!!!!!!!!! "); else if (result == -1) printf("你也太辣鸡了吧,电脑都下不赢 "); else printf("哎~~,你的技术不行啊,居然和电脑达成平手 "); }
解释:
可以清晰的明白playgame()函数的逻辑结构.
其中有一步骤是这样的if (Iswin(board, row, col) >= 0),它的执行是先调用函数(满足我们需要判断谁赢的要求),再利用返回结果判断是否结束循环,一条程序就达到两个效果,比较妙.
0.remind函数实现
就是起到一个提示作用,直接打印就行.
void remind() { printf("+------------------------------------------+ " "+-------------- 0 结束游戏 --------------+ " "+----------- 1 开始/继续游戏 ------------+ " "+------------------------------------------+ "); }
1.Initboard函数实现
既然是初始化函数,说明我们的要求就是把二维数组board初始化为全空格.
void Initboard(char(*board)[3],int Row,int Col ) { int i = 0, j = 0; for (i = 0; i < Row; i++) { for (j = 0; j < Col; j++) { board[i][j] = " "; // 赋予空格 } } }
2.Displayboard函数实现
显示棋盘内容显示的不止是二维数组board的内容,还要加上边界(如图),所以Displayboard的要求是什么?
既要显示边界,也要显示board的存储内容.
而显示边界我们可以分成小块循环显示,比如看成3个条形加上最后下边界
每一个条形又可以看成三个小方块加上小右边界
void Displayboard(char(*board)[3], int Row, int Col) { int i = 0, j = 0; for (i = 0; i < Row; i++) { printf("+---+---+---+ "); //打印小条形的上边界 for (j = 0; j < Col; j++) { printf("| %c ",board[i][j]); //打印小条形中的方块内容 } printf("| "); //补上 小右边界 } printf("+---+---+---+ "); //补上 下边界 }
3.player函数实现
玩家下棋采用的是坐标输入方式
玩家输入一个坐标,那么棋盘上的相应位置就应该更新.(相应位置用 * 表示)
输入坐标时候还要检验该位置是否已经落子了.
void player(char(*board)[3], int Row, int Col) { printf("请分别输入横纵坐标(输入数据请用空格隔开): "); scanf("%d%d", &Row, &Col); while (1) { if (((1 <= Row) && (Row <= 3)) //边界必须合格,且该地方无子 && ((1 <= Col) && (Col <= 3)) && (board[Row-1][Col-1] == " ")) { board[Row - 1][Col - 1] = "*"; //之所以Row - 1 Col - 1是考虑到玩家不一定是程序员,他不知道编程从0开始数 break; } else { printf("请仔细坚持你的坐标位置,是否已经落子或坐标超界,然后重新输入坐标. "); printf("请输入坐标: "); scanf("%d%d", &Row, &Col); } } printf("下子成功! "); Displayboard(board, row, col); // 无论是玩家还是电脑下子,都需要显示出下子内容 }
4.Iswin函数实现
玩家或者电脑下子后,需要判断双方有一方是否赢.
Iswin的作用就是判断是否有一方赢.
其中返回值1代表玩家胜利,返回值0代表平局,返回值-1代表电脑赢
判断胜利方法就是检查每行每列以及斜线是否有一样的,以及是否不输不赢
int Iswin(char(*board)[3], int Row, int Col) { //怎么判断一方赢?? 横,竖,斜线只要都一样,则可以知道一方赢(全是空格除外) for (int i = 0; i < Row; i++) //每一行 { if ((board[i][0] == board[i][1]) && (board[i][1] == board[i][2]) && (board[i][0] != " ")) { if (board[i][0] == "*") return 1; //如果一行都是*,说明玩家胜利,否则电脑胜利 return -1; } } for (int j = 0; j < Col; j++) //每一列 { if ((board[0][j] == board[1][j]) && (board[1][j] == board[2][j]) && (board[0][j] != " ")) { if (board[0][j] == "*") return 1; //如果一列都是*,说明玩家胜利,否则电脑胜利 return -1; } } if (((board[0][0] == board[1][1]) && (board[1][1] == board[2][2]) && (board[1][1] != " ")) //斜线 ||((board[0][2] == board[1][1]) && (board[1][1] ==board[2][0]) && (board[1][1] != " "))) { if (board[1][1] == "*") return 1; return -1; } for (int i = 0; i < Row; i++) { for (int j = 0; j < Col; j++) { if (board[i][j] == " ") return -2; //如果前三者情况都没有,只要目前棋盘上还剩下空余位置 //就说明不输不赢,需要继续对弈.返回[-1,1]之外的值就行 } } return 0; //除去上面4种情况就是平局 }
5.computer函数实现
由于是电脑下载,我们无法操作,于是只有让电脑随机下载了.缺陷是电脑就有点智障了,哈哈.
#include <stdlib.h> #include <time.h> void computer(char(*board)[3], int Row, int Col) { srand(time(NULL)); while (1) { int i = rand() % 3; int j = rand() % 3; if (board[i][j] == " ") { board[i][j] = "#";//#代表电脑下子 break; } } printf("电脑已下子: "); Displayboard(board, row, col); //电脑下子后,显示棋盘 }
#include <stdio.h> #include <stdlib.h> #include <time.h> #define row 3 #define col 3 void remind() { printf("+------------------------------------------+ " "+-------------- 0 结束游戏 --------------+ " "+----------- 1 开始/继续游戏 ------------+ " "+------------------------------------------+ "); } void Initboard(char(*board)[3],int Row,int Col ) { int i = 0, j = 0; for (i = 0; i < Row; i++) { for (j = 0; j < Col; j++) { board[i][j] = " "; // 赋予空格 } } } void Displayboard(char(*board)[3], int Row, int Col) { int i = 0, j = 0; for (i = 0; i < Row; i++) { printf("+---+---+---+ "); for (j = 0; j < Col; j++) { printf("| %c ",board[i][j]); } printf("| "); } printf("+---+---+---+ "); } void player(char(*board)[3], int Row, int Col) { printf("请分别输入横纵坐标(输入数据请用空格隔开): "); scanf("%d%d", &Row, &Col); while (1) { if (((1 <= Row) && (Row <= 3)) //边界必须合格,且该地方无子 && ((1 <= Col) && (Col <= 3)) && (board[Row-1][Col-1] == " ")) { board[Row - 1][Col - 1] = "*"; //之所以Row - 1 Col - 1是考虑到玩家不一定是程序员,他不知道编程从0开始数 break; } else { printf("请仔细坚持你的坐标位置,是否已经落子或坐标超界,然后重新输入坐标. "); printf("请输入坐标: "); scanf("%d%d", &Row, &Col); } } printf("下子成功! "); Displayboard(board, row, col); // 无论是玩家还是电脑下子,都需要显示出下子内容 } void computer(char(*board)[3], int Row, int Col) { srand(time(NULL)); while (1) { int i = rand() % 3; int j = rand() % 3; if (board[i][j] == " ") { board[i][j] = "#";//#代表电脑下子 break; } } printf("电脑已下子: "); Displayboard(board, row, col); //电脑下子后,显示棋盘 } int Iswin(char(*board)[3], int Row, int Col) { //怎么判断一方赢?? 横,竖,斜线只要都一样,则可以知道一方赢(全是空格除外) for (int i = 0; i < Row; i++) //每一行 { if ((board[i][0] == board[i][1]) && (board[i][1] == board[i][2]) && (board[i][0] != " ")) { if (board[i][0] == "*") return 1; //如果一行都是*,说明玩家胜利,否则电脑胜利 return -1; } } for (int j = 0; j < Col; j++) //每一列 { if ((board[0][j] == board[1][j]) && (board[1][j] == board[2][j]) && (board[0][j] != " ")) { if (board[0][j] == "*") return 1; //如果一列都是*,说明玩家胜利,否则电脑胜利 return -1; } } if (((board[0][0] == board[1][1]) && (board[1][1] == board[2][2]) && (board[1][1] != " ")) //斜线 ||((board[0][2] == board[1][1]) && (board[1][1] ==board[2][0]) && (board[1][1] != " "))) { if (board[1][1] == "*") return 1; return -1; } for (int i = 0; i < Row; i++) { for (int j = 0; j < Col; j++) { if (board[i][j] == " ") return -2; //如果前三者情况都没有,只要目前棋盘上还剩下空余位置 //就说明不输不赢,需要继续对弈.返回[-1,1]之外的值就行 } } return 0; //除去上面4种情况就是平局 } void playgame() { char board[row][col]; // 存储下子内容 int result = 0; //用来接收Iswin函数判断的返回值 Initboard(board, row, col); //初始化棋盘,即最开始棋盘都没有下子 Displayboard(board, row, col); //显示棋盘,即显示棋盘目前的状态 while (1) //开始进行对弈,直到一方赢或者平局结束循环 { player(board, row, col); //玩家下子函数 if ((result = Iswin(board, row, col)) == 1) break; // Iswin函数的设定是如果玩家胜利,返回1 computer(board, row, col); //电脑下子函数 if ((result = Iswin(board, row, col)) == -1) break; // Iswin函数的设定是 如果电脑胜利,返回-1 if (!result) break; //返回0平局,如果既没有输赢也不是平局,则继续对弈 } if (result == 1) printf("恭喜您取得胜利!!!!!!!!! "); else if (result == -1) printf("你也太辣鸡了吧,电脑都下不赢 "); else printf("哎~~,你的技术不行啊,居然和电脑达成平手 "); } #include <stdio.h> int main() { int input = 0; do { remind(); // 提示菜单 scanf("%d", &input); //开始输入命令 switch (input) { case 0: printf("成功退出游戏 "); break; case 1: playgame(); // 开始游戏 printf("是否继续游戏 "); break; default: printf("命令错误,请重新选择 "); break; } } while (input); return 0; }
读到这里,这篇“如何用C语言代码实现三子棋小游戏”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。