1 个不稳定版本
0.1.0 | 2022 年 2 月 25 日 |
---|
#474 in 游戏
79KB
1.5K SLoC
hexgame
这是一个 Hex 策略棋的简单高效实现。
虽然它主要是为了在 Hex 的蒙特卡洛树搜索机器人中使用而编写的,但它旨在成为 Hex 的一般用途库。
特性
- 游戏规则(没有交换规则,见下文),
- 序列化/反序列化到/从 JSON,
- 一些分析函数,这些函数在编写机器人时可能很有用:
get_neighbors
,get_empty_cells
,find_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_str
或 Game::load_from_json
从 JSON 字符串或值创建游戏。
在命令行界面玩六边形棋
虽然这个包主要是库,但它还包含一个小型的命令行界面来玩六边形棋。
cargo run
然后输入您想要放置下一颗棋子的空间的坐标,例如 "c2",然后按 Enter。
可选地,您可以指定棋盘的大小,例如在 cargo run 7
中。
依赖项
~0.7–1.4MB
~33K SLoC