#人工智能 #计算机 #策略 #评估 #围棋 #四目并排 #思考

应用 kiwaconnectfour

WIP。四目并排AI。目前尚未工作。

1个不稳定版本

0.1.0 2020年9月1日

游戏开发中排名第747位

MIT许可证

375KB
3K SLoC

kiwaconnectfour

注意:目前,思考部分尚未工作。我不知道是否可以完成。
注:现在,思考部分还没有工作。不知道是否能完成。

编写计算机将棋程序是困难的。
计算机将棋的编程很困难。

我如何提高我的编程技能?
要提升我的编程技能,我该怎么做?

从简单游戏逐步提升的策略并不合适。
因为解决问题的正确程序完全取决于游戏,除非你有通用人工智能。

原因是解决问题的正确程序完全取决于游戏,除非你有通用人工智能。
因为解决问题的正确程序完全取决于游戏,除非你有通用人工智能。

我建议你直接编写计算机将棋软件,而不是绕过它。
不绕过它,直接编写计算机将棋软件。

当然,最好是从修改最强的库开始。这有助于找出缺少的东西。
当然,最好是从修改最强的库开始。这有助于了解缺少什么。

然而,如果你想克服与计算机将棋无关的基本编程技能的弱点,那么从简单的程序开始是有意义的。
然而,如果想克服与计算机将棋无关的基本编程技能的弱点,那么从简单的程序开始是有意义的。

例如,四目并排游戏非常庞大,无法在家庭电脑上完全探索,但它们容易运行,而且技能检查也容易。
例如,四目并排游戏非常庞大,无法在家庭电脑上完全探索,但它们容易运行,而且技能检查也容易。

将棋、围棋程序“kiwa”已被转换为四目并排。
将棋和围棋程序“kiwa”已经被转换为四目并排。

它使用未指定的UXI协议实现,该协议模仿UCI/USI协议。X没有意义。 UCI/USI协议的模拟未指定UXI协议实现。X没有意义。

请查看仓库。
请查看仓库。

没有图形用户界面(GUI)。只有思考引擎。
没有GUI(图形用户界面)。只有思考引擎。

运行

注意:目前不是库。它将在以后的更新中转换为库。
注意:目前不是库。它将在以后的更新中转换为库。

终端

cargo run

在游戏中

casual_logger   | Remove 0 log file(s).
                | If you don't want this message, set `Log::set_opt(Opt::Release);`.
Hello, world!
こんにちわ、世界!!
Nought=|O|

... Test run. Omitted ...

Kifuwarabe's connect-four
きふわらべのコネクト・フォー

Command:
コマンド:
`do d`      - Mark the d file.
                手番のプレイヤーが、 7 列目に印を付けます。
`go`        - The computer shows the next move.
                コンピューターが次の1手を示します。
`info-off`  - no info output.
                info出力なし。
`info-on`   - There is info output.(Default)
                info出力あり(既定)。
`learn`     - Learning.
                学習。
`pos`       - Position display.
                局面表示。
`position xfen 7/7/7/7/7/7 O moves d c`
            - Starting position and moves.
                初期局面と棋譜を入力。
`uh`        - Step of learning.
                学習のステップ。
`undo`      - 1 back.
                1手戻します。
`uxi`       - Returns 'uxiok connect-four {protocol-version}'. It is a version of the protocol, not software.
                'uxiok connect-four {protocol-version}' を返します。ソフトではなくプロトコルのバージョンです。
`xfen`      - The current xfen string display.
                現局面のxfen文字列表示。

Let's input from `pos`.
`pos` から入力してみましょう。

在游戏中输入

将自动生成一个约262KB的文件,所以请注意磁盘空间。
将自动生成约262KB的文件,所以请注意磁盘空间。

哎呀,还将输出一个大的日志文件,所以请确保你有约100MB以上的空余空间。它会越来越大。如果觉得危险,请手动删除。
哎呀,还将输出一个大的日志文件,所以请确保你有约100MB以上的空余空间。它会越来越大。如果觉得危险,请手动删除。

learn

在游戏中输出

... Omitted ...

[Learn]
     | Feature number      | Current evaluation        | Choice way    | Give                           | Take                                | Refund
