@Nimachakin

Интересует соотношение задач программы к её объёму. Возможно как-то оптимизировать код?

Python начал изучать не так давно. Видел на обучающем сайте код игры "блекджек". Решил смастерить что-то своё.
Просьба к опытным ребятам - укажите на неявные ошибки. Где может какие альтернативные методы/функции использовать. Или всё так и должно выглядеть?
import random

life = 4
count = 0
yes = 'Верно'
no = 'Ответ неверный'


print('Суть этой игры такова: вы указываете любое целое число x, программа выбирает случайную'
      ' величину и выводит на экран результат одно из четырёх действий. Ваша задача - указать'
      ' арифметический знак действия (сложение (+), вычитание (-), умножение (*), деление (/)),'
      ' полагаясь на результат. 10 Правильных ответов приведут вас к победе.')


while life > 0 and count == 0:
    game = input('Играем? да/нет: ')


    if game == 'да':
        while life > - 1 and count < 10:
            try:
                x = int(input('Введите х: '))
            except ValueError:
                print('Введите целое число')
            except TypeError:
                print('Введите целое число')


            else:
                i = random.randint(1, 5)
                y = random.choice([x + i, x - i, x * i, x / i])
                print('Случайная величина = ', i)
                print('Результат действия = ', y)


                if y:
                    action = input('Что это было за действие?: ')
                    if action == '+' and y == x + i:
                        print(yes)
                        count += 1
                    elif action == '-' and y == x - i:
                        print(yes)
                        count += 1
                    elif action == '*' and y == x * i:
                        print(yes)
                        count += 1
                    elif action == '/' and y == x / i:
                        print(yes)
                        count += 1
                    else:
                        print(no)
                        life -= 1
                        print('Прав на ошибку - ', life)


                if count == 10:
                    print('Вы - победитель')
                    break
                elif life == -1:
                    print('К сожалению, вы проиграли.')


                    while True:
                        new_try = input('Желаете попробовать ещё раз? да/нет: ')
                        if new_try == 'да':
                            life = 4
                            count = 0
                            continue
                        elif new_try == 'нет':
                            print('Тогда может в следующий раз.')
                            break
                        else:
                            print('Нужно написать "да" или "нет"')
            

    elif game == 'нет':
        print('Как пожелаете.')
        break
    else:
        print('Нужно написать "да" или "нет"')
        


print('Всего хорошего.')
  • Вопрос задан
  • 344 просмотра
Пригласить эксперта
Ответы на вопрос 2
bobrovskyserg
@bobrovskyserg
Явных ошибок не вижу, рабочий код. Разве что "except TypeError" лишено смысла.
По мелочам:
while life > 0 and count == 0:
не следует сравнивать с нулём: все встроенные типы могут возвращать логическое значение, будучи об этом спрошены условным оператором :)
Например:
if not []:
   print('[] вернул False')
if [1, 2, 3]:
   print('[1, 2, 3] вернул True')

Для чисел - 0 возвращает False

Ну и основной цикл я бы подужал :)
......
            else:
                i = random.randint(1, 5)
                ch, y = random.choice((('+', x + i), ('-', x - i), ('*', x * i), ('/', x / i)))
                print('Случайная величина = ', i)
                print('Результат действия = ', y)
                if input('Что это было за действие?: ') == ch:
                    print(yes)
                    count += 1
                else:
                    print(no)
                    life -= 1
                    print('Прав на ошибку - ', life)
            if count == 10:
......
Ответ написан
Kademn
@Kademn
Злой
А что по-вашему оптимизация, позвольте осведомиться? Это не однозначный вопрос. Вы спрашиваете про код?
Да, это рабочий код, но он выглядит плохо. Нет, простите, он выглядит ужасно. Самое первое что необходимо уяснить - никогда ничего не писать (если вы точно не понимаете зачем) в основной области файла. Все должно быть разбито на функции. Этих немыслимых уезжающих вправо try - except - else - if, вложенных друг в друга через if'ы while True циклов и прочей, извините, лапши не случилось, если бы вы использовали функции для повторяющихся участков кода и вызывали бы их.
Вот пример без нагромождения if'ов. Он не идеален, в первую очередь потому что он может быть сложен для прочтения, но он таков для большей компактности и потому, что в нем использованы некоторые "альтернативные" методы, которые могли бы использовать вы и о которых вы вопрошали:
# coding: utf-8

import random


def ask(message, known_answers=['нет', 'да'], yes_no=True):
    answer = '\n'
    while answer not in known_answers: 
        answer = input(message)
        if answer not in known_answers:
            print('Возможные варианты: ', ' '.join(known_answers))
    return known_answers.index(answer) if yes_no else answer

def game():
    # supporting function
    def _input_x():
        x = None
        while x is None:
            try:
                x = int(input('Введите x: '))
            except ValueError:
                print('Введите целое число')
        return x
    # messages
    answers = ['Ответ неверный', 'Верно']
    is_winner = ['К сожалению, вы проиграли', 'Вы - победитель']
    # actions
    actions = {'+': lambda x, i: x+i,
               '-': lambda x, i: x-i,
               '*': lambda x, i: x*i,
               '/': lambda x, i: x/i
              } 
    # initial values
    life = 4
    count = 10
    
    # main loop
    while life and count:
        # condition
        x = _input_x()
        i = random.randint(1, 5)
        print('Случайная величина = ', i)
        random_action = random.choice(list(actions.keys()))
        y = actions[random_action](x, i)
        print('Результат действия = ', y)
        
        # answer
        answer = ask('Что это было за действие?: ',
                     known_answers=list(actions.keys()), yes_no=False)
        # result
        result = actions[answer](x, i) == y
        print(answers[result])
        if result:
            count -= result
        else:
            life -= not result
            print('Прав на ошибку - ', life)
    
    # game result    
    print(is_winner[bool(life)])

def run():
    print('Суть этой игры такова: вы указываете любое целое число x, программа выбирает случайную'
      ' величину и выводит на экран результат одно из четырёх действий. Ваша задача - указать'
      ' арифметический знак действия (сложение (+), вычитание (-), умножение (*), деление (/)),'
      ' полагаясь на результат. 10 Правильных ответов приведут вас к победе.')
    while ask('Играем? да/нет: '):
        game()
    print('Всего хорошего')


if __name__ == '__main__':
    run()


Если разберетесь как он работает, вы научитесь новому.
Если я показался грубым или заносчивым - извините.
Если будут вопросы - пишите, постараюсь ответить.
Если..
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы