2015-10-18 62 views
1

我是在撲克模擬器,並試圖確定這將確定一條直線,並給它的5檢查,連續5號

def straightCheck(playerHand): 
    playerHand.sort() 
    print(playerHand) 
    for playerHand in range(len(playerHand)): 
     for i in playerHand: 
      if playerHand[i] == playerHand [i+1] -1: 
       straight = True 
      else: 
       straight = False 
    if straight == True: 
     handstrength = 5 

x = [1,3,5,4,2] 
straightCheck(x) 

一個handstrength值我想不出一個功能的陣列什麼是錯誤的是,但它不斷返回此錯誤消息:

for i in playerHand: 
TypeError: 'int' object is not iterable 
+5

您正在用第一個for循環中的整數替換可能包含該手的playerhand參數。嘗試重命名該迭代器 –

+1

您正在遍歷不可迭代的整數對象。如果要檢測長度爲5的連續序列,最好使用'itertools.groupby'函數。 – Kasramvd

回答

2

首先您要遍歷一個整數的,不能(也不應該)來完成。看起來你的兩個嵌套for循環應該只是一個for,如for i in range(len(playerHand) - 1),當使用-1時,以便您不要嘗試訪問playerHand[len(playerHand)]

此外,由於您在每次迭代中將straight設置爲TrueFalse,因此只有最後一次迭代纔會計數,因此您會得到誤報。

最後,我不確定您是否希望您的函數爲return a值,但目前您的函數returns沒有數據(除非handstrength是全局變量)。此外,請注意,目前,通過使用.sort(),您實際上正在對playerHand進行排序,從而在功能範圍內對其進行了更改 - 這可能不是您想要的。

一個可能的函數來檢查是否有手是直的,類似於你的代碼,是這樣的:

def is_straight(playerHand): 
    playerHand.sort() 
    for i in range(len(playerHand) - 1): 
     if playerHand[i] != playerHand [i+1] - 1: 
      return False 
    return True 

該函數返回True如果playerHand是直的,並且False否則。

+0

對輸入參數進行排序可能不是一個好習慣,因爲該對象最終會結束在可能不是用戶期望的功能之外進行更改。用'playerHand = sorted(playerHand)'代替'playerHand.sort()'將使得列表僅在函數的範圍內排序。 – SethMMorton

+0

你是對的,但我試圖展示OP如何將他的代碼轉換成可用的代碼。我不確定他是否想要更改原始列表,但這是他原來的做法。 – dorverbin

+1

基於原始錯誤的性質,我認爲OP在這一點上不知道這種類型的錯誤。我只是想添加一些額外的幫助,因爲他們似乎是一個新的程序員。 – SethMMorton

0

這是怎麼回事。您對列表進行排序,然後將其轉換爲一個集合並返回到列表,這使得它是唯一的。那麼長度必須是5,如果是這樣,5個連續數字的最大值和最小值之間的差值必須是4.我不能在這裏數學證明這一點,但它應該是。 ;)

>>> x=[2,1,5,3,4] 
>>> y=sorted(x) 
>>> y=list(set(y)) 
>>> if len(y) == 5 and y[4]-y[0] == 4: 
...  print "straight" 
... 
straight 

這裏也看到這一點:Check for consecutive numbers

+0

但2,3,4,5,6應該是直的,不是嗎? – DSM

+0

哦,大概,你是對的。我不是那個pokerface。所以,你需要連續五次......在這種情況下,y [4] -y [0]應該總是返回4. – ferdy