三子棋游戏(又称9宫格游戏):

游戏规则:

玩家和电脑随机下子,当一方的三子连成一条线,可以为 横连  纵连  斜连。或者棋盘下满则此时判断为平局,游戏结束

实现程序的思路:

首先我们需要定义游戏菜单和游戏规则。

游戏菜单:选择是否开始游戏,1:开始游戏,0:退出。

int main()
{int input = 0;srand((unsigned int)time(NULL));do{menu();printf("请选择:》\n");scanf("%d", &input);switch (input){case 1:printf("游戏开始:》\n");game();break;case 0:printf("退出游戏:》\n");break;default:printf("选择错误,请重新选择:》\n");break;}} while (input);return 0;
}

游戏规则:包含在game()函数中

void game()
{int b = 0;char tmp = 0;//储存数据,创建二维数组char board[ROW][COL];//初始化棋盘。initboard(board, ROW, COL);//打印棋盘Display(board, ROW, COL);//游戏开始,for(b=0;b<ROW * COL; b++){//玩家走:playmove(board, ROW, COL);Display(board, ROW, COL);//判断输赢tmp=is_wim(board, ROW, COL);if (tmp == '*'){break;}//电脑走:computer(board, ROW, COL);Display(board, ROW, COL);tmp=is_cwim(board, ROW, COL);if (tmp == '#'){break;}}

棋盘初始化 ----打印棋盘 --- 设定棋盘的行列数 ---   打印棋盘的样式。

//初始化棋盘。
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] = ' ';}   }
}
//打印棋盘
void Display(char board[ROW][COL], int row, int col)
{int i = 0;int j = 0;int y = 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 < row; j++){printf("___");if(j<col-1)printf("|");}printf("\n");} }if (i == row){for (j = 0; j < col - 1; j++){printf("   |");}}printf("\n");
}

