Я сделал игру "Грамматический тест" по русскому языку, но встретил ошибки которые не смог исправить. Помогите их решить

Рейтинг: 0Ответов: 1Опубликовано: 06.03.2023

Полный код:

#игра исправь ошибку

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()

Я не реализовывал исправление предыдущих ошибок, дабы не решать всю задачу за вас. Если возникнут трудности в решении вы всегда можете задать новый вопрос. Подсказка - используйте дополнительный список, в который складывайте неправильные ответы пользователя.

П.С. "Дебаг режим" в данном случае будет пропускать одно слово.