我一直在尝试使用python 2.7创建一个扑克游戏,但我最终进入了无限循环。由于它不是语义错误,我无法准确地追踪问题。问题出在逻辑中的某个地方。请帮我找出错误。
这是我的代码:
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'
答案 0 :(得分:0)
正如Kevin在评论中所建议的,我使用内置函数 sorted()更改了 sort _()方法,尽管我的使用逻辑与他不同。
对原始代码的更改是(第65行):
def sort_(self,lst):
from operator import attrgetter
lst=sorted(lst, key=attrgetter('suit', 'rank'))
return lst