在拥有了 GUI 以后, 我们就可以专心研究其他的部分, 比如加入音乐, 比如加入 AI, 比如网络对战等. 本文只讨论加入 AI 接口一事, AI 的实现算法不做讨论. 现在我们主要面对的还是代码.
给出我的设计思路, 抛砖引玉尔.
AI 和 GUI 之间使用 BOARD 类作为媒介, 该类保存了棋盘状态, 并且提供棋盘的操作函数, 还有一个独立的判断输赢的函数. 之前还定义了一个 SearchArea 类用于 AI 减小查找面积. 我们来看代码:
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <iomanip>
#include <climits>
#include <ctime>
#include <conio.h>
#include <windows.h>
using namespace std;
#ifndef BOARD_H
#define BOARD_H
//define constant varibles refer to the playerNo
#ifndef PLAYER
const int PLAYER1=1;
const int PLAYER2=2;
const int EMPTYPLAYER=0;//no stone on the position
#endif
struct SearchArea
{
int top, left, right, bottom;
int exTop, exLeft, exRight, exBottom;//extended area
SearchArea(){top=1,left=1,right=1,bottom=1;}
SearchArea(int t, int l, int r, int b){top=t,left=l,right=r,bottom=b;}
void extendArea(int inc, int height, int width);//extends the search are by inc
};
class BOARD
{
public:
int width;
int height;
int counter_Player1;
int counter_Player2;
int counter_EmptyPos;
SearchArea searchArea;
char *board;//stores the board matrix into a linear structor
BOARD();//default constructor
BOARD(int w, int h);//constructor with w and h
BOARD(const BOARD& b);//copy constructor
~BOARD();//destructor
char operator ()(int x = 15, int y = 15);//return the value on board[x,y](x,y start from 1)
void move(int x, int y, int playerNo);//put a stone into the board, 0 for legal while -1 for illegal move
};
//judge the winner
bool isWinned(BOARD & board, int x, int y, int player);
#endif
代码中变量名比较长, 但是很容易理解就不给详细注释了. 接下来看一看这个 SearchArea 是怎么工作的.
途中红色线是棋子组成的方框的四个边, 蓝色框子是用于搜索的 Extended Area, 图示中增量为 1. 显然搜索蓝色框速度比搜索整个棋盘快很多, 因为五子棋和围棋不同, 不需要考虑完全孤立的地区, 那些地方放置的棋子难以形成有效杀伤.
BOARD 的定义和操作部分文件打包后提供下载.
既然前文说了 BOARD 类是 GUI 和 AI 的桥梁, 那么我们可以这样设计 AI 接口:
void computerMove(BOARD& board, int playerToBeEvaluated, int& row, int& col);
其中 playerToBeEvalua