二十一点游戏:决定赢家
Blackjack game: Determining the winner
我制作了一个 21 点游戏,除了确定获胜者外,它完全有效。谁能帮我解决我做错了什么?这是我 运行 程序时发生的情况的示例。
Cooper 's cards are : Five of Spades and King of Hearts
The Dealer's cards are: Eight of Diamonds and Ten of Spades
Your total is 15, Would you like to take a hit or stay? hit
You drew a Eight of Hearts .
You now have a total of 23
You busted!
You beat the Dealer! You got lucky punk.
Process finished with exit code 0
上面说我中奖了,然后说我赢了。
此外,如果你们知道我可以清理它,请告诉我!
from Deck import Deck
from Card import Card
from Hand import Hand
import sys
deck = Deck()
deck.shuffle()
def rules(playerTotal, dealerTotal):
if int(playerTotal) > 21:
print "You busted!"
if int(dealerTotal) == 21:
print 'To make it worse, dealer has 21.'
if int(dealerTotal) > 21:
print "The Dealer has busted. You win!"
if int(playerTotal) == 21:
print " You got 21! So you win!"
if int(dealerTotal) == 21:
print "The Dealer also got 21. Tough Break."
elif int(dealerTotal) == 21:
print "The Dealer got 21! Tough Break, you lose!"
else:
if int(playerTotal) > int(dealerTotal):
print "You beat the Dealer! You got lucky punk."
elif int(playerTotal) == int(dealerTotal):
print "It is a push, no one wins!"
elif int(playerTotal) < int(dealerTotal):
print "Dealer wins! Better luck next time loser."
def game():
player = raw_input("What is your name? ")
print " /////////////////////////////////////////\n" \
" /////////////////////////////////////////\n" \
" ///////// LET'S PLAY BLACKJACK //////////\n" \
" /////////////////////////////////////////\n" \
" /////////////////////////////////////////\n"
pCard1 = deck.deal()
pCard2 = deck.deal()
print player, "'s cards are :", pCard1, "and", pCard2
dCard1 = deck.deal()
dCard2 = deck.deal()
print "The Dealer's cards are:", dCard1, "and", dCard2
playerTotal = (Card.getCardValue(pCard1) + Card.getCardValue(pCard2))
dealerTotal = (Card.getCardValue(dCard1) + Card.getCardValue(dCard2))
if playerTotal == 21:
rules(playerTotal,dealerTotal)
elif dealerTotal == 21:
rules(playerTotal,dealerTotal)
else:
option = raw_input("Your total is " + str(playerTotal) + ", Would you like to take a hit or stay? ")
if option == "Hit" or option == "hit":
pCard = deck.deal()
playerTotal = playerTotal + (Card.getCardValue(pCard))
print "You drew a", pCard, "."
print "You now have a total of", playerTotal
while playerTotal < 21:
option = raw_input("Your total is " + str(playerTotal) + ", Would you like to take a hit or stay? ")
if option == "stay" or option == "Stay":
dealersTurn(dealerTotal)
dealerHit(playerTotal,dealerTotal)
rules(playerTotal, dealerTotal)
else:
pCard = deck.deal()
playerTotal = playerTotal + (Card.getCardValue(pCard))
print "You drew a", pCard, "."
print "You now have a total of", playerTotal
rules(playerTotal, dealerTotal)
sys.exit
if option == "stay" or option == "Stay":
dealersTurn(dealerTotal)
dealerHit(playerTotal,dealerTotal)
rules(playerTotal, dealerTotal)
def dealerHit(playerTotal,dealerTotal):
while dealerTotal < playerTotal:
dcard = deck.deal()
dealerTotal = dealerTotal + (Card.getCardValue(dcard))
print "The dealer drew a", dcard, "."
print "The dealer now has a total of", dealerTotal
return dealerTotal
def dealersTurn(dealerTotal):
while dealerTotal < 17:
dcard = deck.deal()
dealerTotal = dealerTotal + (Card.getCardValue(dcard))
return dealerTotal
game()
def rules(playerTotal, dealerTotal):
if int(playerTotal) > 21:
print "You busted!"
if int(dealerTotal) == 21:
print 'To make it worse, dealer has 21.'
print "Dealer wins! Better luck next time loser."
return
if int(dealerTotal) > 21:
print "The Dealer has busted. You win!"
return
if int(playerTotal) == 21:
print " You got 21! So you win!"
if int(dealerTotal) == 21:
print "The Dealer also got 21. Tough Break."
return
elif int(dealerTotal) == 21:
print "The Dealer got 21! Tough Break, you lose!"
return
else:
if int(playerTotal) > int(dealerTotal):
print "You beat the Dealer! You got lucky punk."
elif int(playerTotal) == int(dealerTotal):
print "It is a push, no one wins!"
elif int(playerTotal) < int(dealerTotal):
print "Dealer wins! Better luck next time loser."
return
很多逻辑问题。我不知道我是否抓住了他们。
如果您在 rules
方法中将 print
更改为 return
,它将按照您的预期进行。您希望一旦一项检查为真,就不必费心检查其他条件。
但是,在您调用主要 game
方法中的方法之前,您已经在进行一些检查:
if playerTotal == 21:
rules(playerTotal, dealerTotal)
如果玩家击中21,则玩家获胜,无需查看规则;同样你有:
elif dealerTotal == 21:
rules(playerTotal, dealerTotal)
同样,如果庄家点到 21,则庄家获胜 - 无需进行特定检查。
您需要删除此检查,并且每当发牌时 - 您需要使用 rules
方法进行计算;或者很简单,继续玩游戏直到玩家点数达到 21 或以上,或者庄家(庄家)点数达到 21 或以上:
player_total = Card.getCardValue(pCard1) + Card.getCardValue(pCard2)
dealer_total = Card.getCardValue(dCard1) + Card.getCardValue(dCard2)
while player_total <= 21 or dealer_total <= 21:
# Your game logic
player_total += Card.getCardValue(pCard1) + Card.getCardValue(pCard2)
dealer_total += Card.getCardValue(dCard1) + Card.getCardValue(dCard2)
if player_total == 21:
print('You win')
else:
print('You lose')
Taesu 的答案很接近,但是像您在这里所做的那样,先玩两手牌,然后再查看总数,根本不可能正确玩 21 点牌。一手牌的玩法和一手牌的结果交织在一起,必须放在同一个函数中,该函数按顺序执行以下所有操作:
- 发两张牌给庄家和闲家。
- 如果庄家的明牌是 A,提供保险投注(您可能想要
为简单起见将其删除)
- 如果公开牌是 A 或 10,庄家偷看。如果他有天赋,游戏就是
超过。自然平局的玩家,其他人输了。
- pay/take保险投注
- 庄家不是天生的,所以如果玩家是天生的,支付奖金
(3/2,6/5,随便你决定)游戏结束。
- 允许玩家击打:这是一个循环。如果他破产了,就摆脱
循环和游戏结束,玩家输了。你可能想离开
为了简单起见,诸如加倍和分裂之类的东西。
- 玩家以站立结束循环,所以现在玩庄家手牌
适当的规则。如果庄家爆牌,游戏结束,玩家获胜。
- 最后,如果都没有爆破,则等手推,大手赢。
我制作了一个 21 点游戏,除了确定获胜者外,它完全有效。谁能帮我解决我做错了什么?这是我 运行 程序时发生的情况的示例。
Cooper 's cards are : Five of Spades and King of Hearts
The Dealer's cards are: Eight of Diamonds and Ten of Spades
Your total is 15, Would you like to take a hit or stay? hit
You drew a Eight of Hearts .
You now have a total of 23
You busted!
You beat the Dealer! You got lucky punk.
Process finished with exit code 0
上面说我中奖了,然后说我赢了。
此外,如果你们知道我可以清理它,请告诉我!
from Deck import Deck
from Card import Card
from Hand import Hand
import sys
deck = Deck()
deck.shuffle()
def rules(playerTotal, dealerTotal):
if int(playerTotal) > 21:
print "You busted!"
if int(dealerTotal) == 21:
print 'To make it worse, dealer has 21.'
if int(dealerTotal) > 21:
print "The Dealer has busted. You win!"
if int(playerTotal) == 21:
print " You got 21! So you win!"
if int(dealerTotal) == 21:
print "The Dealer also got 21. Tough Break."
elif int(dealerTotal) == 21:
print "The Dealer got 21! Tough Break, you lose!"
else:
if int(playerTotal) > int(dealerTotal):
print "You beat the Dealer! You got lucky punk."
elif int(playerTotal) == int(dealerTotal):
print "It is a push, no one wins!"
elif int(playerTotal) < int(dealerTotal):
print "Dealer wins! Better luck next time loser."
def game():
player = raw_input("What is your name? ")
print " /////////////////////////////////////////\n" \
" /////////////////////////////////////////\n" \
" ///////// LET'S PLAY BLACKJACK //////////\n" \
" /////////////////////////////////////////\n" \
" /////////////////////////////////////////\n"
pCard1 = deck.deal()
pCard2 = deck.deal()
print player, "'s cards are :", pCard1, "and", pCard2
dCard1 = deck.deal()
dCard2 = deck.deal()
print "The Dealer's cards are:", dCard1, "and", dCard2
playerTotal = (Card.getCardValue(pCard1) + Card.getCardValue(pCard2))
dealerTotal = (Card.getCardValue(dCard1) + Card.getCardValue(dCard2))
if playerTotal == 21:
rules(playerTotal,dealerTotal)
elif dealerTotal == 21:
rules(playerTotal,dealerTotal)
else:
option = raw_input("Your total is " + str(playerTotal) + ", Would you like to take a hit or stay? ")
if option == "Hit" or option == "hit":
pCard = deck.deal()
playerTotal = playerTotal + (Card.getCardValue(pCard))
print "You drew a", pCard, "."
print "You now have a total of", playerTotal
while playerTotal < 21:
option = raw_input("Your total is " + str(playerTotal) + ", Would you like to take a hit or stay? ")
if option == "stay" or option == "Stay":
dealersTurn(dealerTotal)
dealerHit(playerTotal,dealerTotal)
rules(playerTotal, dealerTotal)
else:
pCard = deck.deal()
playerTotal = playerTotal + (Card.getCardValue(pCard))
print "You drew a", pCard, "."
print "You now have a total of", playerTotal
rules(playerTotal, dealerTotal)
sys.exit
if option == "stay" or option == "Stay":
dealersTurn(dealerTotal)
dealerHit(playerTotal,dealerTotal)
rules(playerTotal, dealerTotal)
def dealerHit(playerTotal,dealerTotal):
while dealerTotal < playerTotal:
dcard = deck.deal()
dealerTotal = dealerTotal + (Card.getCardValue(dcard))
print "The dealer drew a", dcard, "."
print "The dealer now has a total of", dealerTotal
return dealerTotal
def dealersTurn(dealerTotal):
while dealerTotal < 17:
dcard = deck.deal()
dealerTotal = dealerTotal + (Card.getCardValue(dcard))
return dealerTotal
game()
def rules(playerTotal, dealerTotal):
if int(playerTotal) > 21:
print "You busted!"
if int(dealerTotal) == 21:
print 'To make it worse, dealer has 21.'
print "Dealer wins! Better luck next time loser."
return
if int(dealerTotal) > 21:
print "The Dealer has busted. You win!"
return
if int(playerTotal) == 21:
print " You got 21! So you win!"
if int(dealerTotal) == 21:
print "The Dealer also got 21. Tough Break."
return
elif int(dealerTotal) == 21:
print "The Dealer got 21! Tough Break, you lose!"
return
else:
if int(playerTotal) > int(dealerTotal):
print "You beat the Dealer! You got lucky punk."
elif int(playerTotal) == int(dealerTotal):
print "It is a push, no one wins!"
elif int(playerTotal) < int(dealerTotal):
print "Dealer wins! Better luck next time loser."
return
很多逻辑问题。我不知道我是否抓住了他们。
如果您在 rules
方法中将 print
更改为 return
,它将按照您的预期进行。您希望一旦一项检查为真,就不必费心检查其他条件。
但是,在您调用主要 game
方法中的方法之前,您已经在进行一些检查:
if playerTotal == 21:
rules(playerTotal, dealerTotal)
如果玩家击中21,则玩家获胜,无需查看规则;同样你有:
elif dealerTotal == 21:
rules(playerTotal, dealerTotal)
同样,如果庄家点到 21,则庄家获胜 - 无需进行特定检查。
您需要删除此检查,并且每当发牌时 - 您需要使用 rules
方法进行计算;或者很简单,继续玩游戏直到玩家点数达到 21 或以上,或者庄家(庄家)点数达到 21 或以上:
player_total = Card.getCardValue(pCard1) + Card.getCardValue(pCard2)
dealer_total = Card.getCardValue(dCard1) + Card.getCardValue(dCard2)
while player_total <= 21 or dealer_total <= 21:
# Your game logic
player_total += Card.getCardValue(pCard1) + Card.getCardValue(pCard2)
dealer_total += Card.getCardValue(dCard1) + Card.getCardValue(dCard2)
if player_total == 21:
print('You win')
else:
print('You lose')
Taesu 的答案很接近,但是像您在这里所做的那样,先玩两手牌,然后再查看总数,根本不可能正确玩 21 点牌。一手牌的玩法和一手牌的结果交织在一起,必须放在同一个函数中,该函数按顺序执行以下所有操作:
- 发两张牌给庄家和闲家。
- 如果庄家的明牌是 A,提供保险投注(您可能想要 为简单起见将其删除)
- 如果公开牌是 A 或 10,庄家偷看。如果他有天赋,游戏就是 超过。自然平局的玩家,其他人输了。
- pay/take保险投注
- 庄家不是天生的,所以如果玩家是天生的,支付奖金 (3/2,6/5,随便你决定)游戏结束。
- 允许玩家击打:这是一个循环。如果他破产了,就摆脱 循环和游戏结束,玩家输了。你可能想离开 为了简单起见,诸如加倍和分裂之类的东西。
- 玩家以站立结束循环,所以现在玩庄家手牌 适当的规则。如果庄家爆牌,游戏结束,玩家获胜。
- 最后,如果都没有爆破,则等手推,大手赢。