简体   繁体   中英

Stuck at infinite while loop (logical error)

I have been trying to create a poker game using python 2.7, but I ended up in a infinite while loop. Since its not a semantic error, I can't exactly trace the problem. The problem lies somewhere in the logic. Please help me trace out the error.

Here's my code:

import random
class Card(object):
    def __init__(self,suit=0,rank=2):
        self.suit=suit
        self.rank=rank
        self.suit_names=['Clubs','Diamonds','Hearts','Spades']
        self.suit_vals=[0,1,2,3]
        self.rank_names=[None,'Ace','2','3','4','5','6','7','8','9','10','Jack','Queen','King']
        self.rank_vals=[0,1,2,3,4,5,6,7,8,9,10,11,12,13]
    def __str__(self):
        st1=self.suit_names[self.suit]+self.rank_names[self.rank]
        return st1
    def __cmp__(self,sut,rnk):
        if self.suit>sut:
            return 1
        elif self.suit<sut:
            return -1
        elif self.suit==sut:
            if self.rank>rnk:
                return 1
            elif self.rank<rnk:
                return -1
            else:
                return 0
        else:
            print 'Wrong Input'
class Deck(object):
    def __init__(self):
        self.deck=[]
        self.card=[]
        for i in range(0,4):
            for j in range(1,14):
                ob=Card(i,j)
                self.card.append(ob)
        self.deck=list(self.card)
    def __str__(self):
        cd1=self.card[random.randint(0,13)]
        cd2=self.card[random.randint(14,26)]
        cd3=self.card[random.randint(27,39)]
        cd4=self.card[random.randint(40,52)]
        return cd1.__str__()+cd2.__str__()+cd3.__str__()+cd4.__str__()
    def add_card(self):
        if len(self.deck) < 52:
            sut=raw_input('Enter Suit')
            rnk=raw_input('Enter value on the card')
            cd=Card()
            for i in range(0,4):
                if sut==cd.suit_names[i]:
                    cd.suit=i
            for i in range(1,14):
                if rnk==cd.rank_names[i]:
                    cd.rank=i
            self.deck.append(cd)
        else:
            print 'Deck Full'
    def remove_card(self):
        i=random.randint(0,len(self.deck)-1)
        del self.deck[i]
    def pop_card(self,i="none"):
        if i=="none":
            i=len(self.deck)-1
        return self.deck.pop(i)
    def shuffle(self):
        random.shuffle(self.deck,random=None)
    def sort_(self,lst):
        l=len(lst)
        new=[]
        j=0
        while len(new)<=l:
            for i in range(0,l):
                j+=1
                if j < l:
                    res=lst[i].__cmp__(lst[j].suit,lst[j].rank)
                    if res==-1:
                        new.append(lst[i])
        lst=list(new)
        return lst
    def move_cards(self,hand,num):
        for i in range(0,num):
            hand.crds.append(self.pop_card())
class Hand(Deck,Card):
    def __init__(self):
        Deck.__init__(self)
        Card.__init__(self)
        self.crds=[]
        self.label=''
        self.val=0
    def classify(self):
        if len(self.crds)==5:
            self.crds=list(self.sort_(self.crds))
            ctr=0
            for i in range(0,5):
                for j in range(0,5):
                    if self.crds[i].rank==self.crds[j].rank:
                        ctr+=1
            ctr-=5
            if self.crds[0].suit==self.crds[1].suit==self.crds.suit[2]==self.crds.suit[3]==self.crds.suit[4]:
                for i in range(0,len(self.crds)-1):
                    if self.crds[i].rank+1==self.crds[i+1].rank:
                        self.label='Straight Flush'
                        self.val=8
                    else:
                        break
            elif ctr>=4:
                self.label='Four Of A Kind'
                self.val=7
            elif (self.crds[0].rank==self.crds[1].rank==self.crds[2].rank and self.crds[3].rank==self.crds[4].rank) or (self.crds[0].rank==self.crds[1].rank and self.crds[2].rank==self.crds[3].rank==self.crds[4].rank):
                self.label='Full House'
                self.val=6
            elif self.crds[0].suit==self.crds[1].suit==self.crds.suit[2]==self.crds.suit[3]==self.crds.suit[4]:
                self.label='Flush'
                self.val=5
            elif self.crds[0].rank+1==self.crds[1].rank and self.crds[1].rank+1==self.crds[2].rank and self.crds[2].rank+1==self.crds[3].rank and self.crds[3].rank+1==self.crds[4].rank :
                self.label='Straight'
                self.val=4
            elif self.crds[0].rank==self.crds[1].rank==self.crds[2].rank or self.crds[1].rank==self.crds[2].rank==self.crds[3].rank or self.crds[2].rank==self.crds[3].rank==self.crds[4].rank:
                self.label='Three Of A Kind'
                self.val=3
            elif ctr==2:
                self.label='Two Pair'
                self.val=2
            elif ctr==1:
                self.label='Pair'
                self.val=1
def find_class(obj,meth_name):
    return str(obj.__class__.__name__)+str(type(obj).__mro__())+str(method_name.__class__)
def play():
    player=Hand()
    player.shuffle()
    player.move_cards(player,5)
    player.classify()
    return player.label,player.val
players={}
while True:
    print '1.Add Player\n2.Determine Winner\n0.Quit'
    ch=raw_input('Enter your choice\n>>')
    if ch=='0':
        print 'Processing your Exit'
        break
    elif ch=='1':
        nm=raw_input('Enter player name\n>>')
        label,value=play()
        players[nm]=[label,value]
    elif ch=='2':
        maxi=0
        for i in players:
            if i[1]>maxi:
                w=i
                maxi=i[1]
        print 'The Winner is',w
        print 'With a',players[w][0],'hand'
    else:
        print 'Invaid Input'

As suggested by Kevin in comments, I changed my sort_() method with builtin function called sorted() , though my logic of usage differs from him.

The changes to the original code are (line 65):

def sort_(self,lst):
    from operator import attrgetter
    lst=sorted(lst, key=attrgetter('suit', 'rank'))
    return lst

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM