如何从一副牌中获得最高牌的正确赢家

  • 本文关键字:高牌 赢家 一副 python
  • 更新时间 :
  • 英文 :


我从python开始,我正在尝试编写一个纸牌游戏,用户和计算机玩5轮。用户和计算机必须从我创建的牌组中随机获得一张牌,获胜者是拥有最高牌的那张。

我的代码有几个问题。

例如,当我创建整个甲板时;巴斯托斯;卡片:

"8 de bastos"9 de bastos"10 de bastos";以及";11 de bastos";而不是";sota de bastos""巴斯托斯小屋"雷·德·巴斯托斯;以及";作为de bastos";。

它只发生在";巴斯托斯;因为它是我在列表中的第一个变量。但我不知道如何解决这个问题。

然后我对结果也有一个问题:

Tu carta es caballo de oros > Your card is King of Gold
La carta del ordenador es sota de espadas > Your card is Jokey of Spades 
Esta ronda la ha ganado el ordenador. > The computer has won this round. 

所以我的程序说,当电脑不正常时,它就赢了

我在画画方面也有类似的问题。我的程序不识别任何平局,例如:

Tu carta es 5 de espadas > Your card is 5 of spaces
La carta del ordenador es 5 de copas > Computer's card is 5 of coups. 
Has ganado. > You have won. 

这是我迄今为止的全部代码:

import random
print("Who will be the best out of 5 rounds?")
contador_humano = 0
contador_ordenador = 0
rondas = 0
while rondas < 5:
rondas = rondas + 1
print("nRounds", rondas)
palos = ["bastos", "copas", "espadas", "oros"]
num = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
baraja = []
for n in num:
for palo in palos:
carta = "{} de {}".format(n,palo)
for c in carta:
if n == 8:
n = sota
elif n == 9:
n = "caballo"
elif n == 10:
n = "rey"
elif n == 11:
n = "as"
baraja.append(carta)
random.shuffle(baraja)
input("nPress enter to shuffle.")
print(baraja)
carta_humano = random.choice(baraja)
print("nThis is your card", carta_humano)
baraja.remove(carta_humano)
carta_ordenador = random.choice(baraja)
print("This is the computer card", carta_ordenador)

if carta_humano > carta_ordenador:
contador_humano += 1
contador_ordenador += 0
print("nYou have won this round.")
elif carta_humano == carta_ordenador:
contador_humano += 0
contador_ordenador += 0
print("nThis is a draw.")
else:
contador_humano += 0
contador_ordenador += 1
print("nThe computer has won this round.")
baraja.append(carta_humano)
random.shuffle(baraja)
print("nFinal score:", contador_humano, " - ", contador_ordenador)

if contador_humano > contador_ordenador:
print("You win!")
elif contador_humano == contador_ordenador:
print("It is a draw.")
elif contador_humano < contador_ordenador:
print("You lose.")

一些问题:

  • for c in carta将迭代carta的每个字符。这不是你想要的
  • 在为carta赋值之后更改n不会更改carta
  • 当比较carta_humano > carta_ordenador时,您正在比较这些字符串,因此例如";rey";将被视为大于";作为";。你需要比较卡片的数值
  • "sotas";必须报价

