You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ntool-biz/ngochess/examples/test.go

151 lines
3.8 KiB
Go

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, 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(&gtp.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, 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()
//}