File | Vert Hori Baro Sini | Vert Hori Baro Sini Total | File   Result | Val  Vert Hori Baro Sini Total | Val  Rest Vert Hori Baro Sini Total | Val  Vert Hori Baro Sini Total
---- + ---- ---- ---- ---- + ---- ---- ---- ---- ----- + ------ ------ + ---- ---- ---- ---- ---- ----- + ---- ---- ---- ---- ---- ---- ----- + ---- ---- ---- ---- ---- -----
   a |    1    8   16    . |    6   57   60    .   123 | a      Win    |    4    4   49   59    .   112 |    7    .    7   57   61    .   125 |    .    7   57   61    .   125
   b |    2    8   17    . |    .   57    2    .    59 | b      Win    |    4    .   49    .    .    49 |    7    .    3   57    2    .    62 |    .    3   57    2    .    62
   c |    3    8   18    . |    3   57   59    .   119 | resign Lose   |    4    1   49   58    .   108 |    .    .    1   57   58    .   116 |    .    1   57   58    .   116
   d |    4    8   19   20 |   69   57   34    5   165 | d      Win    |    4   68   49   33    4   154 |    7    .   70   57   35    5   167 |    .   70   57   35    5   167
   e |    5    8    .   21 |    3   57    .   12    72 | e      Win    |    4    1   49    .   11    61 |    7    .    4   57    .   13    74 |    .    4   57    .   13    74
   f |    6    8    .   22 |    6   57    .   41   104 | resign Lose   |    4    4   49    .   40    93 |    .    .    4   57    .   40   101 |    .    4   57    .   40   101
   g |    7    8    .   23 |    3   57    .    3    63 | resign Lose   |    4    1   49    .    2    52 |    .    .    1   57    .    2    60 |    .    1   57    .    2    60

... Omitted ...

注意:我想有一个强大的思考部分,但我认为这没有帮助
评估点通过加减整数来分配,而不使用微分或实数。
注意: 我們希望建立一個強大的思考部分,但我認為這並沒有什麼用。
評估值通過加法和減法進行分配,而不使用微分或實數。

在游戏中输入

pos

在游戏中输出

[Next 1 piece(s) | Go O]

  +---+---+---+---+---+---+---+ Please select a file. Example `do d`
6 |   |   |   |   |   |   |   | 列を選んでください。例 `do d`
  +---+---+---+---+---+---+---+
5 |   |   |   |   |   |   |   |    a b c d e f g
  +---+---+---+---+---+---+---+
4 |   |   |   |   |   |   |   |
  +---+---+---+---+---+---+---+
3 |   |   |   |   |   |   |   |
  +---+---+---+---+---+---+---+
2 |   |   |   |   |   |   |   |
  +---+---+---+---+---+---+---+
1 |   |   |   |   |   |   |   |
  +---+---+---+---+---+---+---+
    a   b   c   d   e   f   g

在游戏中输入

do d
pos

在游戏中输出

[Next 2 piece(s) | Go X]

  +---+---+---+---+---+---+---+ Please select a file. Example `do d`
6 |   |   |   |   |   |   |   | 列を選んでください。例 `do d`
  +---+---+---+---+---+---+---+
5 |   |   |   |   |   |   |   |    a b c d e f g
  +---+---+---+---+---+---+---+
4 |   |   |   |   |   |   |   |
  +---+---+---+---+---+---+---+
3 |   |   |   |   |   |   |   |
  +---+---+---+---+---+---+---+
2 |   |   |   |   |   |   |   |
  +---+---+---+---+---+---+---+
1 |   |   |   | O |   |   |   |
  +---+---+---+---+---+---+---+
    a   b   c   d   e   f   g

在游戏中输入

go

在游戏中输出

info json { "nps":     1, "nodes":     1, "push":"f"                                                   , "O":"Search.", "channel1":Win, "choose":"f", "total":475, "a":28, "b":70, "c":69, "d":147, "e":64, "f":59, "g":38, "pv":["d","f"] }
info json { "nps":     2, "nodes":     2, "push":"d"                                                   , "X":"Search.", "channel1":Win, "choose":"d", "total":470, "a":93, "b":30, "c":84, "d":139, "e":42, "f":54, "g":28, "pv":["d","f","d"] }
info json { "nps":     3, "nodes":     3, "push":"d"                                                   , "O":"Search.", "channel1":Win, "choose":"d", "total":463, "a":29, "b":71, "c":54, "d":147, "e":62, "f":61, "g":39, "pv":["d","f","d","d"] }
i

... omitted ...

info string pred_result=Win nps=23
bestmove f

在游戏中输入

do f
pos

在游戏中输出

[Next 3 piece(s) | Go O]

  +---+---+---+---+---+---+---+ Please select a file. Example `do d`
6 |   |   |   |   |   |   |   | 列を選んでください。例 `do d`
  +---+---+---+---+---+---+---+
5 |   |   |   |   |   |   |   |    a b c d e f g
  +---+---+---+---+---+---+---+
4 |   |   |   |   |   |   |   |
  +---+---+---+---+---+---+---+
3 |   |   |   |   |   |   |   |
  +---+---+---+---+---+---+---+
