private void MenuContinuousEval_Click(object sender, EventArgs e) { App_inGame = false; string fileName = @"G:\象棋\全局\1-23届五羊杯\第01届五羊杯象棋赛(1981)\第01局-胡荣华(红先负)柳大华.PGN"; PgnFileStruct pgn = pos.ReadPgnFile(fileName); pos.FromFEN(pgn.StartFEN); engine.FromFEN(pgn.StartFEN); engine.SearchQuiesce(-5000, 5000, 10, 0); for (int i = 1; i < pgn.MoveList.Count; i++) { MOVE step = pgn.MoveList[i]; engine.MakeMove(step); int score = -engine.SearchQuiesce(-5000, 5000, 10, 0); if (i % 2 == 1) { Console.Write("{0}. {1} ", (i + 1) / 2, score); } else { Console.WriteLine(score); } } //Write2Csv(@"G:\xqtest\eval.csv", pos.ivpc, totalMoves, 48); /* 用顶级人类选手的对局来测试评估审局函数的有效性。 * 理想情况下,双方分数应呈锯齿状交替上升,除去吃子的步骤,应该稳定渐变。 */ }
private void ListboxMove_SelectedIndexChanged(object sender, EventArgs e) { if (ListboxMove.SelectedIndex < 0) { return; } textBoxComment.Text = CommentList[ListboxMove.SelectedIndex]; if (ListboxMove.SelectedIndex > FENStep) { for (int i = FENStep; i < ListboxMove.SelectedIndex; i++) { pos.MakeMove(MoveList[i]); } } else { for (int i = FENStep; i > ListboxMove.SelectedIndex; i--) { pos.UnmakeMove(); } } FENStep = ListboxMove.SelectedIndex; if (FENStep > 0) { ptLastFrom = POSITION.UI_Coord2XY(MoveList[ListboxMove.SelectedIndex - 1].sqSrc, bFlipped); ptLastTo = POSITION.UI_Coord2XY(MoveList[ListboxMove.SelectedIndex - 1].sqDst, bFlipped); } PanelBoard.Refresh(); }
bool ReadPGN(string filename, int maxHeight) { POSITION pos = new POSITION(); PgnFileStruct pgn = pos.ReadPgnFile(filename); if (pgn.StartFEN != POSITION.cszStartFen) { Console.WriteLine("非开局或全局谱"); return(false); } int result; switch (pgn.Result) { case "0-1": result = -1; break; case "1-0": result = 1; break; case "1/2-1/2": result = 0; break; default: return(false); } pos.FromFEN(pgn.StartFEN); int height = 0; foreach (MOVE mv in pgn.MoveList) { pos.MakeMove(mv, false); ulong key = pos.Key; if (Book.TryGetValue(key, out BookEntry entry)) { switch (result) { case 1: entry.win++; Debug.Assert(entry.win < ushort.MaxValue); break; case 0: entry.draw++; Debug.Assert(entry.loss < ushort.MaxValue); break; case -1: entry.loss++; Debug.Assert(entry.draw < ushort.MaxValue); break; default: Debug.Fail("Unknown result"); break; } Book[key] = entry; } else { ulong mirror_key = pos.CalculateZobrist(true); if (Book.TryGetValue(mirror_key, out entry)) { switch (result) { case 1: entry.win++; Debug.Assert(entry.win < ushort.MaxValue); break; case 0: entry.draw++; Debug.Assert(entry.loss < ushort.MaxValue); break; case -1: entry.loss++; Debug.Assert(entry.draw < ushort.MaxValue); break; default: Debug.Fail("Unknown result"); break; } Book[mirror_key] = entry; } else { entry = new BookEntry(); switch (result) { case 1: entry.win = 1; break; case 0: entry.draw = 1; break; case -1: entry.loss = 1; break; default: Debug.Fail("Unknown result"); return(false); } Book.Add(key, entry); } } height++; if (height > maxHeight) { return(true); } } return(true); }