Форум сайта python.su
Babay82Это совершенно не нужный код, можно сказать, лишнее (и поэтому не нужное) подтверждение. В функции user_game() в строке:
В моем коде это прописано условием
elif response <= 1 or response >= interval:
print(“Это число вне диапазона, пожалуйста введите другое!”)
response = ask_number("\n\n\tНазывай число в заданном диапазоне.", interval)
Офлайн
rami
Спасибо, действительно дурака свалял. ask_number() изначально другой вид имела
def ask_number(question, low = 1, higt = 100, interval = 1): """Просит ввести число из диапазона""" response = None while response not in range(low, higt, interval): response = int(input(question)) return response
Офлайн
Сейчас ваш код должен значительно отличаться от опубликованного в начале поста, покажите полный код со всеми внесёнными изменениями.
Офлайн
С учетом ваших пожеланий был проведен рефакторинг. Основные ( и самые трудоемкие) изменения коснулись интерфейсной части программы. В частности , теперь все сообщения выводящиеся на экран, загружаются не из основного кода. Какие файлы используются для этого обычно(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()
Прикреплённый файлы:
угадай число.rar (8,8 KБ)
Офлайн
Извиняюсь. функция user_choice() немного не корректна, вот поправил:
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 """))-1 # -1 переехал сюда except (TypeError, ValueError): print("Error!") lang = LANGUAGES[choice] # вот отсюда return lang
Офлайн
Babay82 Для интернационализации существует модуль gettext, а для определение локали модуль locale, с ними разберись.
Отредактировано Rodegast (Апрель 21, 2019 12:48:21)
Офлайн
Rodegast
Спасибо
Тут кстати задача именно интернационализации не стояла. Но к сведению принял.
Офлайн