前言
上一篇文章已经有了蒙特卡洛树搜索算法了,再加上五子棋的局面状态的话,基本就是一个简单的 AI 了。这篇文章主要介绍如何实现局面状态。
局面状态
根据五子棋的玩法,局面状态应该包含如下数据:
- 当前行棋方
- 当前局面是否终结
- 获胜玩家
- 棋子位置
对于行棋方的表示,我采用 1 表示黑方,-1 表示白方,这样我就可以使用 player = -player 来交换行棋方(有点符合直觉的味道);局面是否终结自然是一个 bool 值;获胜玩家同行棋方一样,1 表示黑方获胜,-1 表示白方获胜,0 表示平局或者未终局(视局面终结状态而定);对于棋子位置,前采用了两个 std::bitset 来分别表示黑子和白子的位置。不采用字节数组表示棋盘状态是为了节省一点内存,而且根据要解决的问题,采用 bitset 也还不错。于是棋盘状态数据结构看起来如下:
class gomoku_state_t {
private:
std::bitset<16*15> _black;
std::bitset<16*15> _white;
int _turn;
int _winner;
bool _gameover;
};
bitset 大小设置为 16*15 是为了方便把 xy 坐标变换为索引,这里棋盘的大小为 15x15。
局面状态有了之后,接下来就是添加必要的接口了,清单如下:
class gomoku_state_t {
public:
typedef move_t action_type;
void put_black(int x, int y);
void put_white(int x, int y);
void set_turn(int player);
void pla
五子棋AI实战

最低0.47元/天 解锁文章
8794