我建议为卡片创建一个类,它就像一个具有秩和适合属性的元组,并且有一个__repr__方法,该方法将负责生成";漂亮的";名称通过将其定义为元组,顺序基于第一个成员(秩(,这正是我们所需要的。

我也不会洗牌随机选择一张牌。如果你已经洗牌了,你可以拿最后一张牌。这就像选择一个随机的一样随机。你把选中的牌放回了牌组,但在我看来这太过分了。有足够打5轮的牌,所以不用麻烦把它们放回去。但这只是我的看法。这对你的问题并不重要。

最后的elif可以只是else,因为只剩下一种可能性。

以下是它的工作原理:

import random
from collections import namedtuple
class Card(namedtuple('Card', ['rank', 'suit'])):
def __repr__(self):
return "{} of {}".format(self.rank if self.rank < 8 else ["sota", "caballo", "rey", "as"][self.rank-8], self.suit)
print("Who will be the best out of 5 rounds?")
contador_humano = 0
contador_ordenador = 0
baraja = [Card(rank, suit) 
for suit in ["bastos", "copas", "espadas", "oros"]
for rank in [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]]
random.shuffle(baraja)
for rondas in range(1, 6):
input("nPress enter to start round {}".format(rondas))
carta_humano = baraja.pop()
print("nThis is your card: {}".format(carta_humano))
carta_ordenador = baraja.pop()
print("This is the computer card: {}".format(carta_ordenador))

if carta_humano > carta_ordenador:
contador_humano += 1
print("nYou have won this round.")
elif carta_humano == carta_ordenador:
print("nThis is a draw.")
else:
contador_ordenador += 1
print("nThe computer has won this round.")
print("nFinal score:", contador_humano, " - ", contador_ordenador)

if contador_humano > contador_ordenador:
print("You win!")
elif contador_humano == contador_ordenador:
print("It is a draw.")
else:
print("You lose.")

人类知道检查"7 of copas"是否为>"2 of oros"在纸牌游戏中的意思。然而,计算机不理解卡片,它只知道你告诉它每张卡片都是一个字符串,它会根据字符串的内容评估表达式以确定谁获胜。

为了解决比较每个卡的整个字符串的问题;{n} de{palo}";,你只需要得到每张卡片的num部分(我想这就是我们要检查的,如果我错了,请纠正我(,你可以通过将字符串拆分为单词(单词是字符串中用空格分隔的部分(,并将字符串中的第一个单词(因为我们知道这是数字(放入一个变量中,然后用于表达式来确定谁获胜。

我取出了你目前将8-11转换为sota的代码块。我将在这里编辑如何在工作时修复它。现在,这是您的代码减去那个块,我添加了两行代码并编辑了另外两行代码,现在它给出了预期的赢家。

import random
print("Who will be the best out of 5 rounds?")
contador_humano = 0
contador_ordenador = 0
rondas = 0
while rondas < 5:
rondas = rondas + 1
print("nRounds", rondas)
palos = ["bastos", "copas", "espadas", "oros"]
num = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
baraja = []
for n in num:
for palo in palos:
carta = "{} de {}".format(n,palo)
baraja.append(carta)
random.shuffle(baraja)
input("nPress enter to shuffle.")
print(baraja)

carta_humano = random.choice(baraja)
print("nThis is your card", carta_humano)
baraja.remove(carta_humano)
carta_ordenador = random.choice(baraja)
print("This is the computer card", carta_ordenador)
# get the number portion of carta_humano
num_carta_humano = int(carta_humano.split()[0])

# get the number portion of carta_ordenador
num_carta_ordenador = int(carta_ordenador.split()[0])

if num_carta_humano > num_carta_ordenador: # compare numeric portion of each card
contador_humano += 1
contador_ordenador += 0
print("nYou have won this round.")
elif num_carta_humano == num_carta_ordenador: # compare numeric portion of each card
contador_humano += 0
contador_ordenador += 0
print("nThis is a draw.")
else:
contador_humano += 0
contador_ordenador += 1
print("nThe computer has won this round.")
baraja.append(carta_humano)
random.shuffle(baraja)
print("nFinal score:", contador_humano, " - ", contador_ordenador)

if contador_humano > contador_ordenador:
print("You win!")
elif contador_humano == contador_ordenador:
print("It is a draw.")
elif contador_humano < contador_ordenador:
print("You lose.")

编辑:

你问题的另一半是,用sotaas替换8-11的代码没有按预期运行。

我修复了您的代码,使其按您的意图运行。由于您需要将8-11替换为sota的唯一原因是当您打印出卡时,我更改了代码,使卡本身不会更改,但打印的是。我在导入下方的顶部添加了一个功能。当你打印牌组和卡片时,该功能用于将8-11替换为sota as,但它不会改变原始牌组或卡片,只会改变打印的内容。

以下是经过所有更改的完整更正代码:

import random
def replace_num_carta(baraja, carta):
# return the text representation of a card, replacing 8-11 with sota-as
if int(carta.split()[0]) == 8: # if the first word in the split string is 8
return ('sota de ' + carta.split()[-1]) # print 'sota de' concatenated to the last word of the split string
elif int(carta.split()[0]) == 9: # if the first word in the split string is 9
return ('caballo de ' + carta.split()[-1]) # print 'caballo de' concatenated to the last word of the split string
elif int(carta.split()[0]) == 10: # if the first word in the split string is 10
return ('rey de ' + carta.split()[-1]) # print 'rey de' concatenated to the last word of the split string
elif int(carta.split()[0]) == 11: # if the first word in the split string is 11
return ('as de ' + carta.split()[-1]) # print 'as de' concatenated to the last word of the split string
else:
return(carta)
print("Who will be the best out of 5 rounds?")
contador_humano = 0
contador_ordenador = 0
rondas = 0
while rondas < 5:
rondas = rondas + 1
print("nRounds", rondas)
palos = ["bastos", "copas", "espadas", "oros"]
num = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
baraja = []
for n in num:
for palo in palos:
carta = "{} de {}".format(n,palo)
baraja.append(carta)
random.shuffle(baraja)
input("nPress enter to shuffle.")
baraja_to_print = []
for carta in baraja:
baraja_to_print.append(replace_num_carta(baraja, carta)) # append the current card, after running through the function replace_num_carta
print(baraja_to_print)
carta_humano = random.choice(baraja)
print("nThis is your card " + replace_num_carta(baraja, carta_humano))
baraja.remove(carta_humano)
carta_ordenador = random.choice(baraja)
print("This is the computer card " + replace_num_carta(baraja, carta_ordenador))
# get the number portion of carta_humano
num_carta_humano = int(carta_humano.split()[0])

# get the number portion of carta_ordenador
num_carta_ordenador = int(carta_ordenador.split()[0])

if num_carta_humano > num_carta_ordenador: # compare numeric portion of each card
contador_humano += 1
contador_ordenador += 0
print("nYou have won this round.")
elif num_carta_humano == num_carta_ordenador: # compare numeric portion of each card
contador_humano += 0
contador_ordenador += 0
print("nThis is a draw.")
else:
contador_humano += 0
contador_ordenador += 1
print("nThe computer has won this round.")
baraja.append(carta_humano)
random.shuffle(baraja)
print("nFinal score:", contador_humano, " - ", contador_ordenador)

if contador_humano > contador_ordenador:
print("You win!")
elif contador_humano == contador_ordenador:
print("It is a draw.")
elif contador_humano < contador_ordenador:
print("You lose.")

最新更新