python - 我如何打破2个循环? (Python)

标签 python loops methods break blackjack

<分区>

必须有更好的方法来做到这一点...有什么想法吗?这是 CS1 的基本二十一点游戏。

困扰我的两个主要问题:

  1. 如何两次跳出循环?前任。庄家赢了,然后它会问“留下还是打?”,因为它仍在玩家的回合/循环中。
  2. 休息时间看起来真的很糟糕。复制粘贴的代码太多了。

谢谢!任何帮助表示赞赏。

import random
import sys
# game, hand, deck


class Deck:
    theDeck = []
    card = 0

    def createDeck(self):
        for x in range(2, 15):
            for y in range(1, 5):
                self.theDeck.append(x)

    def extractCard(self):
        card = self.theDeck.pop(random.randrange(1, len(self.theDeck) - 1))
        return card


class Game:
    dealerTotal = [0, 0]
    playerTotal = 0
    deck = Deck()
    deck.createDeck()

    def reset(self):
        self.dealerTotal = [0, 0]
        self.playerTotal = 0

    def dealerEnd(self):
        if self.dealerTotal[0] == 21 or self.dealerTotal[1] == 21:
            print("BLACKJACK! Game over.\n\nDEALER'S TURN")
            self.reset()
            return True    
        elif self.dealerTotal[0] > 21 and self.dealerTotal[1] > 21:
            print("PLAYER WINS! Game over.\n\nDEALER'S TURN")
            self.reset()
            return True
        return False

    def playerEnd(self):
        if self.playerTotal == 21:
            print("BLACKJACK! Game over.\n\nDEALER'S TURN")
            self.reset()
            return True
        elif self.playerTotal > 21:
            print("DEALER WINS! Game over.\n\nDEALER'S TURN")
            self.reset()
            return True
        return False

    def dealerChangeTotal(self,hold):
        self.dealerTotal[0] += hold
        self.dealerTotal[1] += hold
        print("Total ::"), self.dealerTotal
        self.dealerEnd()

    def playerChangeTotal(self,hold):
        self.playerTotal += hold
        print("Total ::"), self.playerTotal
        self.playerEnd()

    def play(self):
        while len(self.deck.theDeck) > 0:

            print("DEALER'S TURN")
            if self.dealerTotal[0] >= 16 or self.dealerTotal[1] >= 16:
                print("I can't take. Your go.")
            while self.dealerTotal[0] < 16 or self.dealerTotal[1] < 16:
                hold = self.deck.extractCard()
                if hold == 14:
                    print("Card :: ace")
                    self.dealerTotal[0] += 1
                    self.dealerTotal[1] += 11
                    print("Total ::"), self.dealerTotal
                    if self.dealerEnd() == True:
                        break
                elif hold == 13:
                    hold = 10
                    print("Card :: king")
                    self.dealerChangeTotal(hold)
                    if self.dealerEnd() == True:
                        break
                elif hold == 12:
                    hold = 10
                    print("Card :: queen")
                    self.dealerChangeTotal(hold)
                    if self.dealerEnd() == True:
                        break
                elif hold == 11:
                    hold = 10
                    print("Card :: jack")
                    self.dealerChangeTotal(hold)
                    if self.dealerEnd() == True:
                        break
                else:
                    print("Card ::"), hold
                    self.dealerChangeTotal(hold)
                    if self.dealerEnd() == True:
                        break

            print("\n\nPLAYER'S TURN")
            while True:
                hold = self.deck.extractCard()
                if hold == 14:
                    print("Card :: ace")
                    self.playerTotal += input("Do you want a 1 or an 11? ")
                    print("Total ::"), self.playerTotal
                    response = raw_input("Stand or hit? ")
                    if response == "stand":
                        break
                    if self.playerEnd() == True:
                        break
                elif hold == 13:
                    hold = 10
                    print("Card :: king")
                    self.playerChangeTotal(hold)
                    response = raw_input("Stand or hit? ")
                    if response == "stand":
                        break
                    if self.playerEnd() == True:
                        break
                elif hold == 12:
                    hold = 10
                    print("Card :: queen")
                    self.playerChangeTotal(hold)
                    response = raw_input("Stand or hit? ")
                    if response == "stand":
                        break
                    if self.playerEnd() == True:
                        break
                elif hold == 11:
                    hold = 10
                    print("Card :: jack")
                    self.playerChangeTotal(hold)
                    response = raw_input("Stand or hit? ")
                    if response == "stand":
                        break
                    if self.playerEnd() == True:
                        break
                else:
                    print("Card ::"), hold
                    self.playerChangeTotal(hold)
                    response = raw_input("Stand or hit? ")
                    if response == "stand":
                        break
                    if self.playerEnd() == True:
                        break


            print("\n\n")

#... Main?
game = Game()
game.play()

最佳答案

在外循环开始时创建一个标志为 FALSE ... 然后在内循环中,当需要打破2个循环时将其设置为TRUE,好了,现在你将打破内循环,并检查外循环中的标志,如果为真,则也跳出这个外循环。

while ...:
    flag = 0
    while ...:
        #  point where you want 2 loops to break
        flag = 1
        break
        
    # break out of this too :P
    if flag == 1:
        break

关于python - 我如何打破2个循环? (Python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30473226/

相关文章:

python - 在 Cygwin 上安装 Pip-3.2

c - 使用一个 for 循环就地转置矩阵

jquery - jsonp 循环数据

Python,调用 __getattribute__ 返回的方法

java - 如何对二维数组进行列和和行和方法?

python - 减少python中的if条件以避免单个函数中的重复操作

python - 如何使用 pytest 运行 python 的跟踪?

python - 在这个例子中为什么我应该使用 __new__ 而不是 __init__ ?

loops - 当我的iOS 4应用程序处于后台时,如何重复调用方法?

javascript - var functionName = function() {} vs function functionName() {}