Есть ли Python, эквивалентный серьезному акценту в скриптах bash? - PullRequest
0 голосов
/ 17 сентября 2011

Мне не нравится использовать много операторов IF. Вот то, с чем я сейчас играю, в мире необходимости использовать много операторов IF для этого:

Сначала несколько переменных ...

pick_level = 1
lockpicking_level1_maxxp = 40
lockpicking_level2_maxxp = 70
lockpicking_level3_maxxp = 100

Теперь мы можем взломать замок. Успешный выбор происходит, когда выбрано случайное число от 1 до чего-либо, вплоть до максимального xp текущего уровня навыка взлома, деленного на 2. Так что для уровня 1 это что-то между 1 и 20 - уровень 2, что-то между 1 и 35 и уровень 3, что-то между 1 и 50. Вот как это будет выглядеть с операторами IF:

x = random.randint(1, 100)
if pick_level == 1:
  if x not in range(1, (lockpicking_level1_maxxp / 2)):
    print 'You failed to pick the lock'
    ...
elif pick_level == 2:
  if x not in range(1, (lockpicking_level2_maxxp / 2)):
    etcetc

Что я хотел бы сделать, так это определить xp на основе значения pick_level и не выполнять кучу операторов IF, задающих один и тот же вопрос снова и снова. Это будет выглядеть примерно так (используя серьезные акценты, как в bash):

if x not in range(1, (lockpicking_level`pick_level`_maxxp / 2)):

Таким образом, я могу избежать всех операторов IF, если код автоматически станет 'lockpicking_level1_maxxp', 'lockpicking_level2_maxxp' или 'lockpicking_level3_maxxp' на основе любого значения pick_level.

Прошло уже много времени с тех пор, как я делал bash-скрипты, поэтому моя память о том, как это работает, может быть немного не такой. Также я знаю, что `` в Python до версии 3 - это то же самое, что и использование repr (), так что это не то, как это сделать. Есть ли способ, которым я могу это сделать, или я застрял, писать повсюду некрасивые заявления IF?

Полагаю, я мог бы использовать диктовку как таковую:

lockpicking_maxxp = {1:20, 2:35, 3:50}
...
if x in range(1, lockpicking_maxxp[pick_level]):

... но я не знаю, буду ли я именно таким образом настраивать свою базу данных навыков (хотя , вероятно, окажется файлом JSON. Я люблю JSON.)

Большое спасибо за ваше время. Я с нетерпением жду возможности узнать больше об этой идее.

Ответы [ 3 ]

4 голосов
/ 17 сентября 2011

Не повторяйся .Максимально используйте структуры данных вместо отдельных объектов:

lockpicking_maxxp = {
    1: 40,
    2: 70,
    3: 100
}

x = random.randint(1, 100)
if x > lockpicking_maxxp[pick_level] / 2:
    print 'You failed to pick the lock'
    ...

Конечно, у вас, вероятно, есть другие навыки в этой игре, поэтому вы можете захотеть что-то более похожее на:

maxxp = {
    'lockpicking': {
        1: 40,
        2: 70,
        3: 100
    }, 'trap_searching': {
        1: 50,
        ...
    }, ...
}

skill = 'lockpicking'
x = random.randint(1, 100)
if x > maxxp[skill][level[skill]] / 2:
    print 'You failed to pick the lock'
    ...
2 голосов
/ 17 сентября 2011

Всякий раз, когда вы чувствуете необходимость добавить числа к вашим переменным, вы, вероятно, должны просто использовать список:

pick_level = 1
lockpicking_levels = [0,40, 70, 100]

test = random.randint(1, 100)

if test < lockpicking_levels[pick_level] / 2:
    print "you failed"
else:
    ...
2 голосов
/ 17 сентября 2011

Вы можете использовать locals () , чтобы получить локальную таблицу символов в качестве dict и использовать ее для получения значения переменной.т.е.:

>>> pick_level = 1
>>> lockpicking_level1_maxxp = 40
>>> lockpicking_level2_maxxp = 70
>>> lockpicking_level3_maxxp = 100
>>> locals()["lockpicking_level%d_maxxp" % pick_level]
40
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...