五子棋AI - 局面状态

五子棋AI实战

前言

 

上一篇文章已经有了蒙特卡洛树搜索算法了,再加上五子棋的局面状态的话,基本就是一个简单的 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
评论 13
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值