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); }
private void MenuOpen_Click(object sender, EventArgs e) { PgnFileStruct PGN; if (openPGNDialog.ShowDialog() == DialogResult.OK) { PGN = pos.ReadPgnFile(openPGNDialog.FileName); MoveList = PGN.MoveList; CommentList = PGN.CommentList; } else { return; } labelEvent.Text = PGN.Event; string result; switch (PGN.Result) { case "1-0": result = "胜"; break; case "0-1": result = "负"; break; case "1/2-1/2": result = "和"; break; default: result = "*"; break; } StringBuilder sb = new StringBuilder(); sb.Append(PGN.RedTeam); sb.Append(' '); sb.Append(PGN.Red); sb.Append(" (先"); sb.Append(result); sb.Append(") "); sb.Append(PGN.BlackTeam); sb.Append(' '); sb.Append(PGN.Black); labelPlayer.Text = sb.ToString(); labelDateSite.Text = PGN.Date + " 弈于 " + PGN.Site; ListboxMove.Items.Clear(); if (string.IsNullOrEmpty(CommentList[0])) { ListboxMove.Items.Add("==开始=="); } else { ListboxMove.Items.Add("==开始==*"); } for (FENStep = 0; FENStep < MoveList.Count; FENStep++) { MOVE step = MoveList[FENStep]; string label = step.ToString(); if (FENStep % 2 == 0) { label = ((FENStep / 2 + 1).ToString() + "." + label); } label = label.PadLeft(8); if (!string.IsNullOrEmpty(CommentList[FENStep + 1])) { label += "*"; } ListboxMove.Items.Add(label); } pos.FromFEN(PGN.StartFEN); engine.FromFEN(PGN.StartFEN); FENStep = 0; ListboxMove.SelectedIndex = 0; PanelBoard.Refresh(); App_inGame = false; }