Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I break out of 2 loops? (Python) [duplicate]

There has to be a better way to do this... Any ideas? This is a basic blackjack game for CS1.

2 main things bugging me:

  1. How do I break out of the loop twice? Ex. The dealer wins, and and then it asks "stay or hit?", because it's still on the player's turn/loop.
  2. The breaks seem really cruddy. There's so much copy-pasted code.

Thanks! Any help appreciated.

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()
like image 207
maria Avatar asked May 27 '15 04:05

maria


People also ask

Can you break out of loops in Python?

In Python, the break statement provides you with the opportunity to exit out of a loop when an external condition is triggered. You'll put the break statement within the block of code under your loop statement, usually after a conditional if statement.

Does break only exit one loop?

When break is executed in the inner loop, it only exits from the inner loop and the outer loop continues.


1 Answers

Create a flag at start of outer loop as FALSE ... Then in inner loop, set it TRUE when needed to break 2 loops, there you go, now you will break the inner loop, and check the flag in outer loop, if it is true, the break out of this outer loop too.

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
like image 178
Umair Ayub Avatar answered Oct 21 '22 23:10

Umair Ayub