|
|
package main
|
|
|
|
|
|
import (
|
|
|
"fmt"
|
|
|
"git.noahlan.cn/noahlan/ntool-biz/ngochess/gtp"
|
|
|
"sync"
|
|
|
"time"
|
|
|
)
|
|
|
|
|
|
var (
|
|
|
gtpName = "ngochess\\examples\\gnugo\\gnugo.exe"
|
|
|
gtpArgs = []string{"--mode=gtp", "--chinese-rules", "--quiet"}
|
|
|
gtp1 = [][]string{
|
|
|
{"B", "L10"}, {"W", "K4"}, {"B", "D4"}, {"W", "D10"}, {"B", "C11"},
|
|
|
{"W", "C10"}, {"B", "D11"}, {"W", "E11"}, {"B", "E12"}, {"W", "F11"},
|
|
|
{"B", "F12"}, {"W", "G11"}, {"B", "E9"}, {"W", "E10"}, {"B", "B10"},
|
|
|
{"W", "B9"}, {"B", "A11"}, {"W", "F3"}, {"B", "D9"}, {"W", "C9"},
|
|
|
{"B", "D7"}, {"W", "C6"}, {"B", "C8"}, {"W", "B8"}, {"B", "C7"},
|
|
|
{"W", "D6"}, {"B", "B7"}, {"W", "B6"}, {"B", "E6"}, {"W", "E5"},
|
|
|
{"B", "F6"}, {"W", "A7"}, {"B", "E8"}, {"W", "F5"}, {"B", "C3"},
|
|
|
{"W", "F7"}, {"B", "F8"}, {"W", "G7"}, {"B", "E7"}, {"W", "G8"},
|
|
|
}
|
|
|
gtp2 = [][]string{
|
|
|
{"B", "L11"}, {"W", "D4"}, {"B", "K3"}, {"W", "D10"}, {"B", "C8"},
|
|
|
{"W", "C6"}, {"B", "E8"}, {"W", "F10"}, {"B", "B10"}, {"W", "C11"},
|
|
|
{"B", "B11"}, {"W", "B12"}, {"B", "C10"}, {"W", "D11"}, {"B", "D9"},
|
|
|
{"W", "J11"}, {"B", "K10"}, {"W", "H9"}, {"B", "D6"}, {"W", "D5"},
|
|
|
{"B", "E6"}, {"W", "F4"}, {"B", "B4"}, {"W", "B5"}, {"B", "C4"},
|
|
|
{"W", "C5"}, {"B", "C2"}, {"W", "D2"}, {"B", "D3"}, {"W", "E3"},
|
|
|
{"B", "C3"}, {"W", "E2"}, {"B", "A2"}, {"W", "B1"}, {"B", "H3"},
|
|
|
{"W", "L5"}, {"B", "L4"}, {"W", "J5"}, {"B", "L6"}, {"W", "K6"},
|
|
|
}
|
|
|
)
|
|
|
|
|
|
func testSingleGtpEngine() {
|
|
|
gtpEngine := gtp.NewGtpEngine(gtp.WithDevMode(true), gtp.WithTimeout(10*time.Second))
|
|
|
gtpEngine.Start(gtpName, gtpArgs...)
|
|
|
|
|
|
gtpEngine.SetLevel(10)
|
|
|
if !gtpEngine.Sync(13, 2.75, 6.5, []string{}, gtp2) {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
if winner, score, ok := gtpEngine.FinalScore(); ok {
|
|
|
fmt.Printf("win: %s, score: %.2f\n", winner, score)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
func testMultipleGtpEngines() {
|
|
|
container := gtp.NewGtpEngineContainer(>p.Options{
|
|
|
DevMode: true,
|
|
|
MaxMessageId: 999,
|
|
|
Timeout: 10 * time.Second,
|
|
|
})
|
|
|
ngin1 := container.GetById(1)
|
|
|
ngin1.StartSafe(gtpName, gtpArgs...)
|
|
|
|
|
|
ngin2 := container.GetById(2)
|
|
|
ngin2.StartSafe(gtpName, gtpArgs...)
|
|
|
|
|
|
testNgin := func(ngin *gtp.GtpEngine, plays [][]string) {
|
|
|
ngin.SetLevel(1)
|
|
|
if !ngin.Sync(13, 2.75, 6.5, []string{}, plays) {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
if winner, score, ok := ngin.FinalScore(); ok {
|
|
|
fmt.Printf("win: %s, score: %.2f\n", winner, score)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
testNgin(ngin1, gtp1)
|
|
|
testNgin(ngin2, gtp2)
|
|
|
}
|
|
|
|
|
|
func main() {
|
|
|
//testSingleGtpEngine()
|
|
|
testMultipleGtpEngines()
|
|
|
|
|
|
var wg sync.WaitGroup
|
|
|
wg.Add(1)
|
|
|
wg.Wait()
|
|
|
}
|
|
|
|
|
|
//
|
|
|
//func testGTPEngine() {
|
|
|
// engine, err := ngochess.NewGtpEngine(".\\run.bat")
|
|
|
// if err != nil {
|
|
|
// panic(err)
|
|
|
// }
|
|
|
//
|
|
|
// r, err := engine.BoardSize(1)
|
|
|
// if err != nil {
|
|
|
// panic(err)
|
|
|
// }
|
|
|
// fmt.Println(r)
|
|
|
//}
|
|
|
//
|
|
|
//func testAnalEngine() {
|
|
|
// eng, err := ngochess.NewAnalysisEngine(".\\run_analysis.bat")
|
|
|
// if err != nil {
|
|
|
// panic(err)
|
|
|
// }
|
|
|
//
|
|
|
// var wg sync.WaitGroup
|
|
|
//
|
|
|
// wg.Add(1)
|
|
|
// err = eng.QueryVersion(func(versionResp *resp.AnalQueryVersionResp) {
|
|
|
// fmt.Println(fmt.Sprintf("查询到版本:git_hash:%s version:%s", versionResp.GitHash, versionResp.Version))
|
|
|
// wg.Done()
|
|
|
// })
|
|
|
// if err != nil {
|
|
|
// panic(err)
|
|
|
// }
|
|
|
//
|
|
|
// queryReq := &req.AnalQueryReq{
|
|
|
// Rules: "chinese",
|
|
|
// Komi: 6.5,
|
|
|
// BoardXSize: 9,
|
|
|
// BoardYSize: 9,
|
|
|
// AnalyzeTurns: []int32{2},
|
|
|
// }
|
|
|
// queryReq.AddInitialStone("B", "A1")
|
|
|
// queryReq.AddInitialStone("B", "A2")
|
|
|
//
|
|
|
// queryReq.AddMove("W", "B3")
|
|
|
// queryReq.AddMove("B", "C5")
|
|
|
//
|
|
|
// wg.Add(1)
|
|
|
// err = eng.Query(queryReq, func(queryResp *resp.AnalQueryResp) {
|
|
|
// moveInfo := queryResp.MoveInfos[0]
|
|
|
// fmt.Println(fmt.Sprintf("当前玩家:%s, 建议移动:%s, 此步移动的建议后续: %v, 胜率:%f, 直觉优先级:%d 预测平均分: %f",
|
|
|
// queryResp.RootInfo.CurrentPlayer,
|
|
|
//
|
|
|
// moveInfo.Move,
|
|
|
// moveInfo.PV,
|
|
|
// moveInfo.WinRate,
|
|
|
// moveInfo.Order,
|
|
|
// moveInfo.ScoreMean,
|
|
|
// ))
|
|
|
// wg.Done()
|
|
|
// })
|
|
|
//
|
|
|
// wg.Wait()
|
|
|
//}
|
|
|
//
|
|
|
//func main() {
|
|
|
// testGTPEngine()
|
|
|
// //testAnalEngine()
|
|
|
//}
|