Я сделал игру "Грамматический тест" по русскому языку, но встретил ошибки которые не смог исправить. Помогите их решить
Полный код:
#игра исправь ошибку
import random
import time
#17 слов всего
#word list
error_words = ['Инфармация', 'Празник', 'Молако', 'Нововвведение', 'Канфуз', 'Торолейбус', 'Торокан', 'россия', 'Зоколка', 'Мангитогорк', 'масква', 'Шахиматы', 'Гегант', 'Токси', 'Руский', 'Красньй', 'Мультипиликация']
true_words = ['Информация', 'Праздник', 'Молоко', 'Нововведение', 'Конфуз', 'Троллейбус', 'Таракан', 'Россия', 'Заколка', 'Магнитогорск', 'Москва', 'Шахматы', 'Гигант', 'Такси', 'Русский', 'Красный', 'Мультипликация']
#main programm
print('Тест по русскому языку! Вам будут выводиться слова с ошибками, вам нужно их написать без ошибок.')
print('-----------------------')
time.sleep(5)
testcycle = 'Да'
while testcycle == 'Да' or 'да':
question_word1 = random.choice(error_words)
attempts = 3
print(f'Слово с ошибкой: "{question_word1}"')
answer_word = input('Напишите слово без ошибок: ')
if attempts == 0: #проверка кол-ва попыток
print('Попытки закончились. Программа закроется сама')
time.sleep(6.5)
quit()
if answer_word == 'debug':
print('Debug mode activated')
time.sleep(2)
print(f'список правильных слов: {true_words}')
print('---------------')
time.sleep(3)
elif answer_word in true_words:
print(f'Правильно! Слово "{answer_word}" верно.')
time.sleep(3)
else:
attempts -= 1
print(f'Неверно, осталось {attempts} попыток..')
print('-------------------')
P.S. Есть два списка, один с неверными словами и другой со словами без ошибок, выводится слово с ошибками и нужно написать ответ без ошибок, за неправильный ответ отнимается 1 попытка из 3.
Первая проблема: Я пытался сделать невозможность повторения выбора одного и того же слова, но у меня не вышло, и в этом есть проблема: нужно исключить повторения слов (их всего 17)
Вторая проблема: После первого неправильного ответа убавляется 1 попытка, а дальше при неверных ответах они не убавляются
Третья проблема: Она возникает из за двух вышеперечисленных, я хочу что бы при правильном ответе на все 17 слов выводился текст что я победил:
print('Ты победил, правильно исправив ошибки во всех словах!')
time.sleep(8)
quit()
Либо же, когда я ответил на все 17 слов (Не важно правильно или нет) будет проходить доп. проверка количества оставшихся попыток, типа: по скольку слова не должны повторяться, когда будет дам ответ на все слова, будет проверка, если попыток по итогу все еще 3, и они не потратились, будет победа:
print('Ты победил, правильно исправив ошибки во всех словах!')
time.sleep(8)
quit()
Заранее спасибо, если кто-то поможет :)
Ответы (1 шт):
Первая ошибка - счётчик ошибок стоит размещать вне цикла, иначе после каждого следующего прохода он будет обновляться до начального значения.
Вторая ошибка - вы берёте случайный элемент из списка слов каждый раз, вместо этого лучше перемешать список и уже после итерироваться по нему.
Третья ошибка - ваша программа может быть "взломана" вводом одного корректного слова на любой из вопросов т.к. вы проверяет ответ на вхождение в список правильных слов, при этом не проверяя является ли это слово действительно исправлением заданного. Решается группировкой слов парами: не правильное слово - правильное.
Не могу сказать, что ошибка, но обычно в таких программах ответы приводят к одному регистру и лишь после сравнивают, но я видел у вас в списке слова, для которых регистр важен, поэтому оставляю это на ваше усмотрение.
import random
import time
attempts = 3
field_length = 100 # Длинна разделительной черты
words = [('Инфармация', 'Информация'),
('Празник', 'Праздник'),
('Молако', 'Молоко'),
('Нововвведение', 'Нововведение'),
('Канфуз', 'Конфуз'),
('Торолейбус', 'Троллейбус'),
('Торокан', 'Таракан'),
('россия', 'Россия'),
('Зоколка', 'Заколка'),
('Мангитогорк', 'Магнитогорск'),
('масква', 'Москва'),
('Шахиматы', 'Шахматы'),
('Гегант', 'Гигант'),
('Токси', 'Такси'),
('Руский', 'Русский'),
('Красньй', 'Красный'),
('Мультипиликация', 'Мультипликация')]
print('Тест по русскому языку! Вам будут выводиться слова с ошибками, вам нужно их написать без ошибок.')
print('-' * field_length)
time.sleep(5)
test_cycle = 'Да'
if test_cycle.lower() == 'да':
random.shuffle(words) # Перемешиваем список слов
for question_word, true_word in words:
print(f'Слово с ошибкой: "{question_word}"')
answer = input('Напишите слово без ошибок: ')
if attempts == 0: # проверка кол-ва попыток
print('Попытки закончились. Программа закроется сама')
time.sleep(6.5)
quit()
if answer == 'debug':
print('Debug mode activated')
time.sleep(2)
print(f'список правильных слов: {[i[1] for i in words]}')
print('-' * field_length)
time.sleep(3)
elif answer == true_word:
print(f'Правильно! Слово "{answer}" верно.')
time.sleep(3)
else:
attempts -= 1
print(f'Неверно, осталось {attempts} попыток..')
print('-' * field_length)
else:
print('Ты победил, правильно исправив ошибки во всех словах!')
time.sleep(8)
quit()
Я не реализовывал исправление предыдущих ошибок, дабы не решать всю задачу за вас. Если возникнут трудности в решении вы всегда можете задать новый вопрос. Подсказка - используйте дополнительный список, в который складывайте неправильные ответы пользователя.
П.С. "Дебаг режим" в данном случае будет пропускать одно слово.