53 个版本
7.0.0 |
|
---|---|
0.18.1 | 2023 年 1 月 29 日 |
0.18.0 | 2022 年 11 月 19 日 |
0.18.0-beta | 2021 年 12 月 22 日 |
0.1.9 | 2018 年 12 月 24 日 |
96 在 游戏
每月 184 次下载
91KB
2.5K SLoC
Goban
用于与“围棋盘”(我们下围棋的棋盘名称)交互的库
使用版本 > 0.5.0,因为在该版本中检测死子以及 Ko 检测存在一个错误
频道:稳定
仅包含移动生成,规则中没有 IA,也没有前端。
功能
- 历史 // 每个游戏都会有其所有历史,因此您可以遍历它。性能降低!
感谢一些在分析和优化方面的帮助,我们可以在 3 毫秒内随机运行整个游戏(i7u 3.0 GHz)(之前是 600 毫秒)!
示例
获取合法的移动并随机进行一些操作。
最重要的结构是 Game,它具有创建和管理围棋游戏所需的所有功能。
use crate::goban::rules::*;
use crate::goban::rules::game::*;
use rand::seq::IteratorRandom;
use goban::rules::game_builder::GameBuilder;
let mut g = Game::builder()
.size((19,19))
.rule(CHINESE)
// .komi(7.5) Komi is hardcoded for each rule, but can be override like this.
.build().unwrap();
let mut i = 35;
while !g.is_over() && i != 0 {
g.play(
// legals return an iterator of (x,y) points (lazy)
g.legals()
.choose(&mut rand::thread_rng())
.map(|point| Move::Play(point.0,point.1))
.unwrap());
i -= 1;
g.display_goban();
// None if the game is not finished
println!("{:?}", g.outcome());
// Inner array using row policy
println!("{:?}", g.goban().to_vec());
}
#[cfg(feature = "history")]
{
let mut iter_history = g.history().iter();
println!("{:?}", iter_history.next().unwrap());
println!("{:?}", iter_history.next_back().unwrap())
}
┏┯┯┯┯┯┯┯┓
┠┼┼┼┼┼┼┼┨
┠┼┼┼┼┼┼┼┨
┠┼┼┼┼┼┼┼┨
┠┼┼┼┼┼┼┼┨
┠┼┼┼┼┼┼┼┨
┠┼┼┼┼┼┼┼┨
○┼┼┼┼┼┼┼┨
┗┷┷┷┷┷┷┷┛
etc...
工作内容
- 捕获棋子
- 下棋
- 认输
- 投降
- 计分实现
- 在终端上打印一个 漂亮的 Unicode 棋盘!
- SGF 导入
- 生成合法的移动(处理 Ko 检测、自杀式移动、超级 Ko)
- 日本规则
- 中国规则
- 不同大小的棋盘(4x5、4x9),受 Zobrist 哈希限制,但可以在分叉中轻松增加(19x19)。
- 实验性 使用 MCTS 滚动检测死子。
等待
- Const 泛型或可能不是(与带有 backing 数组的 Goban 进行基准测试略快)
依赖关系
~4MB
~84K SLoC