gpt4 book ai didi

python - 操纵 Blackjack 中 A 的值(Python)

转载 作者:太空宇宙 更新时间:2023-11-03 15:51:56 25 4
gpt4 key购买 nike

有人可以看看我的代码,让我知道当玩家的手牌小于 21 时,为什么 A 值没有变为 11?我很难在 def checkvalue(self) 下的 FOR 循环中实现 IF 循环。这是最好的方法还是有更好的方法?

谢谢

import random

rank = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'Jack', 'Queen', 'King', 'Ace']
suit = ['Diamonds', 'Clubs', 'Hearts', 'Spade']

card_val = {'2':2, '3':3, '4':4, '5':5, '6':6, '7':7, '8':8, '9':9, '10':10, 'Jack':10, 'Queen':10, 'King':10, 'Ace':1}

class Card(object):

def __init__(self, rank, suit):
self.rank = rank
self.suit = suit

def __str__(self):
return str(self.rank) + ' of ' + str(self.suit)

def grab_suit(self):
return self.suit

def grab_rank(self):
return self.rank

def draw(self):
print(self.suit + self.rank)

class Deck(object):

def __init__(self):
self.cards = []
for i in rank:
for j in suit:
self.cards.append(Card(i,j))

def __str__(self):
return str([str(card) for card in self.cards])

def shuffle(self):
random.shuffle(self.cards)

def deal(self):
single_card = self.cards.pop()
return single_card

deck = Deck()

class Hand(object):

def __init__(self):
self.value = []

def hit(self):
self.value.append(deck.deal())
return self.value

def __str__(self):
return str([str(card) for card in self.value])

def checkvalue(self):
handvalue = 0
for card in self.value:
handvalue += card_val[card.grab_rank()]
if card.grab_rank() in self.value == 'Ace' and handvalue <= 11:
handvalue = handvalue + 10
return handvalue


playerhand = Hand()

最佳答案

if card.grab_rank() in self.value == 'Ace' 是乱码。或者更确切地说,它被解释为

if (card.grab_rank() in self.value) == 'Ace'

card,这里指的是手中的最后一张牌(因为它在上面的 for 循环之外),而不是任何牌在你的手中。即使是,您也必须删除 in self.value 检查。

让您的代码正常工作的最小更改是:

class Hand(object):
...
def checkvalue(self):
handvalue = 0
for card in self.value:
handvalue += card_val[card.grab_rank()]
if any(card.grab_rank() == 'Ace' for card in self.value) and \
handvalue <= 11:
handvalue += 10
return handvalue

另外,get_rankget_value 是愚蠢的。不要在 Python 中实现 getter,只需使用属性访问(card.rankcard.value)。


请注意,这里有很多事情可以稍微清理一下。一方面:卡片可能应该知道自己的值(value),而不是必须查找全局表格才能找到它。

class Card(object):
valuetable = {'Jack': 10, 'Queen': 10, 'King': 10, 'Ace': 1}
valuetable.update({str(i): i for i in range(2, 10)})
# maybe write that out for clarity.

def __init__(self, rank, suit):
self.rank = rank
self.suit = suit
self.value = self.valuetable[self.rank] # look up once and save

然后你的checkvalue函数就变成了

def checkvalue(self):
handvalue = sum(c.value for c in self.value)
if any(c.rank == 'Ace' for c in self.value) and handvalue <= 11:
handvalue += 10
return handvalue

如果您重构为继承模型并将 checkvalue 设为属性,这将变得更加简单。

class Hand(list):
# in other languages, I might literally define this as a type alias of `[]Card`
# in Python, inheriting from list is fine.

@property
def value(self):
total = [c.value for c in self]
if any(c.rank == 'Ace' for c in self) and total <= 11:
total += 10
return total

现在您调用 hand.value 而不是 hand.value(),这样更有意义。 value 不是现实世界中的一个 Action ——它是一个名词而不是动词。而是将其视为属性(或属性,这是 @property 装饰器所做的)。

请注意,我没有在此处定义 __init__,因为当您从 list 继承时,它已被处理,我没有定义 __str__因为它或多或少是自己处理的(如果你 print 一个列表,它无论如何都会对其所有成员调用 str),而且我没有定义 hit 因为一只手真的不应该打自己。从封装的角度来看它没有任何意义(它现在依赖于一个名为 deck 的对象,该对象有一个方法 deal)并且它对“打”是手的责任。或许可以考虑...

class Player(object):
# has a self.hand attribute and a `self.game.deck` attribute
def hit(self):
self.hand.append(self.game.deck.deal(1))

玩家 击中,手没有击中。

关于python - 操纵 Blackjack 中 A 的值(Python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46088655/

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