Заменить char на основе пользовательского ввода

Я разрабатываю игру про палача на tinyduino(tinycircuits) и в настоящее время не могу понять, как правильно заменить char на основе ввода пользователя в для петля. Мой текущий код действительно заменяет правильное подчеркивание (пустое), если пользователь вводит правильную букву.

Согласно игре палач, он распечатает серию пробелов (в моем случае, подчеркивания) в зависимости от количества букв, которые служат заполнителями для правильной буквы, и покажет букву только в том случае, если пользователь введет правильный письмо.

Однако всякий раз, когда пользователь вводит другую правильную букву (после ввода правильной буквы до этого), моя программа создает другую «строку» и вместо этого заменяет подчеркивание в этой новой строке.

Например, скажем, слово для угадывания — kotlin. Если пользователь вводит «k», моя консоль показывает мне:

k_____

Вышеприведенный вывод по-прежнему верен. Но когда пользователь вводит другую букву, скажем, «о», что также правильно, я получаю следующий результат:

k______o____

Чтобы еще раз подчеркнуть, теперь, если пользователь вводит 't', я получаю:

k______o______t___

Что мне нужно изменить в моем коде, чтобы заменить символы подчеркивания в исходной строке всякий раз, когда пользователь вводит правильную букву? Ниже мой текущий код.

if (k == 1) { // Str1 — это "kotlin"
    display.setCursor(10,50);
    length = strlen(Str1);

    String user_input = String(phone_input);
    String word = String(Str1);

    for (i = 0; i < length; i++) {
      word[i] = '_';
      
      if (user_input == "k") {
        word[0] = 'k';
      }

      if (user_input == "o") {
        word[1] = 'o';
      }

      if (user_input == "t") {
        word[2] = 't';
      }

      if (user_input == "l") {
        word[3] = 'l';
      }

      if (user_input == "i") {
        word[4] = 'i';
      }

      if (user_input == "n") {
        word[5] = 'n';
      }

      display.print(word[i]);
      SerialMonitorInterface.print(word[i]);
    }
  }

, 👍0

Обсуждение

почему это должно быть в цикле for?, @jsotola

распечатайте свой код на бумаге... возьмите карандаш... просмотрите свой код шаг за шагом... сделайте пометки о значениях переменных... это может помочь вам понять, почему ваш код работает не так, как вы думаете, @jsotola

Логика вашего кода кажется запутанной. Цикл, выполняющий word[i]='_';, относится к фазе инициализации, которая выполняется только при запуске _новой игры_. Тесты на user_input относятся к обычной фазе «воспроизведения». Я предлагаю вам вынести логику «инициализации новой игры» в отдельную функцию и хорошенько подумать о том, какое событие должно запускать начало новой игры. Кроме того, вы печатаете (()) текущее предположение, не стирая ранее напечатанные и не перемещая курсор на следующую строку. Вместо этого попробуйте println()., @Edgar Bonet

@EdgarBonet, не могли бы вы подробнее рассказать о `println()` и перемещении курсора?, @Isaac Agatep

@jsotola находится в цикле for, потому что каждый раз, когда пользователь вводит правильный символ, цикл for должен заменить символ подчеркивания определенного индекса. Есть ли лучший способ приблизиться к этому?, @Isaac Agatep


1 ответ


2

Внимание, спойлер (Если вы не возражаете, просто улучшите его до играбельной версии, улучшив ярлыки! )

Если вы хотите заменить отдельные символы в слове, String и std::string слишком много накладных расходов. Вместо этого используйте старый добрый char [].

const char* result { "kotlin" }; // ярлык
const size_t size = 6; // ярлык

char guess[size+1]; // предполагаемый промежуточный результат

const byte wrongMax = 22; 
byte wrong = 0; // количество неправильных догадок

void setup() {
  for (char& c : guess) c='_';
  guess[size] = 0;
  
  Serial.begin(9600);
  Serial.println(guess);
}

void loop() {
  if (strcmp(result,guess)== 0) {
    Serial.println("Got it !"); while (1){} // Стоп, требуется сброс
  }
  if (wrong >= wrongMax) {
    Serial.println("Failed !"); while (1){} // Стоп, требуется сброс
  }

  int c = Serial.read();
  if (c >= 'a' && c <= 'z') {
    // ярлык: разрешены только нижние символы
    byte p;
    for (p=0; p < size; p++) {
       if (c == result[p] && guess[p] == '_') {
         // нашел новый правильный
         guess[p] = c;
         break;
       }
    }
    if (p == size) {Serial.print( ++wrong ); Serial.println( " wrong guesses");}
    Serial.println (guess);
  }
}
,