目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O22o7o0] コウの禁止
連載の目次
Step [O22o7o0] コウの禁止 - Ko
永遠に同じ局面が繰り返してしまうような1手は置けない
Step [O22o7o1o0] ファイル編集 - record_item.go
👇 以下の既存ファイルを編集してほしい
📂 kifuwarabe-uec14
├── 📂 data
│ └── 📄 board1.txt
├── 📂 kernel
│ ├── 📂 play_rule
│ ├── 📄 board_area.go
│ ├── 📄 board_coord.go
│ ├── 📄 o12o__11o1o0_board.go
│ ├── 📄 check_board.go
│ ├── 📄 color.go
│ ├── 📄 go.mod
│ ├── 📄 go.sum
│ ├── 📄 kernel_facade.go
│ ├── 📄 kernel.go
│ ├── 📄 liberty.go
│ ├── 📄 logger.go
│ ├── 📄 masonry.go
│ ├── 📄 play.go
│ ├── 📄 o12o__10o1o0_point.go
👉 │ ├── 📄 record_item.go
│ ├── 📄 record.go
│ ├── 📄 ren.go
│ └── 📄 stone.go
├── 📄 .gitignore
├── 📄 engine_config.go
├── 📄 engine.toml
├── 📄 go.mod
├── 📄 go.work
└── 📄 main.go
// ...略...
// type RecordItem struct {
// ...略...
// [O22o7o1o0] コウの位置
ko Point
// }
// ...略...
Step [O22o7o1o0] ファイル編集 - record.go
👇 以下の既存ファイルを編集してほしい
📂 kifuwarabe-uec14
├── 📂 data
│ └── 📄 board1.txt
├── 📂 kernel
│ ├── 📂 play_rule
│ ├── 📄 board_area.go
│ ├── 📄 board_coord.go
│ ├── 📄 o12o__11o1o0_board.go
│ ├── 📄 check_board.go
│ ├── 📄 color.go
│ ├── 📄 go.mod
│ ├── 📄 go.sum
│ ├── 📄 kernel_facade.go
│ ├── 📄 kernel.go
│ ├── 📄 liberty.go
│ ├── 📄 logger.go
│ ├── 📄 masonry.go
│ ├── 📄 play.go
│ ├── 📄 o12o__10o1o0_point.go
│ ├── 📄 record_item.go
👉 │ ├── 📄 record.go
│ ├── 📄 ren.go
│ └── 📄 stone.go
├── 📄 .gitignore
├── 📄 engine_config.go
├── 📄 engine.toml
├── 📄 go.mod
├── 📄 go.work
└── 📄 main.go
// ...略...
// Push - 末尾に追加
// func (r *Record) Push(placePlay Point,
// [O22o7o1o0] コウの位置
ko Point//) {
// var item = r.items[r.posNum]
// item.placePlay = placePlay
// [O22o7o1o0] コウの位置
item.ko = ko
// r.posNum++
// }
Step [O22o7o2o0] ファイル編集 - play.go
👇 以下の既存ファイルを編集してほしい
📂 kifuwarabe-uec14
├── 📂 data
│ ├── 📄 board1.txt
│ ├── 📄 board2.txt
│ └── 📄 board3.txt
├── 📂 kernel
│ ├── 📂 play_rule
│ ├── 📄 board_area.go
│ ├── 📄 board_coord.go
│ ├── 📄 o12o__11o1o0_board.go
│ ├── 📄 check_board.go
│ ├── 📄 color.go
│ ├── 📄 go.mod
│ ├── 📄 go.sum
│ ├── 📄 kernel_facade.go
│ ├── 📄 kernel.go
│ ├── 📄 liberty.go
│ ├── 📄 logger.go
│ ├── 📄 masonry.go
👉 │ ├── 📄 play.go
│ ├── 📄 o12o__10o1o0_point.go
│ ├── 📄 record_item.go
│ ├── 📄 record.go
│ ├── 📄 ren.go
│ └── 📄 stone.go
├── 📄 .gitignore
├── 📄 engine_config.go
├── 📄 engine.toml
├── 📄 go.mod
├── 📄 go.work
└── 📄 main.go
// func (k *Kernel) DoPlay(command string, logg *Logger) {
// ...略...
// [O22o4o1o0] 自分の眼に石を置こうとした
// var onForbiddenMyEye = func() bool {
// ...略...
// }
// [O22o7o2o0] コウに石を置こうとした
var onKo = func() bool {
logg.C.Infof("? ko my_stone:%s point:%s\n", stone, k.Board.coordinate.GetGtpMoveFromPoint(point))
logg.J.Infow("error ko", "my_stone", stone, "point", k.Board.coordinate.GetGtpMoveFromPoint(point))
return false
}
// var isOk = k.Play(stone, point, logg,
// // [O22o1o2o0] ,onMasonry
// onMasonry,
// // [O22o3o1o0] ,onOpponentEye
// onOpponentEye,
// // [O22o4o1o0] ,onForbiddenMyEye
// onForbiddenMyEye,
// // [O22o7o2o0] ,onKo
onKo//)
// ...略...
// }
// ...略...
// func (k *Kernel) Play(stoneA Stone, pointB Point, logg *Logger,
// // [O22o1o2o0] onMasonry
// onMasonry func() bool,
// // [O22o3o1o0] onOpponentEye
// onOpponentEye func() bool,
// // [O22o4o1o0] onForbiddenMyEye
// onForbiddenMyEye func() bool,
// [O22o7o2o0] onKo
onKo func() bool//) bool {
// [O22o1o2o0]
// if k.Board.IsMasonry(pointB) {
// return onMasonry()
// }
// ...略...
// [O22o7o2o0] コウの判定
if k.Record.IsKo(pointB) {
return onKo()
}
// ...略...
// * 以下を追加
// [O22o7o2o0] コウの判定
var capturedCount = 0 // アゲハマ
// // [O22o6o1o0] 死に石を打ちあげる
// if isExists4rensToRemove {
// for dir := 0; dir < 4; dir++ {
// var ren = o4rensToRemove[dir]
// if ren != nil {
// k.RemoveRen(ren)
// * 以下を追加
// [O22o7o2o0] コウの判定
capturedCount += ren.GetArea()
// }
// }
// }
// [O22o7o2o0] コウの判定
var ko = Point(0)
if capturedCount == 1 {
ko = pointB
}
// 棋譜に追加
//k.Record.Push(pointB,
// * 以下を追加
// [O22o7o2o0] コウの判定
ko//)
Step [O22o7o4o0] コマンド編集 - kernel.go ファイル
👇 以下の既存ファイルを編集してほしい
📂 kifuwarabe-uec14
├── 📂 data
│ ├── 📄 board1.txt
│ ├── 📄 board2.txt
│ └── 📄 board3.txt
├── 📂 kernel
│ ├── 📂 play_rule
│ ├── 📄 board_area.go
│ ├── 📄 board_coord.go
│ ├── 📄 o12o__11o1o0_board.go
│ ├── 📄 check_board.go
│ ├── 📄 color.go
│ ├── 📄 go.mod
│ ├── 📄 go.sum
│ ├── 📄 kernel_facade.go
👉 │ ├── 📄 kernel.go
│ ├── 📄 liberty.go
│ ├── 📄 logger.go
│ ├── 📄 masonry.go
│ ├── 📄 play.go
│ ├── 📄 o12o__10o1o0_point.go
│ ├── 📄 record_item.go
│ ├── 📄 record.go
│ ├── 📄 ren.go
│ └── 📄 stone.go
├── 📄 .gitignore
├── 📄 engine_config.go
├── 📄 engine.toml
├── 📄 go.mod
├── 📄 go.work
└── 📄 main.go
👇 がんばって、 Execute メソッドに挿入してほしい
// ...略...
// この下にコマンドを挟んでいく
// -------------------------
// ...略...
// * アルファベット順になる位置に、以下のケース文を挿入
// case "record": // [O12o__11o_5o0]
// ...略...
// var setPoint = func(i int, item *RecordItem) {
// var positionNth = i + geta // 基数を序数に変換
// var coord = k.Board.GetGtpMoveFromPoint(item.placePlay)
// * 以下を削除
// sb.WriteString(fmt.Sprintf("[%d]%s ", positionNth, coord))
// * 以下を追加
// [O22o7o4o0] コウを追加
var koStr string
if item.ko == Point(0) {
koStr = ""
} else {
koStr = fmt.Sprintf("(%s)", k.Board.coordinate.GetGtpMoveFromPoint(item.ko))
}
sb.WriteString(fmt.Sprintf("[%d]%s%s ", positionNth, coord, koStr))
// }
// ...略...
// ...略...
// この上にコマンドを挟んでいく
// -------------------------
// ...略...
Step [O22o7o4o0] 動作確認
👇 以下のコマンドをコピーして、ターミナルに貼り付けてほしい
Input:
go run .
これで、思考エンジン内の入力待機ループに入った
👇 以下のコマンドをコピーして、ターミナルに貼り付けてほしい
Input:
board_set file data/board3.txt
play black D3
play white C3
play black D3
Output > Console:
[2022-09-17 22:39:55] # board_set file data/board3.txt
[2022-09-17 22:39:55] =
[2022-09-17 22:39:55] # play black D3
[2022-09-17 22:39:55] =
[2022-09-17 22:39:55] # play white C3
[2022-09-17 22:39:55] =
[2022-09-17 22:39:55] # play black D3
[2022-09-17 22:39:55] ? ko my_stone:x point:D3