Skip to content

黑白棋

游戏规则

玩家数目:两人(分为黑白双方)

游戏将在 8 行 8 列的棋盘上进行,其中行列编号均为 0~7,约定使用 (x, y) 表示第 x 行第 y 列。

游戏开始前,(3, 3) 和 (4, 4) 各有一个白色棋子, (3, 4) 和 (4, 3) 各有一个黑色棋子。

游戏开始后,黑方先走子,白方后走子,然后双方轮流走子。

玩家在自己的回合内需要选择一个空位置,放置自己颜色的棋子,并至少翻转一个对方的棋子. 棋盘上没有空位置或者不能翻转对方的棋子时,游戏结束,此时棋盘上黑色棋子多则黑方胜利,白色棋子多则白方胜利,一样多则平局.

翻转对方棋子的含义为: 在位置 A 放置一个新棋子,且位置 B 已经有一个己方棋子,如果位置 A, B 在同一行/列/对角线,且 A, B 之间没有空位置,且 A, B 之间至少有一个对方棋子,那么可以将 A, B 之间的对方棋子全部「翻转」为己方棋子.。

如果位置 A 周围不同方向的棋子都可以翻转, 那么它们都会被同时翻转。

AI 编写说明

Python 版

黑白棋提供了 Python 版本的 AI SDK,用户需要在 main.py 中实现一个 player_ai(board, player, logic) 函数, 根据当前棋盘状态返回下一步走子操作 (x, y)。

boardint 类型的列表, 长度为 64,从上到下,从左到右依次表示棋盘每个格子,0 代表黑棋子, 1 代表白棋子,2 代表空格子,player 表示当前玩家,

logic 用于调用游戏逻辑的 API, 支持的操作有:

  • logic.get_id(x, y):获取 (x, y) 点在长度为 64 的 Board List 里的下标
  • logic.ask_next_pos(board, player): 参数为长度为 64 描述棋盘的 Board List 和描述当前落子方的 Player,返回值为长度为 64 的 list,list 中数字 1 代表可以落子, 数字 0 代表不可落子

C++ 版

黑白棋提供了 C++ 版本的 AI SDK,用户需要在 main.cpp 中实现一个 getNext(int* board_init, int& nxt_x, int& nxt_y, const int& player_now) 函数,根据当前棋盘状态返回下一步走子操作 (nxt_x, nxt_y)

board_init 为一个 int 数组,长度为 64,从上到下,从左到右依次表示棋盘每个格子,0 代表黑棋子, 1 代表白棋子,2 代表空格子。

player_now 表示当前玩家,0 为白方,1 为黑方。

作出的决策应保存在 nxt_xnxt_y 中,分别存放 x 和 y 坐标。

你还可以调用这些函数:

  • int getIndex(int i, int j):获取 (i, j) 点在长度为 64 的 board 数组中的下标
  • bool checkIn(int i, int j):判断 (i, j) 是否在允许的范围内
  • void printBoard(int* board):打印当前棋盘,用于调试

如何调试

AI需要通过stderr标准错误流来输出自己的调试信息,具体操作方式如下:

Python

sys.stderr.write(msg)

C++

std::cerr << msg;

播放器使用说明

黑白棋提供了 html5 版本的播放器,可以支持观看回放和在线游戏。

在网站上点击对局的录像文件, 会使用播放器进行回放,可以自动播放或者手动逐步观看。

人类玩家可以通过房间系统加入黑白棋游戏,用户可以播放器进行游玩,每一回合播放器会标记可下的位置,用户通过鼠标点击落子。