目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O15o__14o0] 初期盤面を設定する
連載の目次
Step [O15o__14o0] 初期盤面を設定する - board_set コマンド
Step [O15o__14o1o0] ファイル作成 - board_set.go ファイル
👇 以下のファイルを新規作成してほしい
📂 kifuwarabe-uec14
├── 📂 kernel
│ ├── 📄 board_area.go
│ ├── 📄 board_coord.go
👉 │ ├── 📄 board_set.go
│ ├── 📄 o12o__11o1o0_board.go
│ ├── 📄 go.mod
│ ├── 📄 go.sum
│ ├── 📄 kernel.go
│ ├── 📄 logger.go
│ └── 📄 stone.go
├── 📄 .gitignore
├── 📄 engine_config.go
├── 📄 engine.toml
├── 📄 go.mod
├── 📄 go.work
└── 📄 main.go
// BOF [O15o__14o1o0]
package kernel
import (
"os"
"strings"
)
// DoSetBoard - 盤面を設定する
//
// コマンドラインの複数行入力は難しいので、ファイルから取ることにする
// * `command` - Example: `board_set file data/board1.txt`
// ........................--------- ---- ---------------
// ........................0 1 2
func (k *Kernel) DoSetBoard(command string, logg *Logger) {
var tokens = strings.Split(command, " ")
if tokens[1] == "file" {
var filePath = tokens[2]
var fileData, err = os.ReadFile(filePath)
if err != nil {
logg.C.Infof("? unexpected file:%s\n", filePath)
logg.J.Infow("error", "file", filePath)
return
}
var getDefaultStone = func() (bool, Stone) {
return false, Stone_Space
}
var size = k.Position.Board.coordinate.GetMemoryArea()
var i Point = 0
for _, c := range string(fileData) {
var str = string([]rune{c})
var isOk, stone = GetStoneFromChar(str, getDefaultStone)
if isOk {
if size <= int(i) {
// 配列サイズ超過
logg.C.Infof("? board out of bounds i:%d size:%d\n", i, size)
logg.J.Infow("error board out of bounds", "i", i, "size", size)
return
}
k.Position.Board.SetStoneAt(i, stone)
i++
}
}
// サイズが足りていないなら、エラー
if int(i) != size {
logg.C.Infof("? not enough size i:%d size:%d\n", i, size)
logg.J.Infow("error not enough size", "i", i, "size", size)
return
}
// [O23o_2o3o_1o0] 連データベース初期化
k.renDb.Init(k.Position.Board.coordinate.GetWidth(), k.Position.Board.coordinate.GetHeight())
k.FindAllRens()
}
}
// EOF [O15o__14o1o0]
Step [O15o__14o2o0] コマンド実装 - kernel.go ファイル
👇 以下の既存ファイルを編集してほしい
📂 kifuwarabe-uec14
├── 📂 kernel
│ ├── 📄 board_area.go
│ ├── 📄 board_coord.go
│ ├── 📄 board_set.go
│ ├── 📄 o12o__11o1o0_board.go
│ ├── 📄 go.mod
│ ├── 📄 go.sum
👉 │ ├── 📄 kernel.go
│ ├── 📄 logger.go
│ └── 📄 stone.go
├── 📄 .gitignore
├── 📄 engine_config.go
├── 📄 engine.toml
├── 📄 go.mod
├── 📄 go.work
└── 📄 main.go
👇 がんばって、 Execute メソッドに挿入してほしい
// ...略...
// この下にコマンドを挟んでいく
// -------------------------
// ...略...
case "board_set": // [O15o__14o2o0]
// Example: `board_set file data/board1.txt`
k.DoSetBoard(command, logg)
logg.C.Infof("=\n")
logg.J.Infow("ok")
return true
// ...略...
// この上にコマンドを挟んでいく
// -------------------------
// ...略...
Step [O15o__14o3o0] 動作確認
👇 以下のコマンドをコピーして、ターミナルに貼り付けてほしい
Input:
go run .
これで、思考エンジン内の入力待機ループに入った
👇 以下のコマンドをコピーして、ターミナルに貼り付けてほしい
Input:
board_set file data/board1.txt
board
出力は略