Python 为什么主while循环没有完成执行?它只是挂在某个地方

Python 为什么主while循环没有完成执行?它只是挂在某个地方,python,class,loops,Python,Class,Loops,我们正在制作这个黑杰克程序来测试卡片计数方法。我们正在尝试让自动播放功能工作,它确实工作了,但是当我们在while循环中运行它时,循环永远不会结束并退出 """ Eli Byers Josh Rondash Black_Jack.py """ import random #---------- CLASSES ----------------------------------------------------------- class Card(object): def

我们正在制作这个黑杰克程序来测试卡片计数方法。我们正在尝试让自动播放功能工作,它确实工作了,但是当我们在while循环中运行它时,循环永远不会结束并退出

"""
Eli Byers
Josh Rondash

Black_Jack.py
"""
import random

#----------   CLASSES    -----------------------------------------------------------
class Card(object):
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
        self.value = 0
        if self.rank is "Ace":
            self.value = 11
        if self.rank.isdigit():
            self.value = int(self.rank)
        if self.rank in ["Jack", "Queen", "King"]:
            self.value = 10
    def __str__(self):
        return "["+str(self.rank)+" "+str(self.suit)+"]"

class Deck(object):
    def __init__(self, numofdecks):
        self.deck = []
        self.suit = [" Clubs", " Hearts", " Spades", " Diamonds"]
        self.rank = ["Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King"]
        self.numofdecks = numofdecks
        for i in range(self.numofdecks):
            for r in self.rank:
                for s in self.suit:
                    self.deck.append(Card(r,s))  
    def __str__(self):
        deck_str = ""
        for card in self.deck:
            deck_str += str(card)+" "
        deck_str = deck_str[:-1]
        return deck_str
    def __len__(self):
        return len(self.deck)
    def __getitem__(self,i):
        return self.deck[i]
    def __delitem__(self, i):
        del self.deck[i]                           
    def draw(self):
            top_card = self.deck[0]
            del self.deck[0]
            return top_card
    def addcard(self,card):
        self.deck.append(card)
    def shuffle(self):              #Random shuffle function
        a = len(self.deck)
        b = a-1
        for d in range(b,0,-1):
            e = random.randint(0,d)
            if e == d:
                continue
            self.deck[d],self.deck[e] = self.deck[e],self.deck[d]
        return self.deck

class Player(object):
    def __init__(self, bankroll):
        self.hand = []
        self.bankroll = bankroll
        self.score = 0
        self.bet = 0
        self.count = 0
        self.aces = 0
        self.dealer_hand = []
    def __str__(self):
        hand = ""
        for card in self.hand:
            hand += str(card)+" "
        return "Hand: "+hand+"  Bank: "+str(self.bankroll)+"  Bet: "+str(self.bet)+"  Ct: "+str(self.count)+"  A: "+str(self.aces)
    def __getitem__(self, i):
        return self.hand[i]
    def getcard(self,Card):
        self.hand.append(Card)
        self.score = 0
        ace = 0
        for card in self.hand:
            if card.rank == "Ace":
                ace += 1
                self.score += 1
            else:
                self.score += card.value
        for a in range(ace):       
            if (self.score + 10) <= 21:
                self.score += 10
        self.updateCount(Card,"P")
    def placebet(self, b=0):
        if b != 0:
            self.bankroll -= b
            self.bet += b
        else:
            self.bet += input("Bankroll: "+str(self.bankroll)+"  Ct: "+str(self.count)+"  A: "+str(self.aces)+"  Place bet: ")
            self.bankroll -= self.bet
    def updateCount(self, card, player):
        if card.value in range(2,6):
            self.count += 1
        elif card.value is 10:
            self.count -= 1
        elif card.rank is "Ace":
            self.aces += 1
        if player == "D":
            self.dealer_hand.append(card)
    def makeBet(self):
        bet = 0.1*self.bankroll
        if self.count > 3:
            c = 0
            for i in range(self.count):
                c += 1
                if c == 3:
                    bet += 0.5 * bet
                    c = 0
        elif self.count < -3:
            bet -= 0.5 * bet
        return bet
    def Play(self):
        if self.score < 17:
            choice = 1        #hit
        else:
            choice = 2        #stand
        return choice


class Dealer(object):
    def __init__(self, Deck, discardpile, Player):
        self.deck = Deck
        self.discardpile = discardpile
        self.player = Player
        self.hand = []
        self.score = 0
    def __str__(self):
        hand = ""
        for card in self.hand:
            hand += str(card)+" "
        return "Dealer Hand: "+hand
    def __getitem__(self, i):
        return self.deck[i]
    def draw(self):
        cardval = self.deck.draw()
        self.hand.append(cardval)
        self.score = 0
        ace = 0
        for card in self.hand:
            if card.rank == "Ace":
                ace += 1
                self.score += 1
            else:
                self.score += card.value
        for a in range(ace):       
            if (self.score + 10) <= 21:
                self.score += 10
        player.updateCount(cardval,"D")
    def deal(self, Player):
        for i in range(2):
            self.player.getcard(self.deck.draw())
            self.draw()
    def burn(self):
        self.discardpile.addcard(self.deck.draw())
    def blackjack(self):
        if self.score == 21:
            return True
        else:
            return False


