Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 15, 2019 13:20:11

rami
Зарегистрирован: 2018-01-08
Сообщения: 280
Репутация: +  71  -
Профиль   Отправить e-mail  

Оценить, понять, простить.

Babay82
В моем коде это прописано условием
elif response <= 1 or response >= interval:
print(“Это число вне диапазона, пожалуйста введите другое!”)
Это совершенно не нужный код, можно сказать, лишнее (и поэтому не нужное) подтверждение. В функции user_game() в строке:
 response = ask_number("\n\n\tНазывай число в заданном диапазоне.", interval)
вы обращаетесь к функции ask_number() чтобы она получила от пользователя ответ удовлетворяющий определённым условиям, среди них: ответ должен быть числом и находиться в указанном диапазоне. Функция ask_number() делает свою работу, а не дурака валяет . Функции user_game() остаётся только узнать больше, меньше или равно задуманное число чем ответ пользователя, посчитать попытки и передать успешный ответ в функцию records_list_4() для записи в файл.

Офлайн

#2 Апрель 16, 2019 10:11:20

Babay82
Зарегистрирован: 2019-02-19
Сообщения: 39
Репутация: +  0  -
Профиль   Отправить e-mail  

Оценить, понять, простить.

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
Потом я её подправил, а условия из user_game() убрать не сообразил, недотепа

Офлайн

#3 Апрель 16, 2019 11:32:15

rami
Зарегистрирован: 2018-01-08
Сообщения: 280
Репутация: +  71  -
Профиль   Отправить e-mail  

Оценить, понять, простить.

Сейчас ваш код должен значительно отличаться от опубликованного в начале поста, покажите полный код со всеми внесёнными изменениями.

Офлайн

#4 Апрель 21, 2019 09:12:48

Babay82
Зарегистрирован: 2019-02-19
Сообщения: 39
Репутация: +  0  -
Профиль   Отправить e-mail  

Оценить, понять, простить.

С учетом ваших пожеланий был проведен рефакторинг. Основные ( и самые трудоемкие) изменения коснулись интерфейсной части программы. В частности , теперь все сообщения выводящиеся на экран, загружаются не из основного кода. Какие файлы используются для этого обычно(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()
И архив с файлами:

Прикреплённый файлы:
attachment угадай число.rar (8,8 KБ)

Офлайн

#5 Апрель 21, 2019 09:25:45

Babay82
Зарегистрирован: 2019-02-19
Сообщения: 39
Репутация: +  0  -
Профиль   Отправить e-mail  

Оценить, понять, простить.

Извиняюсь. функция 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
В первом варианте тоже работает, но не совсем корректно)

Офлайн

#6 Апрель 21, 2019 12:46:31

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2730
Репутация: +  183  -
Профиль   Отправить e-mail  

Оценить, понять, простить.

Babay82 Для интернационализации существует модуль gettext, а для определение локали модуль locale, с ними разберись.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Апрель 21, 2019 12:48:21)

Офлайн

#7 Апрель 21, 2019 13:10:24

Babay82
Зарегистрирован: 2019-02-19
Сообщения: 39
Репутация: +  0  -
Профиль   Отправить e-mail  

Оценить, понять, простить.

Rodegast
Спасибо
Тут кстати задача именно интернационализации не стояла. Но к сведению принял.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version