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