/// <summary> /// bestmove コマンドを処理します。 /// </summary> private void HandleBestMove(Scanner scanner) { try { Move move = Move.NONE, ponder = Move.NONE; var moveSfen = scanner.ParseText(); // まず、特殊な指し手を調べます。 switch (moveSfen) { case "resign": move = Move.RESIGN; break; case "win": move = Move.WIN; break; } // 上記に該当しなかった。 if (move == Move.NONE) { move = Core.Util.FromUsiMove(moveSfen); if (move == Move.NONE) { // 解釈できない文字列 throw new UsiException( moveSfen + ": SFEN形式の指し手が正しくありません。"); } } // 後続があって、"ponder"と書いてある。 if (!scanner.IsEof) { if (scanner.ParseText() != "ponder") { // "ponder"以外はこれないはずなのに…。 throw new UsiException( "invalid command: " + scanner.Text); } // ponderの指し手は'(null)'などが指定されることもあるので、 // 指せなくてもエラーにはしません。 var ponderSfen = scanner.ParseText(); ponder = Core.Util.FromUsiMove(ponderSfen); } // 確定したので格納しておく。 ThinkingBridge.BestMoveReceived(move, ponder); } catch (UsiException ex) { // 例外を出力しておく。 Log.Write(LogInfoType.UsiParseError, $"例外が発生しました。: {ex.Message}"); } }