01 - 人机博弈算法简述
前面详细介绍了棋盘类的封装、棋子类的封装以及各种类型的棋子的走棋算法的实现。有了前面的铺垫,就能迈出电脑智能下棋的第一步了。
电脑要实现人机博弈下棋对战分3步走:
(1)电脑获取棋子所有走得通的路径;
(2)从棋子所有能走的路径中计算出对电脑最优路径;
(3)电脑实现走棋。
02 - 相关成员与方法
编写代码前,预先看看增加了哪些类和成员。新建一个QVector容器,用于保存棋子属性信息,方便计算对电脑最优路径,具体内容如下:
#ifndef STEP_H
#define STEP_H
#include <QObject>
class Step : public QObject
{
Q_OBJECT
public:
int moveID; //行走棋子的ID
int killID; //杀掉棋子的ID
int rowFrom; //起始行坐标
int colFrom; //起始列坐标
int rowTo; //目标位置行坐标
int colTo; //目标位置列坐标
signals:
public slots:
};
#endif // STEP_H
同时在Chessarea.h里面添加电脑实现人机博弈下棋相关方法和槽函数:
// 获取所有走棋路径存放到steps中
void getAllPossibleMove(QVector<Step *>& steps);
void fakeMove(Step* step); // 棋子假装走一步
void unfakeMove(Step* step); // 棋子假装走的那一步挪回来
Step* getBestMove(); // 获取最佳走棋路径
int calcScore(); // 评估局面分
private slots:
void computerMove(bool run); // 电脑走棋
//在widget构造函数上实现信号与槽()
connect(chessarea