1 个不稳定版本

0.1.0 2022 年 2 月 25 日

#474 in 游戏

GPL-3.0-or-later

79KB
1.5K SLoC

hexgame

这是一个 Hex 策略棋的简单高效实现。

虽然它主要是为了在 Hex 的蒙特卡洛树搜索机器人中使用而编写的,但它旨在成为 Hex 的一般用途库。

特性

  • 游戏规则(没有交换规则,见下文),
  • 序列化/反序列化到/从 JSON,
  • 一些分析函数,这些函数在编写机器人时可能很有用: get_neighborsget_empty_cellsfind_attacked_bridges。更多信息请参阅 Board 结构。

Hex 游戏

Hex 的规则非常简单:Hex 由两个玩家(黑和白)在六边形棋盘上玩。大小是可变的,典型的大小是 11x11 或 19x19。黑棋开始,玩家轮流将他们颜色的石头放在空位上。黑棋的任务是连接顶部和底部边缘。白棋需要连接左右边缘。第一个连接其边缘的玩家赢得游戏。

在以下示例中,黑棋(●)在连接顶部边缘到底部边缘后赢得了游戏。

 a  b  c  d  e
1\.  .  .  ○  ●\1
 2\.  .  ○  ●  .\2
  3\.  .  ●  ●  .\3
   4\.  .  ○  ●  .\4
    5\.  ○  ●  ○  .\5
       a  b  c  d  e

Hex 由 1940 年代的 Piet Hein 和 John Nash 独立发明。有关更多信息,请参阅 维基百科 页面。

交换规则

作为先手玩家,黑棋有很大的优势。在现实游戏中,这种优势通过所谓的交换规则来规避:黑棋放置第一颗石头后,第二位玩家可以选择继续正常游戏或交换颜色。

这个库尚未实现交换规则,主要是因为它对使用此库进行 MCTS 研究来说并不是必要的。

如何使用此库

最重要的结构是 Game。要玩游戏,还需要 Coords。游戏会自动跟踪当前玩家。

use hexgame::{Coords, Game};

let mut game = Game::new(19); // size of the board

game.play(Coords::new(3, 5));  // (row, column) and zero-based, i.e. f4

// Or use human-readable coordinates
game.play("d5".parse().unwrap());

game.board 可以用来访问棋盘的单元格(例如,get_color(coords))。

序列化

序列化功能需要使用 use hexgame::Serialization;

要序列化游戏,请使用 game.save_to_string()game.save_to_json(),这将序列化为 Serde 值。可以使用 Game::load_from_strGame::load_from_json 从 JSON 字符串或值创建游戏。

在命令行界面玩六边形棋

虽然这个包主要是库,但它还包含一个小型的命令行界面来玩六边形棋。

cargo run

然后输入您想要放置下一颗棋子的空间的坐标,例如 "c2",然后按 Enter。

可选地,您可以指定棋盘的大小,例如在 cargo run 7 中。

依赖项

~0.7–1.4MB
~33K SLoC