0

War the card game をプレイするプログラムを書いています。各プレイヤーはカードのセットを持っており、私はそれをランダムに配るようにしました。リスト内の 2 つの値を比較し、それらの整数値に応じて何かを実行できるようにする必要があります。私は次のようにコードを書きました:

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")

しかし、実行するたびに、引き分けになるまで問題なく動作します。最初の 2 つ以外の値を比較するとすぐに、次のエラーが出力されます。

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()

これは何を意味するのでしょうか?そして、最初の 2 つと他の 2 つを比較することの違いは何ですか?

4

3 に答える 3

2

Python3を使用しているようです。Python2 では int と list を比較できますが、あまり有用ではなく、ここにあるようなバグを隠してしまいます

extendおそらくここで使用するつもりだと思います

                    p1.append(p2[0:i])

そしてここ

                    p2.append(p1[0:i])

それ以外のappend

于 2012-11-14T08:10:35.697 に答える
1

その他のカップル。ヒント(ただし、直接の質問に対する回答があります):

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

あなたはここで自分のために作品を作っています。randomというモジュールには便利な関数があり、randrangeこれは 1 を引くことを心配する必要がないことを意味します (ちなみに、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]
于 2012-11-14T08:19:01.560 に答える
0

発生している問題は、次の行 (およびそのバリアント) から派生しています。

p1.append(p2[0:i])

p2これが行うことは、リストのスライスを の最後に追加することですp1。つまり、既存のリストのメンバーとして新しいリストを追加します。これは、あるリストの整数と別のリストのサブリストを比較しようとしたときに、後で問題を引き起こします。

代わりにextend、スライスのメンバーを他のリストの最後に追加する which を使用します。

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

これで問題が解決するはずです。

于 2012-11-14T08:11:44.993 に答える