【C语言】升级版三子棋小游戏:美化棋盘界面并增加动画演示
文章目录
- 游戏效果
- 代码规划
- 创建代码
- 游戏搭建
- 主函数
- 游戏game函数
- 菜单menu函数
- 初始化棋盘InitBoard函数
- 打印棋盘DisplayBoard函数
- 玩家下棋Player函数
- 电脑下棋Computer函数
- 判断输赢IsWin函数
- 完整代码
- test.c
- game.c
- game.h
- 动画演示
游戏效果
三子棋,顾名思义就是:有一个三行三列的棋盘,然后玩家和电脑各自下棋。
游戏的运行如下:
- 有一个3 x 3的一个棋盘
- 玩家下棋用
*
表示 - 电脑下棋用
#
表示 - 下棋方式就是输入棋盘的坐标
代码规划
因为这是一个小游戏,涉及到游戏的代码比较多,不是几十行就能搞定的,所以我不可能全部写在一个test.c
的文件里面去;
这里规划一下代码存放,创建三个文件:
-
test.c
:游戏的测试逻辑 -
game.c
:游戏的实现逻辑 -
game.h
:游戏实现函数的声明
创建代码
这里使用的是VS2019
设置一下布局
游戏搭建
任何一个项目的实现,最重要的就是逻辑结构搭建,而各个功能的实现就是采取函数(模块化)进行细分;
所以我们需要搭建逻辑,那么逻辑结构是啥呢?
往下看????
主函数
- 运行游戏的时候,内容显示为:1.开始游戏;0.退出游戏;输入其他数字提示:输入错误,请重新输入!
- 按1开始游戏
- 按0退出游戏
int main() { srand((unsigned int)time(NULL)); int input = 0; do { menu(); printf("请选择:> "); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("退出游戏\n"); break; default: printf("输入错误,请重新输入\n"); break; } } while (input); return 0; }
游戏game函数
前面的逻辑结构已经搭建,而我们需要实现的就是game()
函数模块
那game()
函数实现的功能是什么呢?
- 首先是数据存储到一个字符的二维数组中,数组的内容应该全部都是空格;
- 使用
InitBoard()
函数,初始化棋盘; - 使用
DisplayBoard()
函数,打印棋盘(3x3); - 玩家和电脑的对战模块,也就是:玩家下棋
Player()
函数和电脑下棋Compuer()
函数; - 每一局对战后,都要判断电脑或玩家是否赢,所以需要一个判断输赢的
IsWin()
;函数;
void game() { char board[ROW][COL] = {0}; InitBoard(board, ROW, COL);//初始化棋盘 DisplayBoard(board, ROW, COL);//打印棋盘 int ret = 0; while (1) { Player(board, ROW, COL);//玩家下棋 ret = IsWin(board, ROW, COL); if (ret != 'C') { break; } Computer(board, ROW, COL);//电脑下棋 ret = IsWin(board, ROW, COL); if (ret != 'C') { break; } } if (ret == '*') { printf("恭喜您取得胜利!!!!!!!!!\n\n"); } else if (ret == '#') { printf("你也太辣鸡了吧,电脑都下不赢\n"); } else { printf("哎~~,你的技术不行啊,居然和电脑达成平手\n"); } }
菜单menu函数
菜单功能十分简单
代码示例如下:
void menu() { printf("************************\n"); printf("****EDC's Game World****\n"); printf("****** 1.Play ******\n"); printf("****** 0.Exit ******\n"); printf("************************\n"); }
初始化棋盘InitBoard函数
既然是初始化函数,说明我们的要求就是把二维数组board
初始化为全空格
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] = ' '; //赋予空格 } } }
打印棋盘DisplayBoard函数
首先我们来设计一个棋盘,如下:
首先,看这个棋盘,是由带+
的四行行,加上带|
的四行组成
先来看看一组规则:斜杠+空格+空格+空格
再来看一组规则:+---+
最后因为我们下棋落子的地方在中间,也就是我红色标记的地方;
该地方需要用字符来输入,也就是用%c
打印
代码如下:
void DisplayBoard(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; for (i = 0; i < row; i++) { printf("+---+---+---+\n");//打印带+号的边界 for (j = 0; j < col; j++) { printf("| %c ", board[i][j]);打印+号下面的内容 } printf("|\n");//补上 最右边界 } printf("+---+---+---+\n");//补最下面的+号边界 }
玩家下棋Player函数
玩家下棋采用的是坐标输入的方式;
玩家输入一个坐标,那么棋盘上的相应位置就应该用*
表示;
输入坐标时候还要检验该位置是否已经落子了;
void Player(char board[ROW][COL], int row, int col) { printf("请分别输入横纵坐标(输入数字请用空格隔开):> "); int x = 0; int y = 0; while (1) { scanf("%d %d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col)//边界必须合格,且该地方无子 { if (board[x-1][y-1] == ' ') {下一篇: 翻新经典:重温2048小游戏中的成长之旅