目指せ!第14回UEC杯コンピューター囲碁大会<本編> Step [O11o_3o0] カーネルのインタープリター
連載の目次
Step [O11o_3o0] カーネルのインタープリター
👇 以下のファイルを新規作成してほしい
📂 kifuwarabe-uec14
├── 📂 kernel
│ ├── 📄 go.mod
👉 │ ├── 📄 kernel.go
│ └── 📄 logger.go
├── 📄 .gitignore
├── 📄 engine_config.go
├── 📄 engine.toml
├── 📄 go.mod
├── 📄 go.work
└── 📄 main.go
// BOF [O11o_3o0]
package kernel
import "strings"
const geta = 1 // Japanese wooden clogs. Used to convert bases and ordinals.
// Kernel - カーネル
type Kernel struct {
// Position - 局面
Position *Position
}
// NewDirtyKernel - カーネルの新規作成
// - 一部のメンバーは、初期化されていないので、別途初期化処理が要る
func NewDirtyKernel(gameRule GameRule, boardWidht int, boardHeight int) *Kernel {
var k = new(Kernel)
k.Position = NewDirtyPosition(gameRule, boardWidht, boardHeight)
return k
}
// Execute - 実行
//
// Returns
// -------
// isHandled : bool
// 処理済なら真
func (k *Kernel) Execute(command string, logg *Logger) bool {
var tokens = strings.Split(command, " ")
switch tokens[0] {
// この下にコマンドを挟んでいく
// -------------------------
// この上にコマンドを挟んでいく
// -------------------------
default:
}
return false
}
// EOF [O11o_3o0]
Step [O11o_3o1o0] 外側のインタープリターから呼び出す
👇 以下の既存ファイルを編集してほしい
📂 kifuwarabe-uec14
├── 📂 kernel
│ ├── 📄 go.mod
│ ├── 📄 kernel.go
│ └── 📄 logger.go
├── 📄 .gitignore
├── 📄 engine_config.go
├── 📄 engine.toml
├── 📄 go.mod
├── 📄 go.work
👉 └── 📄 main.go
👇 がんばって挿入してほしい
// ...略...
import (
// ...略...
"github.com/muzudho/kifuwarabe-uec14/kernel"
)
// ...略...
// [O12o__11o_4o0] 棋譜の初期化に利用
var onUnknownTurn = func() kernel.Stone {
var errMsg = fmt.Sprintf("? unexpected play_first:%s", engineConfig.GetPlayFirst())
logg.C.Info(errMsg)
logg.J.Infow("error", "play_first", engineConfig.GetPlayFirst())
panic(errMsg)
}
// [O11o_3o0]
var gameRule = kernel.NewGameRule(kernel.KomiFloat(engineConfig.GetKomi()), kernel.PositionNumberInt(engineConfig.GetMaxPositionNumber()))
var kernel1 = kernel.NewDirtyKernel(*gameRule, engineConfig.GetBoardSize(), engineConfig.GetBoardSize())
// 設定ファイルの内容をカーネルへ反映
kernel1.Board.Init(engineConfig.GetBoardSize(), engineConfig.GetBoardSize())
/*
...以下略...
// [O11o_1o0] コンソール等からの文字列入力
var scanner = bufio.NewScanner(os.Stdin)
for scanner.Scan() {
var command = scanner.Text()
logg.C.Infof("# %s", command) // 人間向けの出力
logg.J.Infow("input", "command", command) // コンピューター向けの出力
...以上略...
*/
// * これを追加する
// [O11o_3o0]
var isHandled = kernel1.Execute(command, logg)
if isHandled {
continue
}
/*
...以下略...
// [O11o_1o0]
var tokens = strings.Split(command, " ")
switch tokens[0] {
*/
- カーネルと、自作の部分で コマンドが被ったなら、カーネルの方を優先する
- これにより カーネルのアップデートにより 自作のコマンドが避けられることから、アップデート時は動作テストしてほしい