2

我对编码和 Python 很陌生。我正在用 Python 制作一个简单的“选择你的冒险”类型的游戏。游戏的整个目标是进入所有 4 个房间/门并获得所有 4 位密码以进入锁着的门,从而通往宝藏。这就是我用来在代码中添加数字的方法:

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 的挑战完成并且在代码中添加了一个数字,有没有办法不让用户从门 1 的 add_code() 函数中添加另一个数字?

4

4 回答 4

2

将每个挑战与一个布尔标志相关联。当玩家完成挑战时将标志设置为 True,并在让玩家选择再次挑战之前检查标志。

例如,如果您有一个“打猴子”任务,您可能有以下标志:

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")
于 2013-07-15T04:05:55.030 回答
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]
于 2013-07-15T04:15:23.373 回答
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)
于 2013-07-15T04:10:44.360 回答
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)

您还可以做的一件事是,例如拥有两个具有相同挑战的房间,如果您选择其中一个。两者都应标记为“完成”。然后给两个房间相同的唯一标识符

这很简单,但我猜应该在你的情况下完成这项工作。

解释

而不是使用布尔值,我宁愿使用uuids. 它可以是字符串或其他。它必须是能够识别单个挑战的标识符。例如['room1', 'room2', 'room3', 'room4']

set防止您添加不止一次的元素。布尔值的问题在于它使用起来不太灵活。您必须为挑战创建n变量。n添加更多挑战不会很干净。当您的挑战少于 5 个时,它应该可以正常工作,但如果您想添加更多,拥有一个记录您已完成的挑战的集合会好得多。

该系列的另一个好处是,您将了解用户已经完成的挑战。

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

对于布尔值,您必须遍历所有硬编码的布尔值,这将随着时间的推移变得更加难以处理。

于 2013-07-15T04:21:33.150 回答