С учетом ваших пожеланий был проведен рефакторинг. Основные ( и самые трудоемкие) изменения коснулись интерфейсной части программы. В частности , теперь все сообщения выводящиеся на экран, загружаются не из основного кода. Какие файлы используются для этого обычно(xml или что-то еще) и как это должно реализовываться я пока не разобрался. Я реализовал это путем создания папок с текстовыми файлами.(Наверное это делается совсем по другому, но как именно мне подсказать некому(в инете вся информация мало чем отличается от стандартной документации по работе с файлами) поэтому накатал такую отсебятину
Теперь есть возможность выбора языка в начале игры(даже французский
). Так же избавился от экономии имен. Конкретезировал исключения которые обнаружил. Где-то для того чтобы упростить одни функции пришлось добавить другие. Рекурсия убрана т.к. она действительно лишняя. Сомневаюсь , что у меня получилось действительно упростить код, но то что он отличается от изначального это да. Вот собственно:
import random, shelve, sys
def user_choice():
"""Выбор языка интерфейса"""
LANGUAGES =("En", "Ru", "Fr")
choice = None
while choice not in range(3):
print("\n\tPlease, enter number language!")
try:
choice = int(input("""\t\tChoice you language:
1 - English
2 - Russian
3 - France
"""))
except (TypeError, ValueError):
print("Error!")
lang = LANGUAGES[choice - 1]
return lang
def acquaintance(language):
"""Знакомство с пользователем"""
with open(rf"{language}\acquaintance.txt", "r", encoding = "utf-8" ) as i:
j = i.readlines()
for i in range(5):
response = input(j[0]).strip().title()
if response:
return response
else:
print(j[1])
print(j[2])
sys.exit()
def hallo_unit(language, name):
"""Приветсвует игрока и инструктирует"""
with open(f"{language}\hallo_unit.txt", "r", encoding = "utf-8" ) as i:
j = i.readlines()
j[0] = j[0].replace("USERNAME", name)
for k in j:
print(k)
def ask_yes_no(language, question):
"""Задает вопрос с ответом "ДА" или "НЕТ"."""
with open(rf"{language}\questions.txt", "r", encoding = "utf-8" ) as i:
j = i.readlines()
response = None
while response not in ("YES", "NO"):
response = input(j[question]).upper()
return response
def game_interval(language, question = 0):
"""При желании пользователя меняет величину диапазона"""
with open(rf"{language}\game_interval.txt", "r", encoding = "utf-8" ) as i:
j = i.readlines()
answer = ask_yes_no(language, question)
interval = ""
while not interval:
if answer == "NO":
interval = 100
else:
try:
interval = int(input(j[0]))
except ValueError:
print(j[1])
return interval
def ask_number(language, interval):
"""Просит ввести число из диапазона"""
with open(rf"{language}\ask_number.txt", "r", encoding = "utf-8" ) as i:
j = i.readlines()
response = None
while response not in range(1,interval + 1):
try:
response = int(input(j[0]))
if response not in range(1,interval + 1):
print(j[1])
except ValueError:
print(j[2])
return response
def user_game(language, interval, name):
"""Пользователь отгадывает число"""
with open(rf"{language}\user_game.txt", "r", encoding = "utf-8" ) as i:
j = i.readlines()
computer_choise = random.randrange(interval) + 1
for score in range(10):
response = ask_number(language, interval)
if computer_choise < response:
print(j[0])
elif computer_choise > response:
print(j[1])
else:
records_list_4(score, interval, name)
computer_choise = str(computer_choise)
j[2] = j[2].replace("ITEM", computer_choise)
score = str(score + 1)
j[3] = j[3].replace("SCORE", score)
print(j[2])
print(j[3])
return
print(j[4])
def records_list_4(score, interval, name):
"""Добавляет рекорды в виде косервированных списков на полке"""
records = shelve.open("records.dat")
new_interval = str(interval)
if new_interval in records:
name_records = records[new_interval]
name_record = (score + 1, name)
name_records.append(name_record)
records[new_interval] = name_records
else:
name_records = []
name_record = (score + 1, name)
name_records.append(name_record)
records[new_interval] = name_records
records.close()
def print_record_2(language):
"""Выводит список рекордов на экран"""
with open(rf"{language}\print_record_2.txt", "r", encoding = "utf-8" ) as i:
for j in i:
print(j)
records = shelve.open("records.dat")
for i in records:
lvl_records = records[i]
name_records = []
for j in lvl_records:
score, name = j
name_record = (score, name, i)
name_records.append(name_record)
name_records.sort()
cut_records = name_records[:5]
for score, name, lvl in name_records:
print_lvl = str(lvl)
print_score = str(score)
print("\t", print_lvl.ljust(22), name.ljust(23), print_score)
print("\n\n")
def user_answer(language,response_copy, response):
"""Проверяет ответ пользователя на валидность."""
with open(rf"{language}\computer_game.txt", "r", encoding = "utf-8" ) as i:
j = i.readlines()
response = None
while response not in ("БОЛЬШЕ", "МЕНЬШЕ", "ПРАВИЛЬНО"):
response = input("").upper()
if response not in ("БОЛЬШЕ", "МЕНЬШЕ", "ПРАВИЛЬНО"):
print(j[3])
else:
return response
def computer_game(language, interval):
with open(rf"{language}\computer_game.txt", "r", encoding = "utf-8" ) as i:
j = i.readlines()
j[0] = j[0].replace("/", "\n")
print(j[0])
item = ask_number(language, interval)
name = "Компьютер"
low = 1
hight = interval
response_copy = None#запоминает предидущий ответ компьютера чтобы пользователь не мошеничал
for score in range(10):
mid = (low + hight) // 2
response = range(interval + 1)[mid]
print("\n\t", response)
user_response = user_answer(language,response_copy, response)
if user_response == "БОЛЬШЕ":
low = mid + 1
elif user_response == "МЕНЬШЕ":
hight = mid - 1
else:
records_list_4(score, interval, name)
score = str(score + 1)
j[2] = j[2].replace("SCORE", score)
print(j[2])
return
if response == response_copy:
print(j[5])
sys.exit()
response_copy = response
print(j[4])
def main():
language = user_choice()
end_game = None
while end_game != "NO":
name = acquaintance(language)
hallo_unit(language, name)
interval = game_interval(language)
user_game(language, interval, name)
computer_game(language, interval)
print_record_2(language)
end_game = ask_yes_no(language, 1)
input("Push ENTER for exit")
main()
И архив с файлами: