python повторить последовательность

Это игра, в которой игроку отображается последовательность из 4 символов, по одному с задержкой между ними. Затем игрок должен ввести последовательность в том виде, в котором она была отображена.

Последовательности отображаются до тех пор, пока ввод не будет неправильным.

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

__all__ = []

import random
import time

from colorama import deinit, init

MSG_ASK = 'What was the sequence? '
MSG_CORRECT = '33[32mCorrect!33[0m'
MSG_INCORRECT = '33[31mIncorrect33[0m'


def main():
    k = 4

    lines = r'|-/'

    seconds = 1

    init()

    while True:
        s=""

        sequence = random.choices(lines, k=k)
        sequence="".join(sequence)

        for i in range(k):
            if not i:
                s=""
            elif i == 1:
                s=" "
            else:
                s = i * ' '

            print(s, sequence[i], end='r')
            time.sleep(seconds)

        print(f'{s}  ')

        if input(MSG_ASK) == sequence:
            print(MSG_CORRECT)
        else:
            print(MSG_INCORRECT)
            break

    deinit()


if __name__ == '__main__':
    main()

1 ответ
1

С помощью __all__ = [] в основном бесполезен в основной программе и, вероятно, должен быть удален.


Это трудно читать:

MSG_CORRECT = '33[32mCorrect!33[0m'
MSG_INCORRECT = '33[31mIncorrect33[0m'

Это намного проще:

from colorama import Fore

MSG_CORRECT = Fore.GREEN + 'Correct!' + Fore.RESET
MSG_INCORRECT = Fore.RED + 'Incorrect' + Fore.RESET

Примечание: Style.RESET_ALL будет точным переводом 33[0m. Отрегулируйте по желанию.


Вы можете выделить тело цикла в отдельные функции:

def generate_random_sequence(length: int, characters: str) -> str:
    """
    Generate a random sequence of characters.
    """

    return ''.join(random.choices(characters, k=length))

def show_sequence(sequence: str, seconds_per_character: float) -> None:
    """
    Display a sequence to the user, one character at a time, on one line,
    using the given delay between characters.

    After the last character has been shown, clear the line.
    """

    for i, ch in enumerate(sequence):
        print(' ' * i, ch, end='r')
        time.sleep(seconds_per_character)

    print(' ' * len(sequence), ' ')

Я сделал здесь несколько вещей:

  • типовые подсказки и """docstring""" были добавлены
  • sequence вычисляется за один шаг
  • удалил s переменная, так как ее можно напрямую вычислить как ' ' * i
  • зацикливается непосредственно на последовательности, используя enumerate отслеживать индекс.
  • скорость, длина и символы — все аргументы функций, поэтому задача может стать программно сложнее (то есть быстрее или дольше)

С помощью вышеуказанной функции основной цикл становится проще:

def main():
    k = 4
    lines = r'|-/'
    seconds = 1

    init()

    while True:
        sequence = generate_random_sequence(k, lines)
        show_sequence(sequence, seconds)

        guess = input(MSG_ASK)
        if guess == sequence:
            print(MSG_CORRECT)
        else:
            print(MSG_INCORRECT)
            break

    deinit()

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *