2017-08-10 86 views
1

我是編程新手,我在這裏提問,貢獻(當我有更多的知識時),基本上只是學習和弄清楚編程是否適合我。在Python中創建二十一點遊戲

我目前正在通過Udemy課程學習Python,並且正在開發一個里程碑項目來創建21點遊戲。唯一的規則是我使用面向對象的編程,併爲Card和Deck等事物創建類。

我看過一些關於面向對象的教程,但我仍然沒有信心實現它們,所以我希望我可以分享我寫的內容,並希望通過這裏的交互有更好的理解。

首先,我制定了一個計劃,將項目分解爲更小的任務,因爲這對我來說是壓倒性的。這是我的計劃是什麼:

  1. 創建52張

  2. 指定數值的甲板每張卡(ACE可以是1或11)

  3. 洗牌

  4. 經銷商和玩家每人交2張牌作爲開始

  5. 詢問玩家是否他/她想要擊球或站在

  6. 經銷商必須打,直到他達到17

  7. 比較「點」,看看誰擁有更多的

  8. 在任何時候,如果有人超過21,那人失去

我目前被困在試圖找出第一部分。我基本上試圖用OOP和循環創建一個包含所有52張卡片的列表,但我似乎無法把事情做好。

我在下面分享我的代碼是用Python 2編寫的。任何想法如何繼續?

謝謝,保羅

編輯#1:謝謝大家的意見和反饋。我想我現在正在接近一點。有人可以讓我知道,如果我這樣做是正確的,以及如何打印我用來創建我的套牌的列表,以便我能夠在列表中看到52張牌中的每張牌?我嘗試使用str方法,但它似乎我做錯了。

import random 

rank = [2,3,4,5,6,7,8,9,10,'Jack','Queen','King','Ace'] 
suit = ['Diamonds','Clubs','Hearts','Spade'] 

class Card(object): 

    def __init__(self,rank,suit): 
     self.rank = rank 
     self.suit = suit 

    def __str__(self): 
     return self.suit + self.rank 

    def grab_suit(self): 
     return self.suit 

    def grab_rank(self): 
     return self.rank 

    def draw(self): 
     print (self.suit + self.rank) 

class Deck(object): 
    def __init__(self): 
     self.cards = []  
     for i in rank: 
      for j in suit: 
       self.cards.append(Card(i,j)) 

    def __str__(self): 
     return self.cards() 
+2

python有指針嗎? –

+4

我認爲他的意思是建議中的指針...... – nutmeg64

+1

不需要明確地從對象中派生出卡片,改成'class Card()'。通過調用Card來獲取卡片,就像一個帶參數的函數(除了self),所以將'self.deck.append(Card)'改成'self.deck.append(Card(i,j))' –

回答

0

通常在這裏的人喜歡你有你的要求,而不是「給我一些指點」一個具體的問題,所以對於投訴做好準備,這個問題過於寬泛。這就是說,我會給你一些指點。

你已經定義了任何類以外定義的套裝和排名數組(也包括他們的名字翻轉,但無論如何)。這不是OOP。我會把這些放在Deck類中,因爲那是他們使用的地方。可以這麼想:每張卡片不需要知道所有可能的等級和套裝,只需要知道它自己的等級並在它所屬的套牌創建時適合。

我不確定self.deck = self是怎麼回事。你想在那裏做什麼?在下一行中,您有self.deck = [],並且您將使用Card對象填充它。這聽起來不錯,但是,將局部變量命名爲它所屬類的名稱並不是一個好主意。這會變得混亂。我建議將它稱爲cards,因爲它將成爲一個裝滿牌的陣列。你的循環看起來不錯,但在這裏: self.deck.append(Card)你沒有正確創建卡。該卡需要知道你想分配給特定卡的等級和花色。我會讓你看看自己該怎麼做。祝你好運:)

+2

呃,我並不完全同意使用模塊級別的常量來包含'suits'和'ranks'是「不是OOP」。通常,無論如何,你會使用'enums'來表示「適合」和「排名」,因爲它們是[枚舉的典型例子](https://stackoverflow.com/a/42399384/5014455)。對於這個任務來說,這並不是必須的,在這個環境中,持有'suit'和'rank'信息的全局列表看起來很好。此外,這是一個挑逗,但這些**不是數組**,而是*列表*。 –

+0

對我來說,這不是一個好主意,因爲它將Card和Deck類綁定在一起。假設你想添加一個塔羅牌卡組,並重新使用你的卡片對象。 對數組和列表的好的調用,我一直在寫最近的JS而不是Python! –

+0

但是,如果'suit'和'rank'位於模塊級命名空間或'Deck'命名空間中,則不會改變。 –