目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O19o_1o0] 石を打つ
連載の目次
Step [O19o_1o0] 石を打つ - play コマンド
Step [O19o0] ファイル作成 - play.go ファイル
👇 以下のファイルを新規作成してほしい
📂 kifuwarabe-uec14
├── 📂 kernel
│ ├── 📄 board_area.go
│ ├── 📄 board_coord.go
│ ├── 📄 o12o__11o1o0_board.go
│ ├── 📄 go.mod
│ ├── 📄 kernel.go
│ ├── 📄 logger.go
👉 │ ├── 📄 play.go
│ ├── 📄 o12o__10o1o0_point.go
│ └── 📄 stone.go
├── 📄 .gitignore
├── 📄 engine_config.go
├── 📄 engine.toml
├── 📄 go.mod
├── 📄 go.work
└── 📄 main.go
// BOF [O19o0]
package kernel
import "strings"
// DoPlay - 打つ
//
// * `command` - Example: `play black A19`
// ........................---- ----- ---
// ........................0 1 2
func (k *Kernel) DoPlay(command string, logg *Logger) {
var tokens = strings.Split(command, " ")
var stoneName = tokens[1]
var getDefaultStone = func() (bool, Stone) {
logg.C.Infof("? unexpected stone:%s\n", stoneName)
logg.J.Infow("error", "stone", stoneName)
return false, Stone_Space
}
var isOk1, stone = GetStoneFromName(stoneName, getDefaultStone)
if !isOk1 {
return
}
var coord = tokens[2]
var point = k.Board.coordinate.GetPointFromGtpMove(coord)
// [O22o1o2o0] 石(または枠)の上に石を置こうとした
var onMasonry = func() bool {
logg.C.Infof("? masonry my_stone:%s point:%s\n", stone, k.Board.coordinate.GetGtpMoveFromPoint(point))
logg.J.Infow("error masonry", "my_stone", stone, "point", k.Board.coordinate.GetGtpMoveFromPoint(point))
return false
}
var isOk = k.Play(stone, point, logg,
// [O22o1o2o0] ,onMasonry
onMasonry)
if isOk {
logg.C.Info("=\n")
logg.J.Infow("ok")
}
}
// Play - 石を打つ
//
// Returns
// -------
// isOk : bool
// 石を置けたら真、置けなかったら偽
func (k *Kernel) Play(stoneA Stone, pointB Point, logg *Logger,
// [O22o1o2o0] onMasonry
onMasonry func() bool) bool {
// [O22o1o2o0]
if k.Board.IsMasonry(pointB) {
return onMasonry()
}
// 石を置く
k.Board.SetStoneAt(pointB, stoneA)
k.Record.Push(pointB) // 棋譜に追加
return true
}
// EOF [O19o0]
Step [O20o0] 実装 - kernel.go ファイル
👇 以下の既存ファイルを編集してほしい
📂 kifuwarabe-uec14
├── 📂 kernel
│ ├── 📄 board_area.go
│ ├── 📄 board_coord.go
│ ├── 📄 o12o__11o1o0_board.go
│ ├── 📄 go.mod
👉 │ ├── 📄 kernel.go
│ ├── 📄 logger.go
│ └── 📄 stone.go
├── 📄 .gitignore
├── 📄 engine_config.go
├── 📄 engine.toml
├── 📄 go.mod
├── 📄 go.work
└── 📄 main.go
👇 がんばって、 Execute メソッドに挿入してほしい
// ...略...
// この下にコマンドを挟んでいく
// -------------------------
// ...略...
// * アルファベット順になる位置に、以下のケース文を挿入
case "play": // [O20o0]
// Example: `play black A19`
k.DoPlay(command, logg)
return true
// ...略...
// この上にコマンドを挟んでいく
// -------------------------
// ...略...
Step [O21o0] 実行
👇 以下のコマンドをコピーして、ターミナルに貼り付けてほしい
Input:
go run .
これで、思考エンジン内の入力待機ループに入った
👇 以下のコマンドをコピーして、ターミナルに貼り付けてほしい
Input:
play black B2
Output > Console:
[2022-09-12 21:46:48] # play black B2
[2022-09-12 21:46:48] =
Output > Log > Plain:
2022-09-12T21:46:48.701+0900 # play black B2
2022-09-12T21:46:48.739+0900 =
Output > Log > Json:
{"level":"info","ts":"2022-09-12T21:46:48.739+0900","caller":"kifuwarabe-uec14/main.go:61","msg":"input","command":"play black B2"}
{"level":"info","ts":"2022-09-12T21:46:48.739+0900","caller":"kernel/play.go:32","msg":"ok"}
Input:
board
Output > Console:
[2022-09-12 21:49:36] # board
[2022-09-12 21:49:36] = board:'''
. +++++++++++++++++++++
. +...................+
. +.x.................+
. +...................+
. +...................+
. +...................+
. +...................+
. +...................+
. +...................+
. +...................+
. +...................+
. +...................+
. +...................+
. +...................+
. +...................+
. +...................+
. +...................+
. +...................+
. +...................+
. +...................+
. +++++++++++++++++++++
. '''