简单c语言实现三子棋/多子棋主要是想实现以下几个功能
(先做再循环)do while
一.目录: 1.play 0.exit
二.选择:(Switch)选择
三.进行游戏:
1.储存数据 - 二维数组
2.初始化棋盘 - 初始化时全输入空格
3.打印棋盘 - 本质是打印数组
4.玩家落子 -
①判断坐标合法性
②下棋
③判断是否占用
④展示棋盘
⑤判断输赢 - 四种游戏状态 - 玩家胜利,游戏胜利,平局(此时棋盘下满仍未分出胜负),游戏继续(棋盘未下满)
5.电脑落子
①随机坐标
②判断是否占用
③展示棋盘
④判断输赢
为分模块有效实现游戏,建立以下三个文件:
1.test.c 测试游戏的逻辑(主函数)
2.game.h 关于游戏相关的函数声明,符号声明,头文件包含
3.game.c 游戏相关函数的实现
一. 首先是菜单函数menu()的实现(test.c)
二. Switch选择(play or exit)(test.c)
玩家输入1,则开始游戏,输入0,则退出游戏,还应注意到除1,0之外,玩家还可能输入其他数字,此时应提示玩家输入错误重新输入
三. 进行游戏函数game()
1.储存数组 - 建立二维数组。
为使更改棋盘方便此时应在头文件内声明符号ROW(代表行),COL(代表列)。再在game函数中创建ROW x COL 的二维数组(game.h test.c)
2. 棋盘初始化 - 填入空格。
使用函数InitBoard(board,ROW,COL)(test.c)
此时我们在game.h中声明函数,
并在game.c中定义函数
3. 打印棋盘(DisplayBoard) - 本质打印数组内容 (test.c)
在game.h声明
在game.c中定义
我们希望的棋盘如下
其实质是由2row-1行,每行由2col-1列组成
行是 空格 board[i][j] 空格 | 空格 board[i][j] 空格 | 空格 board[i][j] 空格
_ _ _ | _ _ _ | _ _ _ 这两种形式构成的
列是由 空格 board[i][j] 空格和 | 和 _ _ _ 这三种形式构成
打印代码如下
4.玩家落子 - 自定玩家棋子为*,电脑棋子为#
①玩家落子
在主函数test.c使用落子函数PlayerMove(),我们需将数组,行和列的信息传送
在头文件game.h中声明落子函数
在game.c中定义落子函数
玩家落子有几个步骤
1.判断玩家输入的坐标是否在给定棋盘的范围内,若不是需重新输入
2.输入正确坐标后,需判断当前坐标是否被占用(也就是当前坐标内是否是空格)
3.若输入正确,坐标也未被占用将空格替换成玩家棋子*
具体代码如下
②展示棋盘(test.c)
③判断输赢
用来判断游戏的状态
// 1.玩家赢了 - *
// 2.电脑赢了 - #
// 3.平局 - Q
// 4.游戏继续 - C
此时我们需将判断输赢的函数返回的值存放起来,若返回值不为C,则说明游戏结束,此时跳出循环
跳出后比较返回值,判断游戏结果
对于判断输赢函数 IsWin();
我们先在主函数中将返回值赋给已定义的ret
在头文件game.h中声明
在game.c中定义
①.首先我们分析,若棋盘的任意一行或一列或一对角线所有元素相同(不论是*或是#),此时返回任意一个元素即可判断是玩家赢还是电脑赢
②.若①条件都不满足,只要棋盘被填满则说明平局,返回Q
③.若①②都不满足,则说明此时棋盘上仍有空位,且还未分出胜负,则游戏继续,返回C
①条件的代码如下
②和③的代码如下:定义变量ret=Q,若仍有空位,使ret=C,若无,不改变ret。最后返回ret。
5.电脑落子 - 棋子为#
①电脑落子函数ComputerMove()(text.c)
在主函数调用
在头文件game.h中声明
在game.c中定义
首先我们希望电脑能生成随机数,此时就需要使用rand()库函数,但由于rand()函数每次重开生成的数都是一样的,所以我们需要使用srand来Sets a random starting point.但若是给srand()空格内用一个固定的数,从而得到的数也都是固定的,我们就在srand内使用time函数,从而使每次的数值都随机。(且srand不能在game函数内,否则每次初始的时间太短,会导致rand()数值相近,所以一般将其放在主函数)
srand函数的信息如下
rand函数信息如下
time函数信息如下
具体操作代码如下
(test.c)
(game.c)
②展示棋盘
③判断输赢
最后按逻辑组装所有函数
<test.c>
<game.h>
<game.c>
有问题可以评论或者私信,如果有帮助到你,希望可以留下一个赞鼓励鼓励我,大家一起进步吧!