Я создаю текстовую игру для шифрования и дешифрования. Существуют разные уровни, и каждый уровень использует свой шифр для шифрования текста. Я пытаюсь найти наилучшую практику для серии вопросов и подсказок (описательной части), которую я даю пользователю, чтобы определить, хочет ли он попрактиковаться, выполнить тест, зашифровать или расшифровать. 90% повествования одинаковы для каждого уровня, поэтому я не хочу повторяться с идентичным кодом. Каков наилучший способ сделать это?
Моей первой мыслью было определить функцию, которая содержала бы общий сценарий, и вызывать конкретные функции в качестве параметров. (Это то, что я пытался сделать ниже). Но я, кажется, столкнулся с проблемой масштаба. Когда я вызываю функцию caesar()
в качестве одного из аргументов функции script()
, мне нужно ввести текст для шифрования, но этот текст не предоставляется пользователем, пока функция script()
уже не запущена .
Должен ли я использовать class
для определения описательной части программы, а затем наследовать более конкретные типы?
Или мне просто повторить повествовательный код на разных уровнях?
Вот рассказ script()
:
def script(encrypt, decrypt):
"""Asks user if they want to practice (encode or decode) or take the
test, and calls the corresponding function."""
encrypt = encrypt
decrypt = decrypt
while True:
print('Type Q to quit. Type M to return to the main menu.')
prac_test = input('would you like to practice or take the test? P/T')
if prac_test.lower() == 'p':
choice = input('Would you like to encrypt or decrypt? E/D ')
if choice.lower() == 'e':
text = input('Enter the text you would like to encode: ')
encrypt
elif choice.lower() == 'd':
text = input('Enter the text you would like to decode: ')
key = int(input('Enter the key: '))
decrypt
else:
print('You must enter either "E" or "D" to encode or decode a
text. ')
elif prac_test.lower() == 't':
text = random.choice(text_list)
encrypted_text = encrypt
print(encrypted_text[0])
answer = input('s/nCan you decode this string? ')
if answer.lower() == ran_str.lower():
print('Congrats! You solved level 1!\n')
pass
elif answer != ran_str:
print("Sorry, that's not correct. Why don't you practice some
more?\n")
script(encrypt, decrypt)
elif prac_test.lower() == 'q':
exit()
elif prac_test.lower() == 'm':
break
else:
print('Please enter a valid choice.')
Вот один из уровней, использующих шифр Цезаря:
def caesar(mode, text, key=None):
"""
...
The dictionaries that convert between letters and numbers are stored in the .helper file, imported above.
"""
mode = mode
if mode == 'encrypt':
key = random.randint(1, 25)
elif mode == 'decrypt':
key = key
str_key = str(key)
text = text.lower()
# converts each letter of the text to a number
num_list = [alph_to_num[s] if s in alph else s for s in text]
if mode == 'encrypt':
# adds key-value to each number
new_list = [num_to_alph[(n + key) % 26] if n in num else n for n in
num_list]
elif mode == 'decrypt':
# subtracts key-value from each number
new_list = [num_to_alph[(n - key) % 26] if n in num else n for n in
num_list]
new_str = ''
for i in new_list:
new_str += i
return new_str, str_key
А вот кто бы я попытался использовать их вместе:
script(caesar('encrypt' text), caesar('decrypt', text, key))
Пожалуйста, сообщите мне, как лучше организовать этот многократно используемый повествовательный код.