如何来做一个三子棋游戏呢,首先老规矩先来做一个简易的菜单
下一步让这个菜单能够实现它的功能,选则 1 就开始游戏,选择 0 就退出游戏,不是 1 不是 0 那就是选错了提示选择错误。
创建一个变量 input 用来存放我们输入的数字,利用 do while (因为do while 循环最少可以循环一次,比较符合我们打印菜单的需求)循环来完成重复选择的实现,switch 多分支语句来进行判断。(建议到这的时候就可以测试一下了哦,可以为后期找BUG节省时间,如果要测试的话把 game() 函数换成 printf("开始游戏\n"): 就可以了)
好了现在我们菜单已经做好了开始做游戏内容,这里我们创建一个 game() 函数,创建一个字符的二维数组(因为要用字符的形式打印)代表我们的棋盘大小,这里的 ROW 和 COL 是全局变量,分别是行和列的意思。创建函数 InitBoard() 初始化棋盘把数组名和参数给它就行了。( 因为我这里是多文件编程,所以我放在头文件里了,不想多文件写的可以自行更改。)
这里我们用 for 循环创建 i 行 j 列,因为这里的棋盘不需要接收数值只需要创建好就行所以用void,这里用字符 '空格'来创建棋盘
虽然棋盘创建好了但是光是空格玩起来效果不好,所以我们优化一下棋盘,加上分割线。效果如下(技术有限有点简陋,见谅☺)
老样子用 for 循环创建 i 行 j 列的分各线,最终创建的分割线会多一条所以我们要减一行一列的分割线,为了让我们输入的字符在在中间我们要在棋盘上打印空格字符空格,这里我们创建 DispiayBoard() 函数来打印棋盘,一样的把数组名和棋盘参数传给函数就行
好了棋盘已经做好了,现在我们需要开始下棋了,创建一个函数 PlayerMove()来表示玩家下棋,这里我们下棋用坐标来完成,先两个变量 x , y 来代表横坐标和纵坐标,并且存放玩家输入的坐标,然后提示玩家下棋,因为我们在获胜或者棋盘结束之前要一直落子,所以我们这里用一个while 循环来重复下棋,提示玩家需要输入坐标中间要用空格分开,因为不是所有的玩家都是程序员,我们知道下标是从0开始的,但是有些人是不知道的,所以我们要符合大众群体,给玩家把坐标改成从1开始,然后设置两个限定条件,一、落子不能超过棋盘 二、不能在落过子的地方重复落子。这里我们用if 判断如果输入的坐标里放的是字符 ‘空格’ 那么我们就可以落子,这里我们用 * 来代表玩家的棋子,如果不是 ‘空格’ 那么就说明已经有棋子了,提示坐标被占用,如果超出了棋盘提示坐标越界。
下一步创建一个对手,让电脑来和我们下棋,创建一个函数ComputerMove() 代表电脑下的棋子,同样电脑也需要坐标来下棋 (x , y)提示这是电脑下的棋,一样的结束之前重复下棋,用while循环实现,给电脑一个随机数,这里用到函数rand()用srand ()把电脑的时间戳传给rand() ,生成的随机数要给它一个限制不能超过棋盘,就是 0~row-1 和 0~col-1,一样的条件,空格可以落子,不是就继续找直到找到空格,落完子后退出循环,电脑棋子就用 # 来表达(建议这里就可以测试一下了哦)
最后就是判断输赢了,假设玩家赢就返回 * 电脑赢了就返回 # 平局就返回 Q ,还没结束继续游戏就返回 C 来表示
下一步创建一个字符变量接收判断后返回的字符
我们这里创建一个函数IsWin()用来判断谁赢,还是平局因为玩家和电脑下完都需要判断,所以两个都要用函数返回的值来对比一下,如果不等于我们的字符C那么就说明游戏结束了,那么就开始判断,根据前面的假设,如果是字符*那么玩家赢,是字符#就是电脑赢,最后只剩下字符Q那么就是平局。
好了逻辑整理好了,开始实现函数IsWin(),先判断 行我们用for循环来判断棋盘的行,如果这一行里字符相同,并且不是空格,那么这一行里是谁的棋子就返回谁的字符( * 或者 # ),除了行相同还有列,再用for循环来判断棋盘的列,如果一列字符相同,并且不是空格,那么也一样返回这一列里是谁的棋子返回谁的字符( * 或者 # ),行和列判断完了就是对角线上的了,那么就是坐标中的第一行第一例,第二行第二列,第三行第三列这一条斜线。以及第一行第三列,第二行第二列,第三行第一列这一条斜线。(有没有大佬教我怎么把他们换成变量啊,嘿嘿)
平局需要在创建一个函数来判断IsFull()一样把数组名和棋盘参数传给他for循环在棋盘上找字符空格,如果有那么就继续,没有了就返回 1。如果函数lsFull()返回 1 那么就返回字符Q代表平局。如果都不是就把字符C返回去继续游戏。
最后附上完整代码,分别是头文件,游戏实现,游戏框架(小白出没大家见谅)
标签:玩家,字符,游戏,创建,C语言,空格,三子,棋盘,函数 From: https://blog.51cto.com/u_16103543/6363075