2013-07-15 2 views
2

Я очень новичок в кодировании и Python. Я делаю простую игру «выбирай свое приключение» в Python. Весь объект игры состоит в том, чтобы ввести все 4 комнаты/двери и приобрести все 4 цифры секретного кода, чтобы войти в запертую дверь, что ведет к сокровищу. Это то, что им с помощью добавления цифры к коду:Как отключить/ограничить строку кода после ее запуска? (Python)

from random import choice 

code = range(10) 
my_code = [] 

def add_code(): 
    if len(my_code) < 4: 
     code_digit = choice(code) 
     my_code.append(code_digit) 

Так что для каждой комнаты, у меня есть головоломки и проблемы, чтобы победить. Если вы выполните вызов, я запустил функцию add_code(). То, что я хочу избежать, - это повторить попытку пользователя войти в ту же дверь, выполнить ту же задачу и добавить цифру в список, даже не открывая какую-либо другую дверь или не выполняя никаких других задач. Есть ли способ сделать определенную строку кода не запущенной после того, как она уже была запущена один раз? Например, если вызов двери 1 был завершен, и цифра была добавлена ​​в код, есть ли способ не дать пользователю добавить еще одну цифру из функции add_code() от двери 1?

ответ

1

Связать каждый вызов булевым флагом. Установите флаг «Истина», когда игрок завершит вызов, и отметьте флаг перед тем, как дать игроку возможность снова выполнить вызов.

Например, если у вас есть «пробивные обезьяны» квесты, вы можете иметь следующий флаг:

monkeys_punched_yet = False 

Когда игрок ударяет обезьяна, вы бы установить

monkeys_punched_yet = True 

В в области обезглавливания вы проверили бы что-то вроде этого:

if monkeys_punched_yet: 
    description_text = ("You see a pile of bruised and battered monkeys " 
         "in a corner of the room.") 
else: 
    description_text = "You see a group of unsuspecting, punchable monkeys." 
    options.append("punch monkeys") 
+0

Спасибо за ответ! Но не могли бы вы немного разобраться? Как я уже сказал, я очень новичок во всех этих вещах ... –

+0

@ user2565883: Добавлена ​​дальнейшая разработка. – user2357112

+0

Thankyou! : D Мне жаль, что я не смог бы поддержать вас, но мой недостаток репутации говорит нет. Кстати, любите вызов. Я просто могу использовать его ха-ха. –

0

Вы можете проверить, не найден ли новый код еще не внесены в список заполненных кодов.

def add_code(): 
    if len(my_code) < 4: 
     code_digit = choice(code) 
     if (code_digit in my_code): 
      print("Already visited that room") 
     else: 
      my_code.append(code_digit) 
+0

Но число, добавленное в my_code, выбирается случайным образом из цифр 0-9, поэтому не было бы способа узнать, была ли это определенная комната, которая добавила эту цифру. :( –

0

Используйте булевы:

door1 = False 
door2 = False 
door3 = False 
door4 = False 

После того, как вы выполнили задачу в одну дверь, установить соответствующую дверь True. Затем вы захотите иметь какой-то центр для отображения каждой двери. Подумайте в игре, как вы находитесь в центральной комнате, и вы окружены четырьмя дверями. Ваш код будет выглядеть примерно так:

which_door = raw_input('Which door do you want to enter? ') 
if which_door == "1": 
    if door1: # This is short for "if door1 is True" 
     print "You have already completed this challenge." 
    else: # Otherwise, it is set to False. The challenge has not been started 
     do_stuff() 
     door1 = True 
etc for each door... 

Кстати, есть более простой способ сделать произвольный код:

>>> random.sample(range(10), 4) 
[3, 4, 0, 1] 
+0

Да, у меня есть центральная комната со всеми видами выбора, т. Е. (Введите дверь 1, осмотритесь, попробуйте и убегите), и это было именно то, что я искал для этого. Спасибо! –

+0

Мне это нравится. гораздо более аккуратный способ добавить код. Еще раз спасибо! –

+0

Почему это было приостановлено? Даже OP прокомментировал, что это решение – TerryA

0

Что вы можете сделать, это делает добавление завершенных вызовов список завершенных задач. Каждая задача должна иметь уникальный идентификатор.

user.completed_challenges = set() 

При открытии вызов, проверьте, если проблема находится в списке завершенных вызов

if not challenge.uuid in user.completed_challenges: 
    # do code 

    # When everything is done add the uuid to challenges 
    user.completed_challenges.add(challenge.uuid) 

Также одна вещь, которую вы могли бы сделать, это иметь для Exemple две комнаты, которые являются такими же проблемой, если вы делаете один из них. Оба они должны быть отмечены как «сделанные». Затем дайте обе комнате тот же уникальный идентификатор

Это довольно просто, но я должен делать эту работу в вашем случае.

объяснения

Вместо того, чтобы использовать булевы, я предпочел бы использовать uuids. Это могут быть строки или что угодно. Он должен быть идентификатором, который способен идентифицировать отдельные проблемы. Например, ['room1', 'room2', 'room3', 'room4']

set не позволяет добавлять более одного раза элементы. Проблема с булевыми является то, что она не совсем гибкая в использовании. Вам нужно будет создать n переменных для n вызовов. Это не будет очень чисто, чтобы добавить больше проблем. Когда у вас меньше 5 задач, он должен работать нормально, но если вы хотите добавить еще больше, наличие набора, который отслеживает ваши проблемы, намного лучше.

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

print "You completed challenges %s" % ', '.join(user.completed_challenges) 

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

+0

Я вижу, как это сработает. Спасибо за ответ! Но лично, вся логическая False/True вещь имеет больше смысла для меня. Еще раз спасибо! –

+0

С булевы он не очень гибкий и будет сложнее расширить. Я добавил объяснение кстати. –