2016-06-27 53 views
0

我在使用for循環進行二十一點遊戲模擬時遇到了一些麻煩。功能new_game模擬四張牌被髮放,而new_card確保在遊戲中沒有牌被重複。我創建了函數new game的兩個變體,並想知道它們有何不同。二十一點遊戲:for循環'不在'vs'in'

在版本1中,有些情況下函數只返回3張卡片,而版本2似乎按預期工作。

版本1:

def new_game(): 
game=[]; 
for x in range(4): 
    n=new_card(); 
    if n not in game: 
     game+=[n]; 
    else: 
     new_game(); 
    print(game); 
return game 

版本2:

def new_game(): 
game=[]; 
for x in range(4): 
    n=new_card(); 
    if n in game: 
     new_game(); 
     print(game); 
    else: 
     game+=[n]; 
return game 
+0

這裏供您參考的是'new_card'函數。 (): \t s = ['s','c','d','h']; \t n =列表(範圍(1,14)); \t return [random.choice(s),random.choice(n)]; ' – st4rgut

+0

不明白爲什麼'new_game()'在new_card()不能生成唯一卡時遞歸調用。我認爲代碼應該調用'new_card()'直到循環迭代生成一個唯一的代碼。你怎麼看? –

+0

好的,謝謝你指出。我打算說'new_game'檢查重複卡片。當找到重複的卡時,該功能重新開始。好像'new_game()'起作用了,但是你認爲調用'new_card()'會更有效率嗎? – st4rgut

回答

1

調用new_game是不是解決這個項目的最佳途徑。你可以嘗試多種方式,其中一種我正在展示。嘗試檢查列表的長度,直到它具有所需的長度,而不是循環的常量。

def new_game(): 
    game=[]; 
    while len(game)!=4: 
     n = new_card() 
     while(n in game): 
      n = new_card() 
     else: 
      game.append(n) 
    return game 

print new_game() 

我不確定這是不是一個好的設計,但它仍然有效,你可以修改它。

編輯

感謝Blckknght爲暗示這一點。

def new_game(): 
    game=[] 
    while len(game)!=4: 
     n = new_card() 
     if n not in game: 
      game.append(n) 
    return game 

print new_game() 
+0

我想你想要'n = new_card()'在內部循環中。否則,如果第一個選擇是重複的,那麼你將永遠運行,因爲'n'不會改變。 – Blckknght

+0

我不明白你的意思。第一個選擇如何重複,「遊戲」列表最初是空的。雖然我修改了。請看看你是否認爲這是正確的。謝謝指出。 – formatkaka

+2

「first pick」是指外部'while'循環中的'n = new_card()'行(與內部循環中的pick相反)。它只會發生在外層循環的後續過程中。但實際上,因爲你已經將Questioner的'for'外層循環變成了'while',所以你實際上並不需要內層循環。你可以只有一個循環,並且'如果n不在遊戲中:game.append(n)'沒有'else'塊。 – Blckknght