C语言——简单的五子棋小游戏开发设计
下面展示一些 功能实现
一、菜单功能模块设计
int Menu() {system("color 3F");printf("-----------------亲,欢迎来到五子棋!----------------\n\n");printf("----------------------------------------\n\n");printf("------------------1.亲,你可以输入1选择与你的电脑PK喔---------------------\n\n");printf("------------------2.你可以输入2想与你一决高下的对手PK---------------------\n\n");printf("------------------0.结束游戏---------------------\n\n");printf("---------------------------------------------------------------------------\n");printf("请输入您的选择\n");int choice = 0;scanf("%d", &choice);return choice;
}
输出结果如下:
打印出相应的提示语,提醒玩家作出选择
二、初始化和打印棋盘功能模块设计
(1)初始化棋盘
void Init()
{for (int row = 0; row < Max_Row; ++row) {for (int col = 0; col < Max_Col; ++col) {ChessBoard[row][col] = ' ';}}
}
(2)打印棋盘
void Print() //void说明这个方法的返回值类型为空
{system("color 6F");//颜色属性由两个十六进制数字指定 – 第一个为背景,第二个则为前景.printf(" 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14\n");for (int row = 0; row < Max_Row; ++row) {printf("| %c | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c |%d\n",ChessBoard[row][0], ChessBoard[row][1], ChessBoard[row][2],ChessBoard[row][3], ChessBoard[row][4], ChessBoard[row][5],ChessBoard[row][6], ChessBoard[row][7], ChessBoard[row][8],ChessBoard[row][9], ChessBoard[row][10], ChessBoard[row][11],ChessBoard[row][12], ChessBoard[row][13], ChessBoard[row][14], row);printf("|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|\n", row);}
}
1.初始化棋盘
将二维数组中所有元素初始化为空格因为已在程序开始时定义了二维数组全局变量为棋盘存储信息,且存储元素定义为字符型,因此以空格初始化棋盘
2.棋盘的打印
(1)棋盘构造
此处利用printf直接输出以|—|和| %c |构造出的棋盘,而中间%c的位置就是将元素输出后的位置,而棋盘是由15*15的小方格组成的
(2)棋盘的输出方式
用循环的方式,将棋盘一行的方式一行一行依次输出
解决此问题所用到的知识、技巧
1.棋盘的构造可用一些常用的符号构造,—±–±–也是可以的,而此程序构造方式是|—|,| %c |
2.运用到了循环语句,将棋盘依次打印出
3.同样如同菜单页面一样引用了system(“color 6F”)图形库函数,将背景设计为橙色,字体和边框是亮白色的,给玩家美的感受
三、该五子棋游戏设计了人机模式和双人对战模式
1、人机对战功能模块设计
(1)玩家落子
void PlayerMove() {printf("到您落子了\n");while (1) {printf("请输入您想要落子的坐标\n");int row, col;scanf("%d %d", &row, &col);//如果行数或者列数不合法,继续下一次循环if (row >= Max_Row || col >= Max_Col || row < 0 || col < 0) {printf("您的输入无效!\n");continue;}//如果落子的位置不是空格,提示玩家已落子,继续下一次循环if (ChessBoard[row][col] != ' ') {printf("您输入的位置已落子\n");continue;}ChessBoard[row][col] = 'o';printf("\a");break;}
}
(2)电脑落棋
void ComputerMove() {printf("电脑落子\n");while (1) {int row, col;srand((unsigned int)time(0));row = rand() % 15col = rand() % 15;if (ChessBoard[row][col] == ' ') {ChessBoard[row][col] = 'x';printf("\a");break;}}
}
(3)人机对战函数调用实现
void GameComputer() {//1.初始化棋盘Init();char winner = ' ';while (1) {//2.打印棋盘Print();//3.玩家落子PlayerMove();//4.检测胜负winner = JudgeWinner();if (winner != ' ') {break;}//5.电脑落子ComputerMove();//6.检测胜负winner = JudgeWinner();if (winner != ' ') {break;}}Print();if (winner == 'o') {printf("你好厉害啊,你赢了\n");}if (winner == 'x') {printf("你一定是出现了失误,输给电脑啦\n");}else {printf("您只能和人工智障打平手!!\n");}
}
说明:此处是将玩家落子与电脑落子联系起来的人机对战总函数函数,判断获胜情况的函数模块将在后面进行详细说明。
每个角色每完成一次落子,都会调用判断获胜情况的函数判断输赢
解决此问题所用到的知识、技巧
玩家落子
(1)实现玩家落子的函数主要依据条件判断语句进行相应条件的判断,后给出一定提示,指引玩家操纵
(2)在判断玩家落子的位置是否已有子的时候,前面的初始化棋盘的方式为此处做了一个很好的铺垫,即判断玩家输入坐标位置是否为空格,如果为空格,则说明此处无棋子,此位置是可以落子的
(3)利用while(1){……},与if{……}if{……}嵌套,如果不满足条件则continue,则跳出当层循环,玩家可以继续输入,如果满足条件,完成落子以后则break,跳出整个循环
电脑落子
(1)此处利用了随机数srand((unsigned int)time(0)),以时间作为随机数种子,电脑随机产生1-15内的随机数生成行列坐标位置,行:row = rand() % 15,列:col = rand() % 15
2、双人对战模块设计
(1)玩家1
void Player1() {printf("到玩家1落子了\n");while (1) {printf("请输入玩家1想要落子的坐标\n");int row, col;scanf("%d %d", &row, &col);//如果行数或者列数不合法,继续下一次循环if (row >= Max_Row || col >= Max_Col || row < 0 || col < 0) {printf("您的输入无效!\n");continue;}//如果落子的位置不是空格,提示玩家已落子,继续下一次循环if (ChessBoard[row][col] != ' ') {printf("您输入的位置已落子\n");continue;}ChessBoard[row][col] = 'o';printf("\a");break;}
}
(2)玩家2
void Player2() {printf("到玩家2落子了\n");while (1) {printf("请输入玩家2想要落子的坐标\n");int row, col;scanf("%d %d", &row, &col);//如果行数或者列数不合法,继续下一次循环if (row >= Max_Row || col >= Max_Col || row < 0 || col < 0) {printf("您的输入无效!\n");continue;}//如果落子的位置不是空格,提示玩家已落子,继续下一次循环if (ChessBoard[row][col] != ' ') {printf("您输入的位置已落子\n");continue;}ChessBoard[row][col] = 'x';printf("\a");break;}
}
(3)双人对战总函数
void GamePlayer() {//1.初始化棋盘Init();//2.打印棋盘Print();char winner = ' ';while (1) {//3.玩家1落子Player1();Print();//4.检测胜负winner = JudgeWinner();if (winner != ' ') {break;}//5.玩家2落子Player2();Print();//6.检测胜负winner = JudgeWinner();if (winner != ' ') {break;}}if (winner == 'o') {printf("玩家1赢了\n");}if (winner == 'x') {printf("玩家2赢了\n");}else {printf("你们打成平手啦!!\n");}}
说明:此处是将玩家1,玩家2落子联系起来的双人对战总函数函数,判断获胜情况的函数模块将在后面进行详细说明。
此处每一次完成落子都要调用判断胜负的函数,确保判断的正确性
解决此问题所用到的知识、技巧
(1)实现玩家落子的函数主要依据条件判断语句进行相应条件的判断,后给出一定提示,指引玩家操纵
(2)在判断玩家落子的位置是否已有子的时候,前面的初始化棋盘的方式为此处做了一个很好的铺垫,即判断玩家输入坐标位置是否为空格,如果为空格,则说明此处无棋子,此位置是可以落子的
(3)利用while(1){……},与if{……}if{……}嵌套,如果不满足条件则continue,则跳出当层循环,玩家可以继续输入,如果满足条件,完成落子以后则break,跳出整个循环
四、判断获胜功能模块设计
可获胜的方向有横向连成5子,也可纵向连成5字,当然还有斜线相连的,当棋盘所空位置不能再实现5子相连的情况时,则会出现和棋
1.横向判断
(1)以行的方式对棋盘中的元素进行遍历,即在行坐标不变下,将列坐标依次加“1”直到遍历到不为空格的元素,纵坐标保持不变然后在其横坐标基础上加1,2,3,4,即遍历与之相邻的纵向的四个棋子,如果与之相邻的四个棋子均相同,则返回相应的字符参数,人机对战的总函数或双人对战的总函数对其接收判断符合的条件以后,输出胜负情况,如果不相同则返回空格,两个总函数接收到空格时会提示玩家继续输入坐标下棋。
2.右斜线判断
(1)同样以行的方式遍历,找到第一个非空格的元素,当找到以后每5×5的单元格就是一个小的棋盘,因此对该位置与右斜线上相邻的元素进行判断是否相同时,由于行坐标是向下移动的,而列坐标事项左移动的,所以只需在位置行和列坐标的基础上都加相同的数(1,2,3,4),即为此小单元棋盘上右斜线上的所有元素,当所有元素相同时,返回相应的字符参数,人机对战或者双人对战的总函数对其接收判断符合的条件后,输出胜负情况,如果不相同则返回空格,两个总函数接收到空格时会提示玩家继续输入坐标下棋。
3.竖直判断
(1)以行的方式对棋盘中的元素进行遍历,即在行坐标不变下,将列坐标依次加“1”直到遍历到不为空格的元素,纵坐标保持不变然后在其横坐标基础上加1,2,3,4,即遍历与之相邻的纵向的四个棋子,如果与之相邻的四个棋子均相同,则返回相应的字符参数,人机对战的总函数或双人对战的总函数对其接收判断符合的条件以后,输出胜负情况,如果不相同则返回空格,两个总函数接收到空格时会提示玩家继续输入坐标下棋。
4.左斜线判断
(1)同样以行的方式遍历,找到第一个非空格的元素,当找到以后每5*5的单元格就是一个小的棋盘,因此对该位置与左斜线上相邻的元素进行判断是否相同时,由于列坐标是向左移动的,所以在遍历到的位置列坐标基础上依次减1,2,3,4;而行坐标是想下移动的,所以在遍历到的位置坐标行坐标的基础上依次加1,2,3,4;此时即可遍历到小单元棋盘上左斜线上的所有元素,当所有元素相同时,返回相应的字符参数,人机对战或者双人对战的总函数对其接收判断符合的条件后,输出胜负情况,如果不相同则返回空格,两个总函数接收到空格时会提示玩家继续输入坐标下棋。
5.和棋判断
在判断胜负的函数中调用是否和棋的函数,即所有位置即将下满,不可能在出现5枚棋子相连的情况极为和棋,和棋则返回字符q,当接收到返回的q时,则输出和棋信息
int isFull(char chessBoard[Max_Row][Max_Col]) {int row, col;for (row = 0; row < Max_Row; row++) {for (col = 0; col < Max_Col; col++) {if (chessBoard[row][col] == ' ') {return 0;}}}return 1;
}
char JudgeWinner() {//先判断横着胜利的//遍历到倒数第五个格子,要判断和最后的四个格子是否相同,//所以为最大格数减4for (int row = 0; row < Max_Row; ++row) {for (int col = 0; col < (Max_Col - 4); ++col) {if (ChessBoard[row][col] != ' ') {if (ChessBoard[row][col] == ChessBoard[row][col + 1] &&ChessBoard[row][col] == ChessBoard[row][col + 2] &&ChessBoard[row][col] == ChessBoard[row][col + 3] &&ChessBoard[row][col] == ChessBoard[row][col + 4]) {return ChessBoard[row][col];}}}}//向右斜着胜利的for (int row = 0; row < (Max_Row - 4); ++row) {for (int col = 0; col < (Max_Col - 4); ++col) {if (ChessBoard[row][col] != ' ') {if (ChessBoard[row][col] == ChessBoard[row + 1][col + 1] &&ChessBoard[row][col] == ChessBoard[row + 2][col + 2] &&ChessBoard[row][col] == ChessBoard[row + 3][col + 3] &&ChessBoard[row][col] == ChessBoard[row + 4][col + 4]) {return ChessBoard[row][col];}}}}//判断竖着胜利的for (int row = 0; row < (Max_Row - 4); ++row) {for (int col = 0; col < Max_Col; ++col) {if (ChessBoard[row][col] != ' ') {if (ChessBoard[row][col] == ChessBoard[row + 1][col] &&ChessBoard[row][col] == ChessBoard[row + 2][col] &&ChessBoard[row][col] == ChessBoard[row + 3][col] &&ChessBoard[row][col] == ChessBoard[row + 4][col]) {return ChessBoard[row][col];}}}}//判断向左斜着胜利的for (int row = 0; row < (Max_Row - 4); ++row) {for (int col = 4; col < Max_Col; ++col) {if (ChessBoard[row][col] != ' ') {if (ChessBoard[row][col] == ChessBoard[row + 1][col - 1] &&ChessBoard[row][col] == ChessBoard[row + 2][col - 2] &&ChessBoard[row][col] == ChessBoard[row + 3][col - 3] &&ChessBoard[row][col] == ChessBoard[row + 4][col - 4]) {return ChessBoard[row][col];}}}}return ' ';if (isFull(ChessBoard)) {return 'q';}return ' ';
}
五、主函数设计
int main() {while (1) {int choice = Menu();if (choice == 1) {printf("电脑对战\n");GameComputer();}else if (choice == 2) {printf("玩家对战\n");GamePlayer();}else if (choice == 0) {printf("下次再见,十分遗憾\n");break;}else {printf("请输入1或0\n");}}system("pause");return 0;
}
C语言——简单的五子棋小游戏开发设计相关推荐
- C语言——简单的飞机小游戏
目录 前言 一.先看代码 二.代码解析 1.飞机图案的打印 2.控制飞机移动 getch() 函数 kbhit() 函数 3.发射激光 4.打击靶子 总结 前言 代码参考了<C语言课程设计与游戏 ...
- 超级详细的注释C语言简单实现童年小游戏:贪吃蛇
引言: 记得小时候还没有现在超级高端的智能手机,当时的诺基亚类型的老人机是我的最爱,而里面的贪吃蛇小游戏我总是能玩很久,所以今天就用C语言简单实现一下贪吃蛇这一个小游戏吧. 一. 准备工作: 1.VS ...
- C语言制作一个五子棋小游戏【附代码】
目录 五子棋游戏设计与实现 1.1 系统开发思路(需求分析) 1.2 系统功能设计 1.3 系统详细设计 1.3.1数据结构设计 1.4 系统实现 1.5 系统测试 五子棋游戏设计与实现 1.1 系统 ...
- 用C语言来实现五子棋小游戏
目录 一.五子棋的准备工作 二.五子棋的具体实现 1.棋盘 2.人机对战 2.1 玩家下棋 2.2 电脑下棋 2.3 判断输赢 三.总结 一.五子棋的准备工作 我们在写一个项目的时候,首先第一步就是应 ...
- 教你怎么用c++基本语法实现一个简单的五子棋小游戏
这个小游戏是在2020年5月份无聊写的,代码量不大,权当娱乐哈 基本思路: 1.创建一个15*15棋盘类,并设计相关函数(输出棋盘,下黑棋,下白棋等) 2.编写judge()函数,判断胜负条件 3.主 ...
- C语言简单的双人小游戏
#include<stdio.h>//双人小游戏 #include<windows.h> int main() { printf("规则:输1聚气(用于买招式 ...
- 一个简单的五子棋小游戏
利用c语言编写,在vs2017上编译运行 废话不多说直接上完整代码 #include <stdio.h> //基本输入输出头文件 #include "graphics.h&quo ...
- canvas画图实现一个简单的五子棋小游戏
原生js+canvas写一个五子棋 HTML <div id="pox"><canvas style="border:5px solid rgb(43, ...
- 简单的五子棋小游戏(html+css+js)
<!DOCTYPE html> <html><head><meta charset="UTF-8"><title>五子棋 ...
最新文章
- 【卷积神经网络结构专题】一文详解LeNet(附代码实现)
- Redis应用场景说明与部署
- nignx部署Vue单页面刷新路由404问题解决
- leetcode算法题--最小路径和
- 1269: GPA-一题简单英文题~
- java实用教程——常用实用类——String类(字符串类)
- leetcode53. 最大子数组和(暴力+贪心)
- 编程师代码G都喜欢的|细致场景森系插画手机壁纸
- chrome全屏隐藏状态栏_PS技巧丨18个让你相见恨晚的PS隐藏技巧!
- Activiti的BPMN2.0中的子流程
- 判断参数并赋予默认值
- 从小白到中级高级软件测试工程师成长路线!--(上篇)
- Linux之web服务
- 24V转5V的常规操作7812,7805,重要的是器件选型
- 电子书格式,ePub将是趋势
- MSCRM4.0显示图片格式附件
- 大数据的4v特征及思考_大数据智能下数据脱敏的思考
- Jmeter性能测试工具实现对数据库mysql进行连接并压测
- Nmap小技巧——探测大网络空间、局域网中的存活主机
- 在前端爬虫或者插件中,淘宝API/接口调用里签名算法sign是如何实现的?
热门文章
- 【赵强老师】使用mongo shell
- C/C++ 内存分配方式,堆区,栈区,new/delete/malloc/free
- 信号与系统(八)——卷积积分的应用
- lvds接口屏线安装图解_液晶显示器LVDS接口工作原理及改制方法
- 网站加速 四大免费CDN服务评测大PK
- 【Rust日报】 2019-04-22
- php 获取用户登录IP 及 IP归属地
- IP归属地API分享
- ChatGPT编程能力实证研究
- [转](1条消息) 使用echarts百度地图并更改地图样式(转载请删除括号里的内容)