gpt4 book ai didi

python - 为什么这个 python "War"纸牌游戏只玩了几局就卡住了?

转载 作者:太空宇宙 更新时间:2023-11-03 17:32:45 24 4
gpt4 key购买 nike

基本上,我试图测试玩家手中的牌的顺序如何影响他们获胜的频率,但我运行该程序,分数有时会卡在玩家 1 手中的 27 和 26 张牌之间交替,而玩家二交替持有 25 和 26 张牌,并且就这样坚持下去。

import random
import sys

class Card:
def __init__(self, rank, suit, value):
self.rank = rank
self.suit = suit
self.value = value
self.name = str(self.rank) + " of " + self.suit

def create_deck():
suit = ['Spades', 'Hearts', 'Clubs', 'Diamonds']
rank = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'Jack', 'Queen', 'King', 'Ace']
deck = []
num = 2
for i in suit:
for x in rank:
deck.append(Card(x, i, num))
num = num + 1
num = 2

return sorted(deck, key=lambda k: random.random())

def deal_cards(deck):
x = 0
i = 0
player1 = []
player2 = []
while i < len(deck):
if x == 0:
player1.append(deck[i])
x = 1
else:
player2.append(deck[i])
x = 0
i += 1
return player1, player2

def game():
pl1wins = 0
pl2wins = 0
while (pl1wins + pl2wins) <= 50:
deck = create_deck()
players = deal_cards(deck)
player1 = players[0]
player2 = players[1]

player1 = sorted(player1, key=lambda card: card.value)
war = []

turns = 0
while len(player1) > 0 and len(player2) > 0:
turns = turns + 1
#print turns
#print str(len(player1))+ " : " + str(len(player2))
if (len(player1) + len(player2)) > 52:
print "Oh NO!"
sys.exit()
war = []
war.append(player1[0])
war.append(player2[0])

player1.remove(player1[0])
player2.remove(player2[0])
if war[0].value > war[1].value:
#print "Player 1 wins the " + war[1].name
i = 0
n = len(war)
while i < n:
player1.append(war[0])
war.remove(war[0])
i = i + 1

elif war[0].value < war[1].value:
#print "Player 2 wins the " + war[0].name
i = 0
n = len(war)
while i < n:
player2.append(war[0])
war.remove(war[0])
i = i + 1

elif war[0].value == war[1].value:
if len(player1) == 0:
player1.append(war[0])
war.remove(war[0])
if player1[0].value == player2[0].value:
player1[0].value = 0
if len(player2) == 0:
player2.append(war[1])
war.remove(war[1])
if player1[0].value == player2[0].value:
player2[0].value = 0
while len(war) > 0:
#print "The cards have tied, war will commence"

i = 0
for i in range(3):
if len(player1) > 1:
war.append(player1[0])
player1.remove(player1[0])

if len(player2) > 1:
war.append(player2[0])
player2.remove(player2[0])

if player1[0].value > player2[0].value:
war.append(player1[0])
war.append(player2[0])
player1.remove(player1[0])
player2.remove(player2[0])
i = 0
n = len(war)
while i < n:
player1.append(war[0])
war.remove(war[0])
i = i + 1
elif player1[0].value < player2[0].value:
war.append(player1[0])
war.append(player2[0])
player1.remove(player1[0])
player2.remove(player2[0])
i = 0
n = len(war)
while i < n:
player2.append(war[0])
war.remove(war[0])
i = i + 1

#print turns
if len(player1) != 0:
print "Player1 wins!"
pl1wins = pl1wins + 1
elif len(player2) != 0:
print "Player2 wins!"
pl1wins = pl2wins + 1
print pl1wins + " versus " + pl2wins
game()

最佳答案

感谢@Engineero 的评论:

There are possible infinite games in War, provided you do not switch the order in which player's cards are added to the bottom of the winning player's deck (i.e. always opponent's card first, then yours or vice versa). See this MathOverflow discussion. Basically for some deals, the game never ends. You could add occasional switching to the order that cards are returned to the bottom of the deck to make it finite. – Engineero

这让我找到了这个解决方案:

基本上,我随机地将哪张卡首先放入堆中,如下所示:

        if random.randint(1,2) == 1:
war.append(player2[0])
war.append(player1[0])
else:
war.append(player1[0])
war.append(player2[0])

这完美地解决了问题。

关于python - 为什么这个 python "War"纸牌游戏只玩了几局就卡住了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31655788/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com