2014-07-25 46 views
1

我目前是一個蟒蛇新手,並使用python來創建一些遊戲。我寫了一個遊戲「House of Cards」,基本上我正在嘗試使用我在OOP學到的知識來完成它。規則很簡單 - 你需要最大的牌才能贏。玩家首先比較數字,然後是牌的套數 - 最大牌的人贏。我寫了下面的代碼:Python遊戲「房子的卡」需要幫助

import itertools 
import random 

class Card (object): 
    def __init__ (self): 
     self.suit = ["Cubs", "Diamonds", "Hearts", "Spades"] 
     self.value = ["2","3","4","5","6","7","8","9","10", "J", "Q", "K", "A"] 
     self.deck = [] 
     for card in itertools.product(self.value, self.suit): 
      self.deck.append(card) 

class Player(object): 
    def __init__ (self, name, card = None): 
     self.name = name 
     self.carddeck = Card() 
     self.card_available = self.carddeck.deck 
    def draw_a_card(self): 
     self.card = random.choice(self.card_available) 
     print "%s has gotten a %s" %(self.name, self.card) 
    def __cmp__(self, other): 
     if self.card_available.index(self.card) > self.card_available.index(other.card): 
      print "%s wins!" %(self.name) 
     elif self.card_available.index(self.card) < self.card_available.index(other.card): 
      print "%s wins!" %(other.name) 

player_1= Player("Player 1") 
player_2 = Player("Player 2") 
player_3 = Player("Player 3") 
player_1.draw_a_card() 
player_2.draw_a_card() 
player_3.draw_a_card() 
cards_deck = Card() 
player_1.__cmp__(player_2) 

了很多的努力後,我已經成功的球員相比,1和2之間的卡,但我不知道如何將播放3成對比。

+2

'「小熊」' - >「俱樂部」 – Andy

+0

你實現它的方式,你必須做兩個獨立的比較: player_1到player_2,就像你在做什麼,並且與player_3進行比較的勝者。 –

+0

你可以最大化,排序,或簡單地使用幾個>來檢查誰贏了。 – njzk2

回答

3

的CMP功能是覆蓋比較,這樣你就可以做這樣的事情

if player1 > player2: print "Player1 beat player2!"

不這樣你就可以打印功能內部的一些信息......通過不返回任何你基本上是說,他們是平等的(我想在python不是從CMP返回任何東西大致equivelent在返回0),或者如果您嘗試一個正常的比較更糟糕的可能引發錯誤...

class Player(object): 
    def __init__ (self, name, card = None): 
     self.name = name 
     self.carddeck = Card() 
     self.card_available = self.carddeck.deck 
    def draw_a_card(self): 
     self.card = random.choice(self.card_available) 
     print "%s has gotten a %s" %(self.name, self.card) 
    def __cmp__(self, other): 
     if self.card_available.index(self.card) > self.card_available.index(other.card): 
      return 1 
     elif self.card_available.index(self.card) < self.card_available.index(other.card): 
      return -1 
     return 0 

print max([player1,player2,player3]), "Wins!" 
print min([player1,player2,player3]), "Loses!!!" 

是做到這一點的最簡單的方法.. 。

真的你缺少OOP設計在這裏

class Card: 
    def __init__(self,val,suite): 
     self.val = val 
     self.suite = suite 
    def __int__(self): 
     return self.val 
    def __str__(self): 
     card_name = ["2","3","4","5","6","7","8","9","10", "J", "Q", "K", "A"][self.val] 
     suite_name = ["Clubs","Spades","Diamonds","Hearts"][self.suite] 
     return card_name + " of " + suite_name 
    def __cmp__(self,other): 
     return cmp(int(self),int(other)) 

print Card(1,3) 
print Card(4,2) < Card(3,2) 

注意卡有沒有關係甲板的幾個方面......它屬於甲板

deck = [Card(i,j) for i in range(13) for j in range(4)] 
random.shuffle(deck.shuffle) 
0

正如Joran說.__cmp__()是一種運算符超載功能,因此您可以撥打player1 > player2而不是player_1.__cmp__(player_2),您也可以將玩家存儲在列表中並在每一轉之後對列表進行排序。你仍然能夠以正常的方式參考玩家。例如:

player_1= Player("Player 1") 
player_2 = Player("Player 2") 
player_3 = Player("Player 3") 
exampleList = [player1,player2,player3] 
player_1.draw_a_card() 
player_2.draw_a_card() 
player_3.draw_a_card() 
exampleList.sort() 
winner = exampleList[0] 

有關列表排序的詳細信息:https://wiki.python.org/moin/HowTo/Sorting

+0

,因爲他的'__cmp__函數返回None ... –

+1

@Joran其實__cmp __()應該返回-1,0,1。因爲他沒有真正堅持,他仍然可以使用'sorted()'例如:'sorted(exampleList,key = lambda player:player.card_available.index(self.card))' – rady