Заменить 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]);
}
}
@Isaac Agatep, 👍0
Обсуждение1 ответ
Внимание, спойлер (Если вы не возражаете, просто улучшите его до играбельной версии, улучшив ярлыки! )
Если вы хотите заменить отдельные символы в слове, 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);
}
}
- программа for loop вылетает
- Проблемы с преобразованием byte[] в String
- Недопустимое преобразование из 'char' в 'const char*' [-fpermissive] в строке
- Чтение из SPIFFS - Как лучше всего работать со строковым (или char) массивом с неопределенной длиной?
- Чтение и запись в EEPROM
- Я не могу правильно получить строку, которую я отправил через nrf
- проблема с декрементом в цикле
- Второй элемент в массиве не назначается из объекта структуры, ArduinoJson
почему это должно быть в цикле for?, @jsotola
распечатайте свой код на бумаге... возьмите карандаш... просмотрите свой код шаг за шагом... сделайте пометки о значениях переменных... это может помочь вам понять, почему ваш код работает не так, как вы думаете, @jsotola
Логика вашего кода кажется запутанной. Цикл, выполняющий
word[i]='_';
, относится к фазе инициализации, которая выполняется только при запуске _новой игры_. Тесты наuser_input
относятся к обычной фазе «воспроизведения». Я предлагаю вам вынести логику «инициализации новой игры» в отдельную функцию и хорошенько подумать о том, какое событие должно запускать начало новой игры. Кроме того, вы печатаете (()) текущее предположение, не стирая ранее напечатанные и не перемещая курсор на следующую строку. Вместо этого попробуйтеprintln()
., @Edgar Bonet@EdgarBonet, не могли бы вы подробнее рассказать о
`
println()`
и перемещении курсора?, @Isaac Agatep@jsotola находится в цикле for, потому что каждый раз, когда пользователь вводит правильный символ, цикл for должен заменить символ подчеркивания определенного индекса. Есть ли лучший способ приблизиться к этому?, @Isaac Agatep