開發工具:Visual studio Codedom
1.遊戲介紹函數
四名牌手打牌,電腦隨機將52張牌(不合大、小王)發給四名牌手,並在屏幕上顯示每位牌手的牌。工具
2.面向對象程序設計開發工具
定義和使用類測試
類定義ui
建立類時,用變量形式表示的對象屬性稱爲數據成員或屬性(成員變量),用函數形式表示的對象行爲稱爲成員函數(成員方法),成員屬性和成員方法統稱爲類的成員。設計
對象定義調試
對象是類的實例。若是人類是一個類的話,那麼某個具體的人就是一個對象。只有定義了具體的對象,纔可經過「對象名。成員」的方式來訪問其中的數據成員或成員方法。對象
構造函數blog
類能夠定義一個特殊的稱爲_init_()的方法(構造函數,以兩個下畫線「_」開頭和結束)。一個類定義了_init_()方法之後,類實例化時就會自動爲新生成的類實例調用_inil_()方法。構造函數通常用於完成對象數據成員設置初值或進行其餘必要的初始化工做。若是未定義構造函數,Python將提供一個默認的構造函數。
析構函數
Python中類的析構函數是_del _,用來釋放對象佔用的資源,在Python收回對象空間以前自動執行。若是用戶未定義析構函數,則Python會提供一個默認的析構函數進行必要的清理工做。
實例屬性和類屬性
屬性(成員變量)有兩種,一種是實例屬性,另外一種是類屬性(類變量)。實例屬性是在構造函數_ init_(以兩個下畫線「_」開頭和結束)中定義的,定義時以self做爲前綴;類屬性是在類中方法以外定義的屬性。在主程序中(在類的外部),實例屬性屬於實例(對象)只能經過對象名訪問;類屬性屬於類,可經過類名進行訪問,也能夠經過對象名進行訪問,爲類的全部實例共享。
私有成員與公有成員
Python並無對私有成員提供嚴格的訪問保護機制。在定義類的屬性時,若是屬性名以兩個下畫線「_」開頭,則表示其是私有屬性,不然是公有屬性。私有屬性在類的外部不能直接訪問,須要經過調用對象的公有成員方法來訪問,或者經過Python支持的特殊方式來訪問。Python提供了訪問私有屬性的特殊方式,可用於程序的測試和調試,對成員方法也具備一樣的性質。方法以下:
對象名.類名+私有成員
私有屬性是爲了數據封裝和保密而設置的屬性,通常只能在類的成員方法(類的內部)中使用訪問。雖然Python支持用戶以一種特殊的方式從外部直接訪問類的私有成員,可是並不推薦使用這種方法。公有屬性是能夠公開使用的,既能夠在類的內部進行訪問,也能夠在外部程序中使用。
方法
在類中進行定義的方法能夠分爲三大類:公有方法、私有方法和靜態方法。其中,公有方法、私有方法都屬於對象,私有方法的名字以兩個下畫線「—」開始,每一個對象都有本身的公有方法和私有方法,在這兩類方法中能夠訪問屬於類和對象的成員;公有方法經過對象名直接調用,私有方法不能經過對象名直接調用,只能在屬於對象的方法中經過「self’調用或在外部經過Python支持的特殊方式來調用。若是經過類名來調用屬於對象的公有方法,則須要顯式地爲該方法的「self"’參數傳遞一個對象名,用來明確指定訪問哪一個對象的數據成員。靜態方法能夠經過類名和對象名調用,但不能直接訪問屬於對象的成員,只能訪問屬於類的成員。
類的繼承
繼承是爲代碼複用和設計複用而設計的,是面向對象程序設計的重要特性之一。當咱們設計一個新類時,若是能夠繼承一個已有的、設計良好的類,而後進行二次開發,無疑會大幅減小開發的工做量。
在繼承關係中,已有的、設計好的類稱爲父類或基類,新設計的類稱爲子類或派生類。派生類能夠繼承父類的公有成員,可是不能繼承其私有成員。
類繼承語法:
class派生類名(基類名): 基類名寫在括號裏
派生類成員
在Python中,繼承的一些特色以下。繼承中,基類的構造函數(_init._()方法)不會被自動調用,它須要在其派生類的構造中專門調用。
若是須要在派生類中調用基類的方法時,可經過「基類名.方法名()」的方式來實現,須要加上基類的類名前綴,且須要帶上self參數變量,區別於在類中調用普通函實現,須要加上基類的類名前綴,且須要帶上self參數,也可使用內置函數super()實現。
Python老是首先查找對應類型的方法,若是不能在派生類中找到對應的方法,它纔會到基類中逐個查找(先在本類中查找調用的方法,找不到纔去基類中找)。
方法重寫必須出如今繼承中。它是指當派生類繼表了基類的方法以後,若是基類方法的功能不能知足需求,則須要對基類中的某些方法進行修改。能夠在派生類重寫基類的方法。
3.程序設計步驟
設計類
發牌程序設計出三個類: Card類、Hand類和Poke類。
Card類
Card類表明一張牌,其中,FaceNum字段指的是牌面數字1~13,Suit字段指的是花色,」梅」爲梅花,」方」爲方塊,」紅」爲紅桃,」黑」爲黑桃。
其中:Card構造函數根據參數初始化封裝的成員變量,實現牌面大小和花色的初始化,以及是否顯示牌面,默認True爲顯示牌正面;_str_()方法用來輸出牌面大小和花色;pic_order()方法獲取牌的順序號,牌面按梅花1~13,方塊14- 26,紅桃27-39,黑桃40- 52順序編號(未洗牌以前),也就是說,梅花2順序號爲2,方塊A順序號爲14,方塊K順序號爲26(這個方法爲圖形化顯示牌面預留的方法); flip()是翻牌方法,改變牌面是否顯示的屬性值。
Hand類
Hand類表明手牌(一個玩家手裏拿的牌),能夠認爲是一位牌手手裏的牌,其中,cards列表變量存儲牌手手中的牌。能夠增長牌、清空手裏的牌、把一張牌給別的牌手等操做。
Poke類
Poke類表明一副牌,咱們能夠將一副牌看做是有52張牌的牌手,因此繼承Hand類。因爲其中cards列表變量要存儲52張牌,並且要進行發牌、洗牌操做,因此增長以下的方法。
populate(self)生成存儲了52張牌的一副牌,固然這些牌是按梅花1~13,方塊14- 26,紅桃27~39,黑桃40- 52的順序(未洗牌以前)存儲在cards列表變量。 shuffle(self)洗牌,使用Python的random模塊shuffle()方法打亂牌的存儲順序便可。deal( self., hands,per_hand=13)可完成發牌動做,發給四個牌人默認13張牌。固然,若令per_hand=10,則給每一個牌手發1 0張牌,只不過最後仍有牌沒發完。
主程序
主程序比較簡單,由於有四個牌手,因此生成players列表存儲初始化的四位牌手。生成一副牌的對象實例poke1,調用populate()方法生成有52張牌的一副牌,調用huffle()方法洗牌打亂順序,調用deal(players,13)方法分別給每位玩家發13張牌,最後示四位牌手全部的牌。
4.參考代碼
5.運行結果