首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从一张牌中获得最高牌的正确获胜者

如何从一张牌中获得最高牌的正确获胜者
EN

Stack Overflow用户
提问于 2021-05-11 17:36:36
回答 2查看 191关注 0票数 0

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

我的代码中有几个问题。

例如,当我创建整个扑克牌时,我得到了"bastos“卡的输出:

"8 de bastos“、"9 de bastos”、"10 de bastos“和"11 de bastos”而不是"sota de bastos“、"caballo de bastos”、"rey de bastos“和"as de bastos”。

这种情况只发生在"bastos“中,因为它是列表中的第一个变量。但我不知道怎么解决这个问题。

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

代码语言:javascript
复制
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. 

所以我的节目说电脑在不正常的时候赢了。

我在绘图方面也有类似的问题。我的课程不认可任何抽签,例如:

代码语言:javascript
复制
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. 

到目前为止,这就是我的全部代码:

代码语言:javascript
复制
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.")
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-11 20:57:32

人类知道什么检查,看看'7杯card =‘card 2’> oros‘>是否意味着纸牌游戏.然而,计算机不理解卡片,它只知道你告诉它每一张卡都是一个字符串,它根据字符串的内容对表达式进行评估以确定谁赢了。

要解决比较每张卡的整个字符串"{n} de {palo}“的问题,您需要只获取每张卡的num部分(我假设这就是我们正在检查的部分,如果我错了,请更正),您可以将字符串拆分成单词(其中一个单词是字符串中由空格分隔的部分),并将字符串中的第一个单词(因为我们知道这是数字)放入一个变量中,然后使用这个变量来确定谁赢了。

我拿出了你把8-11转换成sota的代码块,就像现在一样。我将在这里编辑,当我使它工作时,如何修复它。现在,这里是您的代码减去这个块,我添加了两行代码并编辑了另外两行代码,现在它给出了预期的赢家。

代码语言:javascript
复制
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.")

编辑:

您的另一半问题是,您的代码用sota替换8-11,这并不像预期的那样起作用。

我修正了您的代码,使其按照您的意愿运行。由于您需要用sota替换8-11的唯一原因--就像打印卡片时一样,我更改了代码,这样卡片本身就不会改变,但是打印出来的是。我在导入的顶部添加了一个函数。当你打印纸牌和卡片时,这个功能被用来用sota-as代替8-11,但是它不会改变原来的牌,只是打印的东西。

以下是包含所有更改的完整更正代码:

代码语言:javascript
复制
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.")
票数 0
EN

Stack Overflow用户

发布于 2021-05-11 20:46:09

一些问题:

  • for c in carta将迭代carta的每个字符。这不是在您将值赋值给intended.
  • Changing carta.
  • When n之后所做的,不会更改carta.
  • When比较carta_humano > carta_ordenador,您正在比较这些字符串,因此,例如,"rey“将被视为大于"as”。您需要比较cards.
  • "sotas“的数值必须引用

我建议为一个卡片创建一个类,这个类就像一个带有秩和适合属性的元组,它有一个__repr__方法,负责生成“尼斯”名称。通过将其定义为元组,顺序基于第一个成员(排名),这正是我们所需要的。

我也不会随便乱选一张牌。如果你已经洗牌了,你可以只拿最后一张牌。这和随机选择一样是随机的。你把选定的牌放回甲板上,但在我看来,这是过火了。有足够的牌打5轮,所以不要费心地把他们放回去。但这只是我的观点。这对你的问题并不重要。

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

以下是它的工作原理:

代码语言:javascript
复制
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.")
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67491761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档