c语言:三子棋游戏(二维数组的运用)
三子棋游戏(又称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语言:三子棋游戏(二维数组的运用)相关推荐
- 实体类 接口_Java 语言基础编程题 (二维数组, 五子棋游戏, 实体类和接口)
原文:Java 语言基础编程题 (二维数组, 五子棋游戏, 实体类和接口, 视频讲解) 这里分享三道编程题, 下面是我个人的视频讲解 二维数组, 五子棋游戏, 实体类和接口_哔哩哔哩 (゜-゜)つロ ...
- C语言错误c2063,请教C语言中关于将二维数组复制到一个三维数组的问题
请教C语言中关于将二维数组复制到一个三维数组的问题 小白正在填写一段代码,是有点类似与俄罗斯方块的一段游戏代码,代码如下 要求在增加参数,变量和函数的情况下完成此代码,只能填写// write app ...
- C语言-三子棋游戏的实现
C语言-三子棋游戏的实现 目录 C语言-三子棋游戏的实现 游戏背景介绍 游戏实现思路 test模块 menu模块 **game模块** init_board(初始化棋盘) print_board(打印 ...
- C语言学习之将一个二维数组的行和列互换,存到另一个二维数组中
C语言学习之将一个二维数组的行和列互换,存到另一个二维数组中 #include <stdio.h> int main(){int a[2][3]={{1,2,3},{4,5,6}}; // ...
- c语言中二维数组怎么,c语言中什么是二维数组
c语言中什么是二维数组 二维数组A[m][n],这是一个m行,n列的二维数组.以下是由应届毕业生小编整理关于c语言二维数组的内容,希望对大家有所帮助!更多相关内容请关注应届毕业生考试 网. c语言的二 ...
- c语言函数输出数组,如何让C语言函数返回一个二维数组
为了让C语言函数返回一个二维数组,有些人这样定义函数: int **foo(int rows, int columns) 然后在函数中费劲心机拼出来一个这样的malloc语句: int (*resul ...
- java二维数组模拟用户登录_Java 语言基础编程题 (二维数组, 五子棋游戏, 实体类和接口)...
这里分享三道编程题, 下面是我个人的视频讲解我的解题思路以及代码运行演示https://www.zhihu.com/video/1253424180936724480 1. 编程实现以下需求: 定义一 ...
- C语言三子棋游戏进阶版详解(包括多子棋)
目录 一,总体思路介绍 二,具体思路的实现 1.初始化游戏界面 2.初始化棋盘 3.打印棋盘 4.玩家移动 5.电脑移动 6.判断输赢 三,源码展示 game.h game.c test.c 一,总体 ...
- C语言三子棋游戏的编程实现
程序界面实现如图所示的人与电脑互动的三子棋游戏 文件模块 test.c 测试三子棋游戏 game.h 游戏的函数声明(头文件) game.c 游戏函数的实现 代码模块 初始化棋盘 (每个位置初始为空格 ...
- c语言暴力求解法二维数组比较,【算法】搜索二维矩阵 暴力解法二分法 4种语言...
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列. 每行的第一个整数大于前一行的最后一个整数. 示例 1:输入:matrix = ...
最新文章
- 目标检测 | 清晰易懂的SSD算法原理综述
- szu cf集训Codeforces Round #631 (Div. 2)A ~ D[贪心,数据结构,思维,dp]
- 贝叶斯神书《统计反思》推出第二版,视频课程同步上线,作者亲自在线答疑...
- 通向高可扩展性之路(谷歌篇)
- 2020年快手校招JAVA岗笔试第一题
- [深度学习] Keras 如何使用fit和fit_generator
- Host 'xxx' is not allowed to connect to this MySQL server.
- C++总结篇(5)vector
- 农历算法-ASP.NET(C#)(转)
- SpringBoot拦截器配置
- orcad中的PSpice仿真加入厂商模型
- Confluence 6 恢复一个空间
- 自适应鲁棒控制(ARC)实例推导(手写超详细)
- Android仿微信朋友圈发动态功能(相册图片多选)
- 拒绝了对对象 'data'(数据库 'xxx',所有者 'dbo')的 SELECT 权限 解决方案
- printf二进制输出
- APM —全链路追踪
- Flutter AnimatedIcon 图标也可以动画
- 【爬虫进阶】常见的反爬手段和解决方法(建议收藏)
- 应采儿吐槽孕期不适 细数准妈妈的5道坎儿