Beispiel #1
0
void input(char prompt[], char line[], uint8_t asciistart, uint8_t asciiend, uint8_t maxlength){
 	setSystemFont();
	inputInit(prompt, line, maxlength, asciistart, asciiend);
	while (!s_input.done) {
        inputDraw();
        lcdDisplay();
        inputMove();
    }
	inputClean();
	return;
}
/**
 * ユーザからのコマンド入力を受け付けます。
 */
ConsoleManager::CommandResult ConsoleManager::inputCommand() {

  char line[1024];

  std::cout << "> ";

  // コマンド受付
  std::cin.getline(line, sizeof(line));
  if (std::cin.eof()) {
    return CommandResult::Quit;
  }

  // コマンドの解析
  Command command = parseCommand(line);

  // quit
  if (command == Command::Quit) {
    return CommandResult::Quit;
  }

  // 入力がないときは直前のコマンドを繰り返す。
  if (command == Command::Empty) {
    command = prevCommand_;
  }

  prevCommand_ = Command::Empty;

  switch (command) {
    case Command::Empty:
      // 入力なし
      return CommandResult::None;

    case Command::Help:
      // ヘルプを表示
      showHelp();
      return CommandResult::None;

    case Command::Prev:
      // 1手戻る。
      if (!record_.unmakeMove()) {
        std::cout << "There is no previous move.\n";
        return CommandResult::None;
      }

      if (config_.autoBlack || config_.autoWhite) {
        // コンピュータの手番はスキップ
        record_.unmakeMove();
      }
      prevCommand_ = Command::Prev;
      return CommandResult::Changed;

    case Command::Next:
      // 1手進む。
      if (!record_.makeMove()) {
        std::cout << "There is no next move.\n";
        return CommandResult::None;
      }

      if (config_.autoBlack || config_.autoWhite) {
        // コンピュータの手番はスキップ
        record_.makeMove();
      }
      prevCommand_ = Command::Next;
      return CommandResult::Changed;

    case Command::Top:
      // 開始局面に戻る。
      if (!record_.unmakeMove()) {
        std::cout << "There is no previous move.\n";
        return CommandResult::None;
      }

      while (record_.unmakeMove())
        ;
      return CommandResult::Changed;

    case Command::End:
      // 最終局面まで進む。
      if (!record_.makeMove()) {
        std::cout << "There is no next move.\n";
        return CommandResult::None;
      }

      while (record_.makeMove())
        ;
      return CommandResult::Changed;

    case Command::Search:
      // 探索
      search(false);
      return CommandResult::None;

    case Command::Moves:
      // 合法手生成
      showMoves();
      return CommandResult::None;

    case Command::Book:
      // 定跡検索
      probeBook();
      return CommandResult::None;

    case Command::ClearTT:
      // TTクリア
      searcher_.clearTT();
      return CommandResult::None;

    case Command::ClearHistory:
      // Historyクリア
      searcher_.clearHistory();
      return CommandResult::None;

    default: {
      // 指し手入力
      Move move;
      if (!inputMove(line, record_.getBoard(), move)) {
      std::cout << "unknown command!!\n";
      return CommandResult::None;
      }

      if (!record_.makeMove(move)) {
        std::cout << "illegal move!!\n";
        return CommandResult::None;
      }

      std::cout << "Move:\n";
      std::cout << "  " << move.toString() << '\n';
      std::cout << std::endl;
      return CommandResult::Changed;
    }
  }

}