2 |   |   |   |   |   |   |   |
  +---+---+---+---+---+---+---+
1 |   |   |   | O |   | X |   |
  +---+---+---+---+---+---+---+
    a   b   c   d   e   f   g

在游戏中输入

xfen

在游戏中输出

xfen 7/7/7/7/7/7 O moves d f

在游戏中输入

position xfen 7/7/7/7/XOXOXOX/OXOXOXO O moves d f
pos

在游戏中输出

[Next 17 piece(s) | Go O]

  +---+---+---+---+---+---+---+ Please select a file. Example `do d`
6 |   |   |   |   |   |   |   | 列を選んでください。例 `do d`
  +---+---+---+---+---+---+---+
5 |   |   |   |   |   |   |   |    a b c d e f g
  +---+---+---+---+---+---+---+
4 |   |   |   |   |   |   |   |
  +---+---+---+---+---+---+---+
3 |   |   |   | O |   | X |   |
  +---+---+---+---+---+---+---+
2 | X | O | X | O | X | O | X |
  +---+---+---+---+---+---+---+
1 | O | X | O | X | O | X | O |
  +---+---+---+---+---+---+---+
    a   b   c   d   e   f   g

在游戏中输入

quit

評估設計

無效。 你應該建立思考部分。
無效。 你應該建立思考部分。

基本功能

對交錯的方格進行編號。
對交叉的方格進行編號。

基本功能

elemental-features.png

特徵方形

features-square.png

方格值

square-value.png

特徵大小

feature-size.png

如何編程四子棋遊戲?

在開發過程中,你可能需要複製計算機的行為。
比較行為很困難。相反,取得日誌並比較日誌很有用。
建立日誌很困難,所以使用庫。

  • 步驟 1. 使用日誌庫。
    • 在 'Cargo.toml' 和 'main.rs' 中使用 casual_logger 库。
    • 創建 'log.rs' 文件。
      • 擴展日誌。

在測試的同時進行開發。

  • 步驟 2. 創建 test.rs 文件。
    • 隨著步驟的進行逐漸添加。

首先,你需要創建你的動機。
從外觀開始很重要。

  • 步驟 3. 創建 'main.rs' 文件和 'look_and_model.rs' 文件。
    • 引擎 - 标題屏幕。
    • 棋子 - "O","X"。
    • 遊戲結果 - 胜/平/負。
    • 位置 - 它是棋盤。
    • 搜索 - 記算機玩家搜索。
    • 搜索信息 - 計算機玩家搜索信息。

如果你想立即玩,你擁有遊戲製作人的天賦。
能夠控制你的位置意味著能夠遊戲。

  • 步驟 4. 創建 'position.rs' 文件。
    • do_move
    • undo_move
    • opponent

讓我們將命令輸入計算機。創建一個命令行解析器。

  • 步驟 5. 創建 'command_line_seek.rs' 文件。
    • 開始於。
    • 到下一個。
    • 休息。

每天尋找10分鐘的人,一年內就尋找了一個禮拜。
在創建遊戲本身之前,我們首先創建重放功能。讓我們為一個禮拜獲取它。

  • 步驟 6. 創建 'uxi_protocol.rs' 文件。
    • 做。(在 'From XFEN' 之前) 排除合法的移動和勝/負決定。
    • 轉換為 XFEN。
    • 從 XFEN。
    • 撤銷。

讓我們建立主要命令。

  • 步驟 7. 創建 'engine.rs' 文件。命令行。
    • position。
    • pos。
    • do。
    • undo。
    • uxi。
    • xfen。
  • 步驟 8. 'src/main.rs' 或 'examples/main.rs'。

在創建計算機玩家之前,讓我們判斷結果並進行測試。

  • 步驟 9. 'win_lose_judgment.rs'
    • 勝。
    • 平局 - 不勝也不敗,不能遊戲。
    • 敗。 - 不勝就是敗。

在創建計算機玩家之前,讓我們創建一個測量性能的機制。

  • 步驟 10. 'performance_measurement.rs'
    • 秒。 - 腳錶。
    • 每秒節點數。

讓我們建立計算機玩家。

  • 步驟 11. 'computer_player/search.rs'
    • 搜索。
  • 'main.py'
    • 創建 "go" 命令。

讓我們學習計算機思考。

  • 步驟 12. 'computer_player/evaluation.rs'
    • 評估 - 無。
      • ways_weight。
      • 保存。
      • 加載。
      • 獲取值。
      • 設置值。
      • 打印一些特徵。
  • 步驟 13. computer_player/learn.rs

最後。

  • 刪除所有 'TODO' 任務。例如: '// TODO Write a code here.'

依賴項

~4–5MB
~83K SLoC