主要需求
因为项目较为简单不写需求文档了(doge)
几个关键类
人物下棋类,分为玩家类和电脑类分别有不同的功能,比如玩家可以悔棋,电脑寻找下棋位置等
判断类,判断输赢,判断位置是否合法等
绘制类,绘制菜单,绘制棋盘等
功能重难点
实现电脑玩家类的自动寻找合适位置的功能
实现玩家的悔棋功能
判断输赢
基本框架
棋盘用一个二维数组来表示,通过对棋盘行列标号用键盘输入的坐标表示要下棋的位置
用到的几个关键类每个类创建自己的头文件源文件
游戏类内可以封装出下棋,悔棋方法,悔棋创建的栈,胜负变量可以作为成员变量
判断类内可以封装判断输赢和判断越界两个函数
棋盘类内可以封装展示菜单,展示棋盘两个函数
用一个Game文件来将这些类方法和变量组合起来实现游戏的基本逻辑
游戏逻辑
玩家选择模式,初始化棋盘为空
玩家或者电脑交替下棋,每一次下棋后先判断下棋位置是否合法,合法后判断输赢,没有决出胜负就将棋盘对应位置改为自己的棋子,可以用do...while循环来实现这个逻辑
每次有一方下完棋后绘制出下过棋后的棋盘展示出来
如果想要悔棋就在下完棋后调用悔棋函数,悔棋需要两方都回退一步
方法实现
判断输赢
从头遍历整个棋盘会导致时空消耗过大,因为五子棋获胜的时侯连成的五个棋子肯定包括最后下的那个棋,所以我们可以直接判断每个棋子行,列,主对角线,副对角线上是否一共有五颗相同的棋子
悔棋实现
我选择主要通过栈stack来实现,创建一个pair对组每次输入一个坐标将其压入栈中,要悔棋时只需要从栈头弹出最近入栈的数据即可,我设置的是可以无限悔棋,想要实现限定数量悔棋可以增加一个变量来统计悔棋数,达到一定数量不能悔棋即可。
电脑AI
五子棋没有研究过棋谱,刚开始想的是可以设置srand函数在整个棋盘上随机下,但是这样会很呆,又想可以遍历玩家下棋的周围格子,在离玩家棋子最近的几个空格位置随机选取一个下棋,再后来参考了几个其他的五子棋项目用了一种对棋盘上每个位置计分然后遍历找到分数最大的也就是最优位置下棋的方法,但是这样只能判断一层并没有前瞻性,不能预判接下来风云变幻,不过更高级的算法暂时不研究了(QAQ)。