2012-11-14 23 views
0

我正在寫一個玩戰爭紙牌遊戲的程序。每個玩家都有一套牌,我已經得到它隨機處理罰款。我需要它能夠比較列表中的兩個值,並根據它們的整數值做一些事情。我寫的代碼如下:什麼是無法修復的錯誤,爲什麼我無法比較列表中的值?

from random import * 
def main(): 
    cards = [1,2,3,4,5,6,7,8,9,10,11,12]*4 
    p1 = [] 
    p2 = [] 
    while len(cards) != 0: 
     m = randint(0,len(cards)) 
     p1.append(cards[m-1]) 
     del cards[m-1] 
     n = randint(0,len(cards)) 
     p2.append(cards[n-1]) 
     del cards[n-1] 
    print(p1, p2) 
    def game(): 
     if p1[0] > p2[0]: 
      p1.append(p2[0]) 
      del p2[0] 
     elif p2[0] > p1[0]: 
      p2.append(p1[0]) 
      del p1[0] 
     else: 
      if len(p1) > len(p2): 
       print(p1, p2) 
       for i in range(1,len(p2)): 
        if int(p1[i]) > int(p2[i]): 
         p1.append(p2[0:i]) 
         del p2[0:i] 
        if int(p2[i]) > int(p1[i]): 
         p2.append(p1[0:i]) 
         del p1[0:i] 
        else: 
         continue 
      else: 
       print(p1, p2) 
       for i in range(1,len(p2)): 
        if int(p1[i]) > int(p2[i]): 
         p1.append(p2[0:i]) 
         del p2[0:i] 
        if int(p2[i]) > int(p1[i]): 
         p2.append(p1[0:i]) 
         del p1[0:i] 
        else: 
         continue 
    while len(p1) > 0 and len(p2) > 0: 
     game() 
    print("player 1 has", p1, " and player 2 has ", p2) 
    if len(p1) == 0: 
     print("Player 2 wins") 
    elif len(p2) == 0: 
     print("Player 1 wins") 
    input("Press enter to exit") 

但是,每次我運行它都會很好地運行,直到它得到一條平行線。只要比較除前兩個值以外的任何值,就會打印此錯誤:

Traceback (most recent call last): 
    File "<pyshell#12>", line 1, in <module> 
    main() 
    File "C:\Users\Jesse\Documents\Jesse\homework\Computer Science\Programs\War.py", line  52, in main 
    game() 
    File "C:\Users\Jesse\Documents\Jesse\homework\Computer Science\Programs\War.py", line  32, in game 
    if p1[i] > p2[i]: 
TypeError: unorderable types: int() > list() 

這是什麼意思?比較前兩者和其他兩者有什麼區別?

+0

聽起來就像你在比較列表和一個整數,因爲顯而易見的原因沒有意義。相關的代碼不會以錯誤顯示的方式顯示在代碼中,因此很難幫助您... – ThiefMaster

+1

如果p1 [i]> p2 [i]:'代碼中有'... – martineau

回答

2

好像你正在使用Python3。 Python2將允許您比較int和列表,但它不是非常有用,並會掩蓋一個錯誤就像你在這裏

我想也許你的意思是使用extend這裏

    p1.append(p2[0:i]) 

這裏

    p2.append(p1[0:i]) 

,而不是append

0

您有從該線(及其變種)衍生問題:

p1.append(p2[0:i]) 

這樣做是從列表p2片追加到的p1結束。也就是說,它會添加一個新列表作爲現有列表的成員。當您嘗試在一個列表中的一個整數和另一個列表中的一個子列表之間進行比較時,這會造成麻煩。

取而代之,您想要使用extend這會將切片的成員添加到其他列表的末尾。

p1.extend(p2[0:i]) # note that the 0 here is not necessary! 

這應該解決這個問題。

+0

非常感謝,這非常有幫助。 –

1

一些雜項。提示(儘管你有直接問題的答案):

m = randint(0,len(cards)) 
p1.append(cards[m-1]) 
del cards[m-1] 

你正在爲自己在這裏創造工作。在random模塊中有一個方便的功能,名爲randrange,這意味着您不必擔心減去一個(這可能意味着如果您得到0,那麼您將擁有-1,這是列表的最後一個元素,並且導致的問題(例如,你固定在甲板上))...此外,list■找一個方便的方法稱爲pop從列表中刪除元素從某個位置,因此上述可能是:

p1.append(cards.pop(randrange(len(cards)))) 

但是,因爲你正在處理卡,這有一個很恰當地命名法(又隨機),稱爲shuffle

from random import shuffle 

cards = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ,12] # * 4 
shuffle(cards) 
# [3, 4, 11, 9, 6, 2, 12, 5, 8, 1, 10, 7] 

使用這個,你可以做更少的「手動工作」,所以讓我們來處理卡...:

>>> p1hand, p2hand = cards[::2], cards[1::2] 
>>> p1hand 
[3, 11, 6, 12, 8, 10] 
>>> p2hand 
[4, 9, 2, 5, 1, 7] 
相關問題