文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C语言怎么实现三子棋小游戏

2023-06-17 05:04

关注

这篇文章主要介绍“C语言怎么实现三子棋小游戏”,在日常操作中,相信很多人在C语言怎么实现三子棋小游戏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言怎么实现三子棋小游戏”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

①游戏效果

②主函数逻辑搭建

任何一个项目的实现,最重要的就是逻辑结构搭建,而各个功能的实现就是采取函数(模块化)进行细分.

所以我们需要搭建逻辑,那么逻辑结构是啥呢?

#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)逻辑搭建

前面的逻辑结构已经搭建,而我们需要实现的就是 playgame()模块.

那么他的功能逻辑是啥呢??

#define row 3#define col 3void 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的要求是什么?

C语言怎么实现三子棋小游戏

既要显示边界,也要显示board的存储内容.

而显示边界我们可以分成小块循环显示,比如看成3个条形加上最后下边界

C语言怎么实现三子棋小游戏

每一个条形又可以看成三个小方块加上小右边界

C语言怎么实现三子棋小游戏

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 3void 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语言怎么实现三子棋小游戏”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