玩家先走,电脑后走。一方棋子有三子连在一起即为赢,否则棋盘满后还未有一方赢则判定为平局。(我们在玩家选择的位置是填充*在电脑走的位置填充#)

玩家走 ---- 输入玩家走的坐标 ---- 有空位就打印出棋子(还需要考虑坐标是否被占用和输入坐标在不在范围内的两种情况)

//玩家走
playmove(board, ROW, COL);Display(board, ROW, COL);//判断输赢tmp=is_wim(board, ROW, COL);if (tmp == '*'){break;}
//对playmove(board, ROW, COL)函数进行实现
void playmove(char board[ROW][COL], int row, int col)
{int x = 0;int y = 0;while (1){printf("请选择你要走的坐标:>");scanf("%d %d", &x, &y);//判断坐标是否合理if ( x >= 1 && x <= row && y >= 1 && y <= col ){if (board[x-1][y-1] == ' '){board[x-1][y-1] = '*';break;}  //判断坐标是不是存在棋子else{printf("该位置已存在棋子:\n");}}else{printf("坐标不存在:>\n");}}
}

电脑走 → 设定电脑走的随机坐标(棋盘上有空位才能走)

//电脑走:
void computer(char board[ROW][COL], int row, int col)
{printf("电脑走:>\n");while (1){int x = rand() % row;int y = rand() % col;//判断坐标是不是存在棋子if (board[x][y] == ' '){board[x][y] = '#';break;}}
}

判断输赢 ----- 棋盘上的横连、纵连、斜连有三子一样的即为该方赢 → 棋盘满了即为平。

为了不仅仅判断三字棋盘的输赢,我将判断玩家胜利和电脑胜利分开实现

判断玩家胜利(判断电脑胜利代码相同,只是将*改变成#)

//判断玩家输赢
char is_wim(char board[ROW][COL], int row, int col)
{int x = 0;int y = 0;int count = 0;//判断行。for (x = 0; x < row; x++){for (y = 0; y < col; y++){if (board[x][y] == '*'){count++;}}if (count == col){return '*';}count = 0;}//判断列for (y = 0; y < col; y++){for (x = 0; x < row; x++){if (board[x][y] == '*'){count++;}}if (count == col){return '*';}count = 0;}//判断左斜杠for (x = 0; x < col; x++){if (board[x][x] == '*'){count++;}if (count == col){return '*';}}//判断右斜杆int c = row-1;y = 0;for (x = 0; x < col; x++){if (board[c][y] == '*'){c--;y++;}}if (y == col){return '*';}return 0;
}

如果棋盘上的横连、纵连、斜连成一条线(这一条线上都有相同的字符)那么系统就可以自己返回字符

//玩家走:playmove(board, ROW, COL);Display(board, ROW, COL);//判断输赢tmp=is_wim(board, ROW, COL);if (tmp == '*'){break;}//电脑走:computer(board, ROW, COL);Display(board, ROW, COL);tmp=is_cwim(board, ROW, COL);if (tmp == '#'){break;}}if (b == ROW * COL)//说明棋盘下满了{printf("平局:\n");}if (tmp == '*'){printf("玩家胜利: \n");}if (tmp == '#'){printf("遗憾败北;\n");}
}

判断平局: 棋盘为ROW行COL列的直接定义for循环的限制条件for(b=0;b<ROW * COL; b++);这样就可以适应n行n列对平局的判断。

for(b=0;b<ROW * COL; b++){//玩家走:playmove(board, ROW, COL);Display(board, ROW, COL);//判断输赢tmp=is_wim(board, ROW, COL);if (tmp == '*'){break;}//电脑走:computer(board, ROW, COL);Display(board, ROW, COL);tmp=is_cwim(board, ROW, COL);if (tmp == '#'){break;}}
if (b == ROW * COL){printf("平局:\n");}

如果电脑胜利

玩家胜利

如果我们想换大一些的棋盘,也可以直接在定义字符常量那里改就可以了。

当然这里电脑是随机下子,充满不确定性,这里还有待改善。

c语言:三子棋游戏(二维数组的运用)相关推荐

  1. 实体类 接口_Java 语言基础编程题 (二维数组, 五子棋游戏, 实体类和接口)

    原文:Java 语言基础编程题 (二维数组, 五子棋游戏, 实体类和接口, 视频讲解) 这里分享三道编程题, 下面是我个人的视频讲解 二维数组, 五子棋游戏, 实体类和接口_哔哩哔哩 (゜-゜)つロ ...

  2. C语言错误c2063,请教C语言中关于将二维数组复制到一个三维数组的问题

    请教C语言中关于将二维数组复制到一个三维数组的问题 小白正在填写一段代码,是有点类似与俄罗斯方块的一段游戏代码,代码如下 要求在增加参数,变量和函数的情况下完成此代码,只能填写// write app ...

  3. C语言-三子棋游戏的实现

    C语言-三子棋游戏的实现 目录 C语言-三子棋游戏的实现 游戏背景介绍 游戏实现思路 test模块 menu模块 **game模块** init_board(初始化棋盘) print_board(打印 ...

  4. C语言学习之将一个二维数组的行和列互换,存到另一个二维数组中

    C语言学习之将一个二维数组的行和列互换,存到另一个二维数组中 #include <stdio.h> int main(){int a[2][3]={{1,2,3},{4,5,6}}; // ...

  5. c语言中二维数组怎么,c语言中什么是二维数组

    c语言中什么是二维数组 二维数组A[m][n],这是一个m行,n列的二维数组.以下是由应届毕业生小编整理关于c语言二维数组的内容,希望对大家有所帮助!更多相关内容请关注应届毕业生考试 网. c语言的二 ...

  6. c语言函数输出数组,如何让C语言函数返回一个二维数组

    为了让C语言函数返回一个二维数组,有些人这样定义函数: int **foo(int rows, int columns) 然后在函数中费劲心机拼出来一个这样的malloc语句: int (*resul ...

  7. java二维数组模拟用户登录_Java 语言基础编程题 (二维数组, 五子棋游戏, 实体类和接口)...

    这里分享三道编程题, 下面是我个人的视频讲解我的解题思路以及代码运行演示https://www.zhihu.com/video/1253424180936724480 1. 编程实现以下需求: 定义一 ...

  8. C语言三子棋游戏进阶版详解(包括多子棋)

    目录 一,总体思路介绍 二,具体思路的实现 1.初始化游戏界面 2.初始化棋盘 3.打印棋盘 4.玩家移动 5.电脑移动 6.判断输赢 三,源码展示 game.h game.c test.c 一,总体 ...

  9. C语言三子棋游戏的编程实现

    程序界面实现如图所示的人与电脑互动的三子棋游戏 文件模块 test.c 测试三子棋游戏 game.h 游戏的函数声明(头文件) game.c 游戏函数的实现 代码模块 初始化棋盘 (每个位置初始为空格 ...

  10. c语言暴力求解法二维数组比较,【算法】搜索二维矩阵 暴力解法二分法 4种语言...

    编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列. 每行的第一个整数大于前一行的最后一个整数. 示例 1:输入:matrix = ...

最新文章

  1. 目标检测 | 清晰易懂的SSD算法原理综述
  2. szu cf集训Codeforces Round #631 (Div. 2)A ~ D[贪心,数据结构,思维,dp]
  3. 贝叶斯神书《统计反思》推出第二版,视频课程同步上线,作者亲自在线答疑...
  4. 通向高可扩展性之路(谷歌篇)
  5. 2020年快手校招JAVA岗笔试第一题
  6. [深度学习] Keras 如何使用fit和fit_generator
  7. Host 'xxx' is not allowed to connect to this MySQL server.
  8. C++总结篇(5)vector
  9. 农历算法-ASP.NET(C#)(转)
  10. SpringBoot拦截器配置
  11. orcad中的PSpice仿真加入厂商模型
  12. Confluence 6 恢复一个空间
  13. 自适应鲁棒控制(ARC)实例推导(手写超详细)
  14. Android仿微信朋友圈发动态功能(相册图片多选)
  15. 拒绝了对对象 'data'(数据库 'xxx',所有者 'dbo')的 SELECT 权限 解决方案
  16. printf二进制输出
  17. APM —全链路追踪
  18. Flutter AnimatedIcon 图标也可以动画
  19. 【爬虫进阶】常见的反爬手段和解决方法(建议收藏)
  20. 应采儿吐槽孕期不适 细数准妈妈的5道坎儿

热门文章

  1. java 浙江大学_浙江大学java上机参考答案
  2. vb.net画心形图
  3. 在vue中使用海康插件实现视频监控,视频直播方法一(RTMP流加Flash加videoJS)
  4. 如丝般顺滑的2017阿里双11黑科技曝光
  5. Axure RP 8 实战手册pdf
  6. 单反相机镜头焦距范围的毫米具体指的是什么?
  7. 专家称医疗信息化急需掌舵人
  8. material studio使用perl脚本形成交联聚合物
  9. 使用CDB和NTSD开始调试旅程
  10. Git及Github客户端无法下载问题解决以及快速下载办法