当前位置:网站首页>三子棋游戏的实现
三子棋游戏的实现
2022-07-20 05:53:00 【终成大师的康康】
序言:
想成为大师的康康最近想玩游戏,于是用c语言代码敲了个三子棋供自己娱乐消遣。虽在创作的过程中遇到了许多细节上的问题导致运行并没有那么成功,但康康意志坚定,鏖战了几小时终于创作成功!接下来是康康的心得体会,满满的干货喔~~~ 话不多说进入正题,教会大家如何用c语言代码实现三子棋游戏。
第一步:整体架构设计出来
在实现目标之前,先思考我们写代码的目的是什么,再思考如何去实现它。我们需要实现的是一款游戏,所以菜单一定要有!!!让玩家选择是玩游戏还是退出游戏,整体构架先设计出来。
void menu()
{
printf("*********************\n");
printf("*******1.play********\n");
printf("*******0.exit********\n");
printf("*********************\n");
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:\n");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误请重新选择\n");
}
} while (input);
return 0;
}
运用swtich语句为用户提供选择,如果用户这时输入1,这时自动会进入game(). 如果用户输入0,由于这是个do while 循环语句,这时会跳出循环语句。接下来我们就来实现game()函数。
第二步:创作游戏过程梳理好
创作三子棋的过程如下:.创作一个棋盘——> 初始化棋盘——> 打印棋盘 ——>人机交替下棋——>判断输赢。过程梳理好并清楚的知道实现的步骤就成功了一半!
第三步:进行代码实现
整理好思路,我们就需要进行代码的实现,在实现的过程中需要用一定的逻辑思维判断处理三子棋中一些复杂的问题,不过不着急我为大家细分开来为大家娓娓道来。
我们需要的是一个3*3大小的棋盘,它其实就是一个二维数组加工得来,首先先确定行列的大小。
#define ROW 3
#define COL 3
char board[ROW][COL] = { 0 };
以上是我们棋盘的本质,接下来进行棋盘的初始化,需创建一个InitBoard函数来进行。
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] = ' ';
}
}
}
将棋盘初始化成空格的目的是为了在接下来打印棋盘的时候能够很好的对齐,展现出一个方方正正的棋盘。接下来我们利用PrintBoard函数来进行棋盘的打印。
void DisplayBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
//先打印一行
int j = 0;
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 < col; j++)
{
printf("---");
if (j < col - 1)
{
printf("|");
}
}
printf("\n");
}
}
}
一下是代码实现以后的效果图:
代码中row-1和col-1目的是去除棋盘中多余的竖线和分割线,由图可知最下面没有分割线,所以我们需要用row-1来限制行数的打印;在最右侧没有竖线,所以我们用col-1来限制列数的打印。
棋盘打印好了之后就需要人和机器交互下棋,所以先创建PlayerMove函数和ComputerMove函数分别表示玩家和机器,由于要不停的下,用while循环代码如下:
while (1)
{
PlayerMove(board,ROW,COL);
DisplayBoard(board, ROW, COL);
ComputerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
}
函数创建好了之后我们进行函数的实现:
void PlayerMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("请玩家输入坐标\n");
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");
}
}
}
void ComputerMove(char board[ROW][COL], int row, int col)
{
printf("电脑下棋\n");
int x = 0;
int y = 0;
while (1)
{
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
电脑下棋的时候由于位置是随机的所以我们需要用rand函数来随机它下棋的坐标。康康在这个地方栽了个跟头,他在while循换外进行了rand函数的调用,导致代码运行过程中机器会在第三次下棋的时候停止下棋,所以一定要在while循环中使用rand函数!
下棋不是你输就是我赢,所以我们要在下棋的过程中需要判断输赢,使用CheckWin函数判断:
while (1)
{
//玩家赢 '*'
//电脑赢 '#'
//平局 'a'
//继续 'c'
PlayerMove(board,ROW,COL);
ret=CheckWin(board, ROW, COL);
if (ret != 'c')
{
break;
}
DisplayBoard(board, ROW, COL);
ComputerMove(board, ROW, COL);
ret=CheckWin(board, ROW, COL);
if (ret != 'c')
{
break;
}
DisplayBoard(board, ROW, COL);
}
if (ret == '*')
{
printf("玩家赢\n");
}
else if (ret =='#')
{
printf("电脑赢\n");
}
else if (ret == 'a')
{
printf("双方平局\n");
}
DisplayBoard(board, ROW, COL);
}
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 CheckWin(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][0] != ' ')
{
return board[i][0];
}
}
//列相同
int j = 0;
for (j = 0; j < col; j++)
{
if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[0][j] != ' ')
{
return board[0][j];
}
}
//对角线相同
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
{
return board[0][0];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[2][0] != ' ')
{
return board[0][2];
}
if (IsFull == 1)
{
return 'a';
}
return 'c';
}
判断分为:玩家赢,电脑赢,平局和游戏继续。当判断要求不满足前面三个任何一个时,游戏继续while循环也不停下,知道出现前面三个情况的任何一种,游戏便结束。我们将CheckWin的返回值用char ret来存储。先预算好4个判断的结果用什么ret值来返回!!!玩家和电脑赢的情况都是行或列或对角线的元素一样。平局就是没有空余地方给我们下棋了,这时再用一个IsFull判断。
到目前为止代码就写完了,让我们运行起来看看成果吧!
边栏推荐
- C语言程序设计技巧之字符串长度
- IF:4+ 铁代谢和免疫相关基因标记预测三阴性乳腺癌的临床结局和分子特征
- Game improvement of smart people: Chapter 3 Lesson 1: ISBN (ISBN code)
- DNA 8. 癌症的突变异质性及寻找新的癌症驱动基因(MutSigCV)
- C语言基本概念——每天一遍小知识
- IF:14+ “冒烟型”骨髓瘤的分子组成突显了导致多发性骨髓瘤的进化途径
- Fun guessing game (not binary search!)
- ES6新增重点
- Three handshakes and four disconnects in TCP
- 一文看懂:零代码、0代码、无代码平台是什么?怎么选?
猜你喜欢
SDL practice in agile development mode
Ensp-nat comprehensive experiment
目录和文件管理
Achievement report of Tiantan computer room project
超全干货:数据可视化的设计总结,工具,技术要点统统都有
Super dry goods: design summary, tools and technical points of data visualization are all available
FigDraw 12. SCI 文章绘图之相关性矩阵图(Correlation Matrix)
Progress report of Zhongguancun Software Park Project
静态路由的配置,实现全网可达
DNA 6. 基因组变异之绘制精美瀑布图(ComplexHeatmap)
随机推荐
Configuration of static routes to achieve network wide accessibility
学会如何选择图表类型,小白也能玩转数据分析
Database notes
The difference between TCP and UDP
VRRP Virtual Router Redundancy Protocol
一文看懂:零代码、0代码、无代码平台是什么?怎么选?
如何合并多个工作表或多个工作簿?3种合并方法都在这
网络安全架构:安全架构公理
Become a blogger in a year? To! Struggling oneself
C語言基本概念——每天一遍小知識
FigDraw 12. SCI 文章绘图之相关性矩阵图(Correlation Matrix)
Operation skills of markdown in jupyter
Writing greedy snake with C language array
Flower of reverse analysis instruction 2
JS笔试题--原型,new,this综合题
Static routing - Comprehensive Experiment
持续更新文章I‘m back
MySQL installation
SCS【1】今天开启单细胞之旅,述说单细胞测序的前世今生
动态路由协议—RIP实验