12个版本
0.2.4 | 2020年7月29日 |
---|---|
0.2.3 | 2020年7月20日 |
0.1.6 | 2020年7月19日 |
在游戏开发中排名455
73KB
894 行
Kifuwarabe的井字棋
在开发电脑将棋和电脑围棋之前的一个小例子。
井字棋是一个未指定的UXI协议。X没有意义。
来看看仓库。
这是AI的井字棋版本。
Kifuwarabe(きふわらべ)的原始版本是一个电脑将棋围棋思考引擎(AI)。
没有GUI(图形用户界面),这是CUI(基于字符的用户界面)。
演示
终端
cargo run --example main
游戏中
Kifuwarabe's tic-tac-toe
きふわらべの〇×ゲーム
Command:
コマンド:
`do 7` - Mark number 7.
手番のプレイヤーが、 7 番地に印を付けます。
`go` - The computer shows the next move.
コンピューターが次の1手を示します。
`info-off` - no info output.
info出力なし。
`info-on` - There is info output.(Default)
info出力あり(既定)。
`pos` - Position display.
局面表示。
`position xfen 3/3/3 o moves 5 1 2 8 4 6 3 7 9`
- Starting position and moves.
初期局面と棋譜を入力。
`undo` - 1 back.
1手戻します。
`uxi` - Returns 'uxiok tic-tac-toe {protocol-version}'. It is a version of the protocol, not software.
'uxiok tic-tac-toe {protocol-version}' を返します。ソフトではなくプロトコルのバージョンです。
`xfen` - The current xfen string display.
現局面のxfen文字列表示。
Let's input from `pos`.
`pos` から入力してみましょう。
pos
[Next 1 move(s) | Go O]
+---+---+---+ Please select a square. Example `do 7`
| | | | マスを選んでください。例 `do 7`
+---+---+---+
| | | | 7 8 9
+---+---+---+ 4 5 6
| | | | 1 2 3
+---+---+---+
xfen
xfen 3/3/3 o
position xfen oxx/1o1/2x o
pos
[Next 6 move(s) | Go O]
+---+---+---+ Please select a square. Example `do 7`
| O | X | X | マスを選んでください。例 `do 7`
+---+---+---+
| | O | | 7 8 9
+---+---+---+ 4 5 6
| | | X | 1 2 3
+---+---+---+
do 6
pos
[Next 7 move(s) | Go X]
+---+---+---+ Please select a square. Example `do 7`
| O | X | X | マスを選んでください。例 `do 7`
+---+---+---+
| | O | O | 7 8 9
+---+---+---+ 4 5 6
| | | X | 1 2 3
+---+---+---+
go
info string "nps":......, "nodes":......, "pv":[X,O,X,O,X,O,X,O,X]
info json { "nps": 1, "nodes": 1, "pv":[1 ], "push":"1", "pieces":7, "turn":"O", "comment":"Search." }
info json { "nps": 2, "nodes": 2, "pv":[1,2 ], "push":"2", "pieces":8, "turn":"X", "comment":"Search." }
info json { "nps": 3, "nodes": 3, "pv":[1,2,4 ], "push":"4", "leaf": true, "pieces":9, "result":"draw", "turn":"O", "comment":"It is ok." }
info json { "nps": 3, "nodes": 3, "pv":[1,2 ], "pop" :"4", "pieces":8, "result":"draw", "turn":"X" }
info json { "nps": 3, "nodes": 3, "pv":[1 ], "pop" :"2", "pieces":7, "result":"draw", "turn":"O", "comment":"Fmmm." }
info json { "nps": 4, "nodes": 4, "pv":[1,4 ], "push":"4", "leaf": true, "pieces":8, "result":"win" , "turn":"X", "comment":"Resign." }
info json { "nps": 4, "nodes": 4, "pv":[1 ], "pop" :"4", "pieces":7, "result":"win" , "turn":"O" }
info json { "nps": 4, "nodes": 4, "pv":[ ], "pop" :"1", "pieces":6, "result":"lose", "turn":"X", "comment":"Damn!" }
info json { "nps": 5, "nodes": 5, "pv":[2 ], "push":"2", "pieces":7, "turn":"O", "comment":"Search." }
info json { "nps": 6, "nodes": 6, "pv":[2,1 ], "push":"1", "pieces":8, "turn":"X", "comment":"Search." }
info json { "nps": 7, "nodes": 7, "pv":[2,1,4 ], "push":"4", "leaf": true, "pieces":9, "result":"draw", "turn":"O", "comment":"It is ok." }
info json { "nps": 7, "nodes": 7, "pv":[2,1 ], "pop" :"4", "pieces":8, "result":"draw", "turn":"X" }
info json { "nps": 7, "nodes": 7, "pv":[2 ], "pop" :"1", "pieces":7, "result":"draw", "turn":"O", "comment":"Fmmm." }
info json { "nps": 8, "nodes": 8, "pv":[2,4 ], "push":"4", "leaf": true, "pieces":8, "result":"win" , "turn":"X", "comment":"Resign." }
info json { "nps": 8, "nodes": 8, "pv":[2 ], "pop" :"4", "pieces":7, "result":"win" , "turn":"O" }
info json { "nps": 8, "nodes": 8, "pv":[ ], "pop" :"2", "pieces":6, "result":"lose", "turn":"X", "comment":"Damn!" }
info json { "nps": 9, "nodes": 9, "pv":[4 ], "push":"4", "pieces":7, "turn":"O", "comment":"Search." }
info json { "nps": 10, "nodes": 10, "pv":[4,1 ], "push":"1", "pieces":8, "turn":"X", "comment":"Search." }
info json { "nps": 11, "nodes": 11, "pv":[4,1,2 ], "push":"2", "leaf": true, "pieces":9, "result":"draw", "turn":"O", "comment":"It is ok." }
info json { "nps": 11, "nodes": 11, "pv":[4,1 ], "pop" :"2", "pieces":8, "result":"draw", "turn":"X" }
info json { "nps": 11, "nodes": 11, "pv":[4 ], "pop" :"1", "pieces":7, "result":"draw", "turn":"O", "comment":"Fmmm." }
info json { "nps": 12, "nodes": 12, "pv":[4,2 ], "push":"2", "pieces":8, "turn":"X", "comment":"Search." }
info json { "nps": 13, "nodes": 13, "pv":[4,2,1 ], "push":"1", "leaf": true, "pieces":9, "result":"draw", "turn":"O", "comment":"It is ok." }
info json { "nps": 13, "nodes": 13, "pv":[4,2 ], "pop" :"1", "pieces":8, "result":"draw", "turn":"X" }
info json { "nps": 13, "nodes": 13, "pv":[4 ], "pop" :"2", "pieces":7, "result":"draw", "turn":"O", "comment":"Fmmm." }
info json { "nps": 13, "nodes": 13, "pv":[ ], "pop" :"4", "pieces":6, "result":"draw", "turn":"X", "comment":"Fmmm." }
info string result=Draw nps=13
bestmove 4
do 4
pos
[Next 8 move(s) | Go O]
+---+---+---+ Please select a square. Example `do 7`
| O | X | X | マスを選んでください。例 `do 7`
+---+---+---+
| X | O | O | 7 8 9
+---+---+---+ 4 5 6
| | | X | 1 2 3
+---+---+---+
xfen
xfen oxx/1o1/2x o moves 6 4
quit
简介
软件:Kifuwarabe(きふわらべ)
作者:Takahashi Satoshi(昵称:むずでょ)
参与
年份 | 游戏 | 事件 | 排名 | 全部 |
---|---|---|---|---|
2014 | 将棋 | SDT2 | 24 | 25 |
2015 | 将棋 | WCSC25 | 39 | 39 |
2015 | 将棋 | SDT3 | 28 | 28 |
2016 | 围棋 | UEC9 | 25 | 30 |
2016 | 将棋 | WCSC26 | 26 | 51 |
2016 | 将棋 | SDT4 | 33 | 35 |
2017 | 围棋 | UEC10 | 25 | 30 |
2017 | 将棋 | WCSC27 | 47 | 50 |
2017 | 将棋 | SDT5 | 42 | 42 |
2017 | 围棋 | AIR2017 | 16 | 18 |
2018 | 将棋 | WCSC28 | 55 | 56 |
2018 | 围棋 | AIR2018 | 14 | 14 |
2019 | 将棋 | WCSC29 | 52 | 56 |
2019 | 围棋 | UEC11 | 15 | 18 |
2020 | 将棋 | WCSOC1 | 34 | 39 |
2020年井字棋是新的!
Kifuwarabe的井字棋其他编程语言版本
设置
设置Visual studio code。
支持多字节字符串
[文件] - [首选项] - [设置]
从主菜单。- 在
搜索设置
文本框中键入files: autoGuessEncoding
。 - 在每个
用户
、工作区
、tic-tac-toe
选项卡中检查文件: 自动猜测编码
复选框。 - 保存。
出现终端
- 从主菜单中
[终端] - [新终端]
。
了解如何安装Rust
如何使用
Cargo.toml
<Rust-project>
/Cargo.toml
# ...omitted...
[dependencies]
kifuwarabe_tic_tac_toe = "0.2.4" # Please input latest version.
casual_logger = "0.6.5" # Please input latest version.
你的代码
<Rust-project>
/examples/main.rs
use casual_logger::{Level, Log};
use kifuwarabe_tic_tac_toe::{
engine::{Engine, Response},
log::LogExt,
};
use std;
/// This is the entry point to the program.
/// プログラムへの入り口です。
fn main() {
// Log file name.
// ログ ファイル名。
Log::set_file_name("kifuwarabe-tic-tac-toe");
// Log level.
// ログ レベル。
Log::set_level(Level::Info);
// Log file retention days.
// ログ ファイル保持日数。
Log::set_retention_days(2);
// Remove old log files. This is determined by the date in the filename.
// 古いログファイルを削除します。これは、ファイル名の日付によって決定されます。
Log::remove_old_logs();
let mut engine = Engine::default();
engine.title();
// End the loop with 'quit'. Forced termination with [Ctrl]+[C].
// 'quit' でループを終了。 [Ctrl]+[C] で強制終了。
loop {
let mut line: String = String::new();
// Wait for command line input from standard input.
// 標準入力からのコマンドライン入力を待機します。
match std::io::stdin().read_line(&mut line) {
Ok(_n) => {}
// Tips. You can separate error numbers by simply specifying the line number.
// テクニック。 エラー番号は行番号を振っておくだけで少しはばらけます。
Err(e) => panic!(Log::print_fatal(&format!(
"(Err.373) Failed to read line. / {}",
e
))),
};
if let Some(response) = engine.enter(&line) {
match response {
Response::Quit => {
break;
}
}
}
}
// Wait for logging to complete.
// ロギングが完了するまで待ちます。
Log::flush();
}
终端
cargo run --example main
游戏中
Kifuwarabe's tic-tac-toe
きふわらべの〇×ゲーム
Command:
コマンド:
`do 7` - Mark number 7.
手番のプレイヤーが、 7 番地に印を付けます。
`go` - The computer shows the next move.
コンピューターが次の1手を示します。
`info-off` - no info output.
info出力なし。
`info-on` - There is info output.(Default)
info出力あり(既定)。
`pos` - Position display.
局面表示。
`position xfen 3/3/3 o moves 5 1 2 8 4 6 3 7 9`
- Starting position and moves.
初期局面と棋譜を入力。
`undo` - 1 back.
1手戻します。
`uxi` - Returns 'uxiok tic-tac-toe {protocol-version}'. It is a version of the protocol, not software.
'uxiok tic-tac-toe {protocol-version}' を返します。ソフトではなくプロトコルのバージョンです。
`xfen` - The current xfen string display.
現局面のxfen文字列表示。
Let's input from `pos`.
`pos` から入力してみましょう。
输入
pos
输出
[Next 1 move(s) | Go O]
+---+---+---+ Please select a square. Example `do 7`
| | | | マスを選んでください。例 `do 7`
+---+---+---+
| | | | 7 8 9
+---+---+---+ 4 5 6
| | | | 1 2 3
+---+---+---+
输入
do 7
pos
输出
[Next 2 move(s) | Go X]
+---+---+---+ Please select a square. Example `do 7`
| O | | | マスを選んでください。例 `do 7`
+---+---+---+
| | | | 7 8 9
+---+---+---+ 4 5 6
| | | | 1 2 3
+---+---+---+
输入
go
输出
...omitted...
info json { "nps": 1417, "nodes": 5669, "pv":[9,1,8,2,5 ], "pop" :"3", "pieces":6, "result":"win" , "turn":"O" }
info json { "nps": 1417, "nodes": 5669, "pv":[9,1,8,2 ], "pop" :"5", "pieces":5, "result":"lose", "turn":"X", "comment":"Damn!" }
info json { "nps": 1417, "nodes": 5670, "pv":[9,1,8,2,6 ], "push":"6", "pieces":6, "turn":"O", "comment":"Search." }
info json { "nps": 1417, "nodes": 5671, "pv":[9,1,8,2,6,3 ], "push":"3", "leaf": true, "pieces":7, "result":"win" , "turn":"X", "comment":"Resign." }
info json { "nps": 1417, "nodes": 5671, "pv":[9,1,8,2,6 ], "pop" :"3", "pieces":6, "result":"win" , "turn":"O" }
info json { "nps": 1417, "nodes": 5671, "pv":[9,1,8,2 ], "pop" :"6", "pieces":5, "result":"lose", "turn":"X", "comment":"Damn!" }
info json { "nps": 1417, "nodes": 5671, "pv":[9,1,8 ], "pop" :"2", "pieces":4, "result":"win" , "turn":"O", "comment":"Hooray!" }
info json { "nps": 1417, "nodes": 5671, "pv":[9,1 ], "pop" :"8", "pieces":3, "result":"lose", "turn":"X", "comment":"Damn!" }
info json { "nps": 1417, "nodes": 5671, "pv":[9 ], "pop" :"1", "pieces":2, "result":"win" , "turn":"O", "comment":"Hooray!" }
info json { "nps": 1417, "nodes": 5671, "pv":[ ], "pop" :"9", "pieces":1, "result":"lose", "turn":"X", "comment":"Damn!" }
info string result=Draw nps=1417
bestmove 5
输入
do 5
pos
输出
[Next 3 move(s) | Go O]
+---+---+---+ Please select a square. Example `do 7`
| O | | | マスを選んでください。例 `do 7`
+---+---+---+
| | X | | 7 8 9
+---+---+---+ 4 5 6
| | | | 1 2 3
+---+---+---+
输入
quit
知识
position xfen 3/3/3 o moves 5 1 2 8 4 6 3 7 9
-----------------
Game record. Numbers of square.
-
Turn at the start.
-----
Board at the start.
如何编程实现井字棋游戏?
在开发过程中,你可能需要重现电脑的行为。
比较行为比较困难。相反,获取日志并比较日志很有用。
但日志器难以制作,所以使用库。
- 步骤 1. 使用日志库。
- 使用 casual_logger 库。
- 看看 'log.rs' 文件。
- 扩展日志器。
首先你必须创建的是你的动机。
从外观开始很重要。
- 步骤 2. 看看 'look_and_model.rs' 文件。
- 棋子 - "O","X"。
- 游戏结果 - 胜/平/负。
- 位置 - 这是棋盘。
- 搜索 - 电脑玩家的搜索信息。
如果你想立即玩游戏,你拥有游戏创造者的天赋。
能够控制你的位置意味着能够玩游戏。
- 步骤 3. 'position.rs'
- do_move
- undo_move
- opponent
让我们向电脑输入命令。创建一个命令行解析器。
- 步骤 4. 'command_line_parser.rs'
- 输入。
- 以...开头。
- 转到下一个。
- 剩余。
每天寻找10分钟的人,一年中相当于寻找一周的时间。
在创建游戏本身之前,我们首先创建回放功能。让我们先坚持一周。
- 步骤 5. 'uxi_protocol.rs'
- 转换为 XFEN。
- 执行。('从 XFEN' 之前) 不包括合法的移动和胜负决定。
- 从 XFEN。
- 撤销。
让我们做一个主要的命令。
- 步骤 6. 'examples/main.rs' 命令行。
- 位置。
- pos。
- do。
- undo。
- uxi。
- xfen。
在创建电脑玩家之前,让我们判断结果并测试。
- 步骤 7. 'win_lose_judgment.rs'
- 胜。
- 平局 - 既不赢也不输,不能玩。
- 负。- 不赢就是输。
在创建电脑玩家之前,让我们创建一个衡量性能的机制。
- 步骤 8. 'performance_measurement.rs'
- 秒。- 计时器。
- 每秒节点数。
最后,让我们创建一个电脑玩家。
- 步骤 9. 'computer_player.rs'
- 搜索。
- 评估 - 无。
- 'main.py'
- 创建 "go" 命令。
- 移除所有 'TODO' 任务。例如:'// TODO 在这里编写代码'。
依赖关系
~3–4.5MB
~73K SLoC