简易三子棋的实现流程
对于三子棋的玩法我相信大家都很熟悉,但是如果要你写一个三子棋的游戏代码,你又是如何去思考呢,那么笔者就对于简易三子棋的实现流程以及在开始写三子棋代码之前需要思考的问题做一下论述:
1、对于三子棋的实现,我们必须得有菜单供玩家选择:
看到这里,也许读者会有些疑问,为什么要选择do{}while;循环以及switch语句的使用,首先在写代码之前我认为玩家打开游戏可能不知玩一局,所以我选择循环语句来控制,对于选择do{}while();循环而不选择while循环原因是do{}while();能够使玩家一开始能够进行判断自己是否要选择玩游戏,而while循环不能够实现多次输入判断,因为while循环是先判断后进入循环,这样的话我们的scanf()就得在循环外面,就做不到多次输入的结果,其次对于选择switch语句的原因是,玩家通过选择自己是否玩游戏进入不同的case 语句,大大优化了代码量,提高了代码的可读性,再就是如果玩家选择0的话,0又是do{}while();循环的判断条件,对于循环来说非零就会进入循环,如果玩家输入0的话,循环结束游戏退出。
2、当玩家选择玩游戏时,我们将要实现对于三子棋游戏内部的实现。
(1)对于三子棋游戏,笔者选择3*3的棋盘,以及二维数组来实现棋子的初始化。
对于二维数组,我们必须要让数组里面的内容全为空格,这样我们后面打印棋盘的时候能够防止数组内容影响棋盘界面。
这里的ROW以及COL是笔者定义的宏变量,并且宏的定义为都统一放在头文件中,这样在以后需要用到的地方我只要在.c文件的最上面引一次头文件即可。
(2)当初始化数组之后,我们就需要将整个棋盘的框架打印出来,
这是整个打印棋盘的代码实现流程,并且打印出来的效果如下图所示
对于如何打印棋盘,笔者是这样思考的,我们将空格+%c+空格以及—+|----|—为一组,这样恰好为三组对于最后一列没有|以及最后一行没有—我们只需增加限制条件即可。
(3)当打印完整个棋盘之后,我们就要开始实现玩家移动以及电脑移动的代码实现了。这里笔者写的是玩家先走,在写玩家移动的过程,我们必须思考一些问题:1、我们必须抱着我们输入的坐标那里之前是空格,如果不是空格我们必须要提示玩家,让玩家重新输入坐标,因此这里我们选择循环语句来控制玩家移动过程。
当实现完玩家走的代码的时候我们,将棋盘再次打印出来让玩家知道自己下的坐标。
之后我们就开始实现电脑下棋的过程,在实现电脑下棋的过程中,笔者选择利用rand以及srand来生成随机数,rand是生成随机数的库函数,我选择用时间戳来控制生成随机数的起点,由于我们随机数的范围是0-rand_max之间,所以我用rand%3来控制生成的随机数在0-2之间,这样我们的数组刚好是0-2,也就完成了坐标的实现,当完成坐标的实现过后,我们需要利用循环来判断随机坐标的合法性,如果生成的随机坐标已经被玩家占用,我们就再一次让电脑生成随机坐标,当发现生成的坐标中二维数组的内容为’ ',我们就让电脑将他改写为#.
(4)当完成玩家移动和电脑移动代码实现过后,我们就要判断是否输赢。我们必须在每一次电脑下完棋和玩家下完棋后就得判断一次输赢,如果当前棋子不满足输赢或者平局,我们将继续下棋,如果满足我们将跳出玩家与电脑下棋的循环。
对于33这样简易的三子棋判断输赢的方法,也就是行三列,竖三行,以及对角线是否有三个相同的棋子即可,因此笔者的这一串代码仅仅适用于33的三子棋,其他规格的三子棋不适用,所以也有漏洞还请包涵。
写完输赢,也同样存在平局的情况,因此我们需判断是否是平局
我们利用ret来接受返回值,如果返回的是*则为玩家赢,如果返回的是#则为电脑赢,如果是C则游戏继续,如果为Q则为平局,在每一次判断完输赢过后我们用ret来接受IsWin的返回值
当返回值不为C时我们将会跳出循环来判断返回值是什么,从而确定谁赢以及平局的情况
总结:以上代码就是对于简易三子棋的整个代码实现过程,写的比较粗糙,还请多多包涵,如果笔者有哪里写的不好,也可以评论区指点出来,让笔者也能有所收获,感谢读者的阅读!