C++ 实现对战AI五子棋
前言:
为了能够快速上手一门语言,我们往往在学习了基本语法后,采用写一个小项目的方式来加深理解语言的语法及运用,本文采用c++去实现对战AI五子棋,采用面向对象开发的一款游戏,里面应用了类和对象以及vector容器等知识。
一、项目效果展示
二、游戏思路
三、游戏框架
我们这里创建四个类(可以简单的理解为加强版的结构体),玩家类、AI类、棋盘类、棋盘控制类,将玩家类、AI类、棋盘类作为参数传给棋盘控制类,棋盘控制类获取这三个类的信息,从而可以控制游戏的运行,而玩家和AI要进行下棋操作时,需要棋盘信息,所以在玩家和AI类设置棋盘类。
根据上面分析,我们搭建好框架,先实现棋盘类功能,再实现AI和玩家类,最后实现棋盘控制类
四、棋盘类实现
4.1 用棋盘类构造函数初始化
4.1.1 checkerboard.h
4.2 棋盘类初始化函数
注:
这个初始化函数和棋盘类构造函数的初始化一样,为什么再初始化一次呢?因为我们后面进行游戏运行时,一局结束,再来一局还需要再调用一次棋盘初始化,而定义棋盘类只能调用一次构造函数,所以再创一个棋盘类初始化函数
4.3 检查鼠标点击是否有效
注:
虽然代码很长,但是思路很简单,先计算点击位置(x,y) 附近的4个落棋位置的实际坐标位置,然后再计算点击位置到这四个落棋位置之间的距离,如果落棋位置与点击位置距离小于棋子大小的0.4倍,就认为这个落棋位置是玩家想要落棋的位置,存储在pos中。若此时该位置没有其他棋子,则为有效点击,返回真。
4.3.1 checkerboard.h
4.4 下棋
功能:实现记录最后一次落子的位置以及最后一次下棋是玩家方还是AI方,在棋盘二维数组记录落子数据。
4.4.1 checkerboard.h
4.5 判断棋盘是否下满
4.5.1 checkerboard.h
4.5.2 checkerboard.cpp
五、玩家类实现
5.1 用玩家类构造函数初始化
5.1.1 chess_player.h
5.2 玩家下棋
5.2.1 chess_player.h
六、AI类实现
6.1 用AI类构造函数初始化
6.1.1 AI.h
6.2 AI计算权值最高的棋盘空白位置
计算棋盘空白位置的权值,首先对该位置的横、竖、上斜、下斜四个方位做判断,以该位置为起点,每个方位只需要在单方向上判断4个棋子位,反方向判断四个棋子位,统计连续的白子或者黑子个数,根据下面的表格给出相应权重值,选择出累计权值最高的位置为AI落子点。
七、主函数