#tic-tac-toe #computer #user-interface #game-engine #ai #shogi #go

kifuwarabe_tic_tac_toe

在开发电脑将棋和电脑围棋之前的一个小例子。来看看仓库。

12个版本

0.2.4 2020年7月29日
0.2.3 2020年7月20日
0.1.6 2020年7月19日

游戏开发中排名455

MIT许可证

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