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); }
public bool TryGetValue(ulong key, out BookEntry entry) { return(Book.TryGetValue(key, out entry)); }