2013-07-15 17 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的挑戰已經完成並且數字已經添加到代碼中,是否有辦法不讓用戶在門1的add_code()函數中添加另一個數字?

回答

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

謝謝! :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

爲什麼這個downvoted請連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) 

另外一兩件事你可以做的是有爲例兩個房間是相同的挑戰,如果你做他們其中的一個。兩者都應該標記爲「完成」。然後給兩個房間相同的唯一標識符

這很簡單,但應該在你的情況下做我的工作。

解釋

而不是使用布爾值,我寧願使用uuids。它可以是字符串或其他。它必須是能夠識別單個挑戰的標識符。例如['room1', 'room2', 'room3', 'room4']

set阻止您添加多個元素。布爾值的問題在於它使用起來不夠靈活。您必須爲n挑戰創建n變量。增加更多挑戰並不會很乾淨。當你的挑戰少於5個時,它應該可以正常工作,但如果你想增加更多的話,有一套能夠跟蹤你所做挑戰的組合會好得多。

關於此組的其他好東西,就是你有哪些挑戰已經完成了用戶一個不錯的主意。

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

蒙山布爾值,你必須遍歷所有硬編碼的布爾值將得到多少更難有時間來處理。

+0

我明白這是如何工作的。謝謝回答!但個人而言,整個布爾假/真的事情對我來說更有意義。不過謝謝你! –

+0

對於布爾類型來說,它不是很靈活,而且更難擴展。我添加了一個解釋btw。 –