class Table(Dealer, Player):
    def __init__(self, Dealer, Player, Deck , discardpile):
        self.dealer = Dealer
        self.player = Player
        self.deck = Deck
        self.discardpile = discardpile
        self.betplaced = 0
    def initGame(self):
        self.clearTable()
        Deck.shuffle(self.deck)
        self.dealer.burn()
    def clearTable(self):
        for card in self.player.hand:
            self.discardpile.addcard(card)
        for card in self.dealer.hand:
            self.discardpile.addcard(card)
        self.player.hand = []
        self.dealer.hand = []      
    def playGame(self):
        self.betplaced = self.player.placebet()
        self.dealer.deal(self.player)
        print self.player
        print self.dealer
        if self.dealer.blackjack():
            print("Dealer Black Jack!")
        elif self.player.score <= 21:
            stand = 0
            while self.player.score < 21 and stand == 0:
                print("Use number Keys> Hit: 1     Stand: 2")
                choice = input()
                if choice == 1:        # Hit
                    self.player.getcard(self.deck.draw())  
                elif choice == 2:     # Stand
                    stand = 1
                print self.player
                print ("Your score is "+str(self.player.score))
            while self.dealer.score <= 17 and self.player.score <= 21:
                if self.dealer.score == 17:
                    for card in self.dealer.hand:
                        if card.rank == "Ace":
                            self.dealer.draw()
                else:
                    self.dealer.draw()
        print self.dealer
        print ("Dealer score is "+str(self.dealer.score))
        if self.dealer.score <= 21:
            if (self.player.score > self.dealer.score) and (self.player.score <= 21) :
                if self.player.score == 21:
                    self.player.bankroll += self.player.bet*2.5
                else:
                    self.player.bankroll += self.player.bet*2
                print ("Win")
            elif self.player.score == self.dealer.score:
                self.player.bankroll += self.player.bet
                print("Push")
            else:
                print("You Lose")
        elif (self.dealer.score > 21) and (self.player.score <= 21):
            if self.player.score == 21:
                self.player.bankroll += self.player.bet*2.5
            else:
                self.player.bankroll += self.player.bet*2
            print ("Win")
        else:
            print("You Lose.")
        self.player.bet = 0
        self.player.dealer_hand = []
        print
    def autoPlay(self):
        self.betplaced = self.player.placebet(int(self.player.makeBet()))
        self.dealer.deal(self.player)
        if (self.dealer.blackjack() == False) and (self.player.score <= 21):
            stand = 0
            while self.player.score < 21 and stand == 0:
                choice = player.Play()
                if choice == 1:        # Hit
                    self.player.getcard(self.deck.draw())  
                elif choice == 2:     # Stand
                    stand = 1
            while self.dealer.score <= 17 and self.player.score <= 21:
                if self.dealer.score == 17:
                    for card in self.dealer.hand:
                        if card.rank == "Ace":
                            self.dealer.draw()
                else:
                    self.dealer.draw()
        if self.dealer.score <= 21:
            if (self.player.score > self.dealer.score) and (self.player.score <= 21):
                if self.player.score == 21:
                    self.player.bankroll += self.player.bet*2.5
                else:
                    self.player.bankroll += self.player.bet*2
                print ("Win")
            elif self.player.score == self.dealer.score:
                self.player.bankroll += self.player.bet
                print("Push")
            else:
                print("Lose")
        elif (self.dealer.score > 21) and (self.player.score <= 21):
            if self.player.score == 21:
                self.player.bankroll += self.player.bet*2.5
            else:
                self.player.bankroll += self.player.bet*2
            print ("Win")
        else:
            print("Lose")
        self.player.bet = 0
        self.player.dealer_hand = []
        print self.player.bankroll


#-----------     MAIN     -----------------------------------

deck = Deck(6)
player = Player(500)
discardpile = Deck(0)
dealer = Dealer(deck, discardpile, player)
table = Table(dealer, player, deck, discardpile)

table.initGame()
while (player.bankroll > 0) and (player.bankroll < 1000):
    table.autoPlay()
    table.clearTable()

print "Game Over."

只需添加一些调试语句。方法中有多个while循环。我相信一个简单的print语句会发现逻辑中的错误

伙计,我在一分钟内找到了无限循环。幸运的是,我的盒子上安装了python。 第251行


你做了什么调试?你认为问题出在哪里?你能把这个简化成一个简单的问题吗?这是太多的代码,无法期望其他人仔细阅读。Python有一个函数可以随机洗牌值列表。。。我认为它也在随机模块中,被称为random.shufflelist。。。另外,在deck类中,使用“return self.deck.pop”pop删除并返回列表中的最后一项,而不是用3行来绘制卡片。我曾尝试单独打印重要变量和测试部分,但并不总是有效。就在我在while循环中一遍又一遍地运行代码的时候,有什么东西使它崩溃了。我会尽量简化它,但一切都是非常重要的,使它的工作。你知道一个好的python调试应用程序吗?如果你把代码复制粘贴到一个文件中并运行它,你会看到我就是这么做的。我在每次自动播放结束时打印资金,它播放和更改赌注。但随后它将停止,代码仍在运行,但没有打印任何内容,程序计数器也没有返回。有没有一个好的python调试器可以告诉我程序计数器在哪里,并让我设置断点和其他东西?感谢大家说了些什么,很抱歉代码太长。这是我第一次使用StackOverflow。这并没有直接回答问题。它要么作为评论发布,要么删除。@JohnKugelman它确实回答了这个问题。stackoverflow不允许人们调试其他人的代码。谢谢!!我会找的!
 if (self.dealer.blackjack() == False) and (self.player.score <= 21):
        stand = 0
        while self.player.score < 21 and stand == 0:
            print "in player score"
            choice = player.Play()
            if choice == 1:        # Hit
                self.player.getcard(self.deck.draw())  
            elif choice == 2:     # Stand
                stand = 1
        while self.dealer.score <= 17 and self.player.score <= 21:
            print "in dealer score"
            print self.dealer.score
            if self.dealer.score == 17:
                for card in self.dealer.hand:
                    if card.rank == "Ace":
                        self.dealer.draw()
            else:
                self.dealer.draw()