Есть ли более эффективный способ написать действительно длинную цепочку «если элиф» в python? - PullRequest
0 голосов
/ 08 апреля 2020

Я довольно новичок в реальных языках программирования, и я использую Python, чтобы написать длинную цепочку elif, чтобы проверять переменные x и y как координаты, и в зависимости от координат она будет делать что-то другое. (Это для текстовой приключенческой игры)

Это то, что у меня есть сейчас, и мне было интересно, как я могу сделать это гораздо приятнее.

if x == 1 and y == 1:
    dothis()
elif x == 1 and y == 2:
    dothat()
elif x == 1 and y == 3:
    doANewThing()
elif x == 1 and y == 3:
    doSomethingDif()

За исключением того, что это появляется более 900 раз. Я ненавижу это. Пожалуйста, помогите.

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

Исходя из вашего краткого описания, у вас, вероятно, другая проблема, чем вы думаете =).

Например, если бы я писал программу для обработки первого хода шахматной игры, я бы не стал Запишите все 4096 опций в функции move(x, y, new_x, new_y).

Попробуйте взглянуть на словари или матрицу (список списка) и перейти к модели «поиск -> действие объекта». Например:


class Thing(object):
    DESCRIPTION = 'undescribable beauty'
    def describe(self):
        return self.DESCRIPTION

class Wall(Thing):
    DESCRIPTION = 'a plain old wall'

class Townsfolk(Thing):
    DESCRIPTION = 'an angry ten-year-old'

class Nothing(Thing):
    DESCRIPTION = 'only the darkness of your soul'

map = {}  # coordinate -> thing
# TODO: load this from ascii art
map[(0, 0)] = Wall()
map[(0, 1)] = Townsfolk()
map[(0, 2)] = Wall()

def look_at(pos):
    item = map.get(pos, Nothing())
    print("You see %s" % item.describe())
>>> look_at((0,0))
You see a plain old wall
>>> look_at((0,3))
You see only the darkness of your soul
1 голос
/ 08 апреля 2020

Я полагаю, что каждый из случаев представляет собой отдельную комнату в игре, и вы хотите вызывать разные функции для каждой комнаты.

Хорошим примером для этого является отделите ваши данные от кода . Рассматривайте координаты и функцию для каждой комнаты как data , извлеките их в какой-то список комнат. Все, что вам нужно для кода , это проверить координаты игрока, найти соответствующую функцию помещения и вызвать ее.

Данные

Словарь идеально подходит для поиска вещей , Давайте рассмотрим координаты x, y как ключи, а функции - как значения.

rooms = {
    (1, 1): dothis,
    (1, 2): dothat,
    (1, 3): doANewThing,
    (1, 4): doSomethingDif,
    # etc.
}

Обратите внимание, что имена функций не имеют скобок после них. Это dothis и dothat, а не dothis() и dothat(). Мы только перечисляем названия функций здесь; на самом деле мы их не называем.

Код

try:
    # Look up the function for the current room...
    room_function = rooms[(x, y)]

    # ...And call it.
    room_function()

# Error! Didn't find an entry for (x, y).
except KeyError:
    handle_error()

Что в этом хорошего, вы можете легко добавлять новые комнаты в словарь без необходимости писать какие-либо новые блоки if-else. На самом деле - это никаких блоков if-else!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...