当前位置:网站首页>三子棋的设计和代码
三子棋的设计和代码
2022-08-10 19:34:00 【str_lai】
目录
一、游戏设计思路
二、游戏设计步骤
1.菜单创建
2.棋盘的展现
3.棋盘的初始化
4.玩家下棋
5.电脑自动下棋
6.游戏胜负的判断
三、游戏运行状况
一、游戏设计思路
三子棋游戏代码多达200多条,我们在学习时,就不能一股脑地打下去,不然在后期我们极有可能面临这大量报错的局面。所以在设计游戏代码的时候,我们应该想好从哪里入手,先设计什么再设计什么。在这里我把游戏的设计分为三个层面,一是测试(text.c)、二是函数的声明(game.h)、三是函数的实现(game.c)。
二、游戏设计步骤
1.菜单创建
每个游戏开始的时候都有选择界面,让你选择退出或开始游戏,三子棋也不例外,接下来我们要在测试层实现菜单的创建。重要的是我们需要实现连续的玩,而不是只能玩一局。这样我们需要用到do......while循环。
代码如下:
void menu()
{
printf("****************************\n");
printf("******* 0·exit ********** \n");
printf("******* 1·play ********** \n");
printf("****************************\n");
}
int main()
{
int input = 0;
do
{
menu();
printf("请输入:>");
scanf("%d", &input);
switch (input)
{
case 0:
printf("退出游戏\n");
break;
case 1:
printf("三子棋\n");
break;
default:
printf("选择错误\n");
break;
}
} while (input);
return 0;
}
当然,菜单界面并不是唯一的,可以根据自己喜好设计。之后程序试运。
2.棋盘的展现
3*3棋盘对应着一个char类型的二维数组,我们定义一个函数display_board(board,3,3)。在定义的时候,函数当然不知道棋盘到底有多大,所以我们就需要“告诉”他有多大。但是,不排除我们之后做出更大的棋盘,超过了3*3,所以函数也得跟着改。为了一劳永逸,我们在game.h文件定义如下,
#define ROW 3
#define COL 3
之后只要在text.c用#include"game.h"包含下就可以根据之后的变动调整了。
void game()
{
char board[ROW][COL]={0};
display_board(board,ROW,COL)
}
而display_board函数,我们也需要在game.c层面进行声明,声明如下。
void display_board(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
//打印数据
//printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
int j = 0;
for (j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
if (j < col - 1)
printf("|");
}
printf("\n");
//打印分割信息
//printf("---|---|---\n");
if (i < row - 1)
{
int j = 0;
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
printf("|");
}
printf("\n");
}
}
}
3.棋盘的初始化
在上述代码运行后,我们会发现棋盘是歪的,没有对齐,接下来我们对棋盘进行美化。
现在text.c写上如下代码,之后在game.c进行声明。
void game()
{
char board[ROW][COL]={0};
InitBoard(board,ROW,COL);
display_board(board,ROW,COL);
}
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] = ' ';
}
}
}
棋盘展示:
4玩家下棋
接下来,我们需要在game.c层面实现玩家下棋的代码。
在这段代码中,有三点最重要的需要我们注意:
1.玩家落子需要在棋盘范围内。
2.玩家要在棋盘上空的地方落子。
3.如果输入的坐标不满足要重新输入。
结果如下:
5电脑自动下棋
在实现电脑随机落子的条件下,我们就需要注意以下几点:
1.要在主函数中使用srand((unsigned int)time(0))
将时间作为随机数种子,确保得到的行列坐标是真随机。
2.判断是否在棋盘上空的地方下棋
3.调用<stdlib.h>以及<time.h>头文件
代码如下:
void ComputerMove(char board[ROW][COL], int row, int col)
{
printf("电脑下棋:>\n");
int x = 0;
int y = 0;
while (1)
{
x = rand() % row;//0~2
y = rand() % col;//0~2
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
运行结果如下:
6游戏胜负的判断
每一局游戏的结束,我们都需要让电脑判断游戏胜负。在这里我们依然在game.c层面使用Iswin()函数来实现,用Isfull函数判断是否平局。在game.h层面声明函数。
int IsFull(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++)
{
if (board[i][j] == ' ')
{
return 0;
}
}
}
return 1;
}
char IsWin(char board[ROW][COL], int row, int col)
{
//行
int i = 0;
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
{
return board[i][1];//
}
}
//列
int j = 0;
for (j = 0; j < col; j++)
{
if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ')
{
return board[1][j];
}
}
//对角线
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
{
return board[1][1];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
{
return board[1][1];
}
//没有人赢,就要平局
if (IsFull(board, row, col))
{
return 'Q';
}
//游戏继续
return 'C';
}
三、游戏运行状况
边栏推荐
- whois信息收集&企业备案信息
- What is the upstream bandwidth and downstream bandwidth of the server?
- 【毕业设计】基于Stm32的智能疫情防控门禁系统 - 单片机 嵌入式 物联网
- 运维面试题(每日一题)
- Hangdian Multi-School Seven 1003-Counting Stickmen (Combination Mathematics)
- CMU博士论文 | 视频多模态学习:探索模型和任务复杂性
- 【SemiDrive源码分析】【MailBox核间通信】52 - DCF Notify 实现原理分析 及 代码实战
- ARouter使用自定义注解处理器,自动生成跳转Activity的代码,避免手动填写和管理path
- Pt/CeO2 monatomic nanoparticles enzyme | H - rGO - Pt @ Pd NPs enzyme | carbon nanotube load platinum nanoparticles peptide modified nano enzyme | leukemia antagonism FeOPtPEG composite nano enzyme
- 哈工大软件构造Lab3(2022)
猜你喜欢
The most complete GIS related software in history (CAD, FME, ArcGIS, ArcGISPro)
【自然语言处理】【向量表示】PairSupCon:用于句子表示的成对监督对比学习
铁蛋白-AHLL纳米颗粒|人表皮生长因子-铁蛋白重链亚基纳米粒子(EGF-5Cys-FTH1)|铁蛋白颗粒包载氯霉素Chloramphenicol-Ferritin
你不知道的浏览器页面渲染机制
spark学习笔记(九)——sparkSQL核心编程-DataFrame/DataSet/DF、DS、RDD三者之间的转换关系
从 Delta 2.0 开始聊聊我们需要怎样的数据湖
转铁蛋白Tf功能化β-榄香烯-雷公藤红素/紫杉醇PLGA纳米粒/雷公藤甲素脂质体(化学试剂)
- [email protected] NPs纳米酶|碳纳米管负载铂颗粒纳米酶|白血病拮抗多肽修饰的FeOPtPEG复合纳米酶"/>
Pt/CeO2单原子纳米酶|[email protected] NPs纳米酶|碳纳米管负载铂颗粒纳米酶|白血病拮抗多肽修饰的FeOPtPEG复合纳米酶
- [email prot"/>
Transferrin-modified osthole long-circulating liposomes/PEG-PLGA nanoparticles loaded with notoginsenoside R1 ([email prot
转铁蛋白修饰长春新碱-粉防己碱脂质体|转铁蛋白修饰共载紫杉醇和金雀异黄素脂质体(试剂)
随机推荐
Echart饼状图标注遮盖解决方案汇总
【SemiDrive源码分析】【MailBox核间通信】52 - DCF Notify 实现原理分析 及 代码实战
uni-app 数据上拉加载更多功能
【自然语言处理】【向量表示】PairSupCon:用于句子表示的成对监督对比学习
【greenDao】Cannot access ‘org.greenrobot.greendao.AbstractDaoSession‘ which is a supertype of
GBASE 8s 高可用RSS集群搭建
Modern Privacy-Preserving Record Linkage Techniques: An Overview论文总结
2022 Hangdian Multi-School Seven Black Magic (Sign-in)
巧用RoaringBitMap处理海量数据内存diff问题
力扣150-逆波兰表达式求值——栈实现
几行深度学习代码设计包含功能位点的候选免疫原、酶活性位点、蛋白结合蛋白、金属配位蛋白
leetcode 84.柱状图中最大的矩形 单调栈应用
(10) Sequence and deserialization of image data
TDD、FDD是什么意思?
What is the upstream bandwidth and downstream bandwidth of the server?
七月券商金工精选
keepalived:故障检测自动修复脚本
mysql----group by、where以及聚合函数需要注意事项
苹果字体查找
The 2021 ICPC Asia Shanghai Regional Programming Contest D、E