目录
前言
首先三子棋也可称为井字棋,是在一个9X9的格子里进行游戏的对弈。
那么首先需要对游戏的各个步骤进行一个梳理。不管任何一个游戏,首先得有菜单,第二步要进行一个菜单的选择,第三步要对游戏的内容进行实现:初始化棋盘,打印棋盘,玩家下棋,电脑下棋,判断输赢 这些都是游戏进行中必不可少的过程。
一、头文件
头文件的引用是必不可少的。
这里我用“define”定义了两个数字,他们是我即将实现的三子棋的行和列,这里为什么要用这种方式引用,而不是直接在创建数组的时候定义呢?因为下面图片的这种方式,在我不想将他设为三子棋的时候就可以只修改下面的两个数字即可实现五子棋或更多的类型,不用费劲心思的再去文件里面一个一个的找,再一个一个修改。这种既省时又省力还方便的操作谁会不爱呢?
二、主函数文件
这里我引用了头文件,就不用在每个文件里重复引用库函数啦。
主函数的文件里需要三个模块:
1.菜单
菜单的实现需要自定义一个函数,然后我们通过 “1或0”来选择是否开始玩游戏。
2.游戏内容
整个游戏的逻辑大概是
选择菜单,
进入游戏,游戏进入的时候对棋盘进行初始化,
打印棋盘在屏幕上,开始玩游戏,玩家先下棋(玩家的棋子为‘*’),电脑在下棋(电脑的棋子为‘#’),重复循环,直至有人赢了,或者棋盘下满了,双方打成平手,至此游戏结束。而后玩家在选择还要不要再继续玩。
3.主函数
主函数里需要对游戏的逻辑进行定义:
首先先要有菜单,菜单写好了以后,还需要进行选择来确定是否玩游戏。这里我们用switch语句来实现,选择1就开始游戏,选择0就退出游戏,如果玩家不选择“1或0”我们就认为他手滑或者点错了,然后对其进行提醒。这里用了“do while”循环,可以保证游戏至少进行一次。
三、游戏玩法(源文件)
当然源文件里也需要引用头文件
1、初始化棋盘
这里利用两个循环嵌套将二维数组“board”里的内容全部初始化为 “空格” ,下面图二红色圈住的就是棋盘啦,是不是方方正正的。
如果不对数组进行初始化的话,那么就会出现下图的情况。
2、打印棋盘
这里我们将整个棋盘进行划分,绿线可将棋盘分为三大块,这里想让棋盘看起来比较美观,所以第三块没有打印分割线,蓝线再对其细分,蓝色分为两块,一块是棋盘我们要输入的内容,一块是分割线,这里同样没有打印第三块的‘|’分割线。
3、玩家下棋
这里需要先提示玩家,然后玩家输入坐标,我们用x,y表示玩家输入的坐标。这里为什么是x-1,y-1,是因为玩家不是程序员,他不清楚数组存放是有下标的,且下标从0 开始,所以对其输入的坐标进行 “-1”。为了防止玩家手滑或者看错位置,有坐标重复输入的情况,也要对其进行提醒。
4、电脑下棋
或许这名玩家是个“社恐”,又不好意思邀请别人跟他一起玩,那么他就需要一个机器人和他进行对弈。这里我们对机器人进行一个简单的设定,让玩家可以轻而易举的打败机器人,从而获得成就感,后面在对机器人进行改造。
这里利用“rand”函数生成随机数,再用这个随机数取模得到的就是小于3的数,这样机器人就可以很好的输入棋盘里的坐标啦。
5、判断输赢
在判断输赢的函数里有这么几种情况:要么有人赢了,要么平局,如果前两个情况都没有发生那么游戏继续。
这里输赢的判断分三种:
1、三行中任意一行三个棋子是一样的。
2、三列中任意一列三个棋子是一样的。
3、两条对角线任意一条三个棋子是一样的。
这样无论是谁赢,直接返回那个棋子,谁的棋子就是谁胜利。
平局的话我就在外面重新写一个函数来实现,只要判断一下棋盘里没有空格,就说明棋盘被下满了。
这里需要对游戏进行启动,看看能不能运行。
视频
小修改
游戏运行起来啦,感觉还可以,不过测试的时候发现一点点小问题,就是如果坐标输入重复,会直接让电脑进行下一步,跳过玩家错误的那一步。下图是我进行一点小修改后的。
感谢观看