我不會拖拉機這種玩法,只能就一般牌類的玩法來談?wù)勎覍@個的看法。首先,既然我們要用oo的設(shè)計方法,那么就必須從頂至下來設(shè)計。 讓我們先來分析一下聯(lián)眾這個游戲的流程,首先,我們進入游戲大廳,然后選定一個牌桌,人湊齊后就可以玩了,可以玩很多局,直至這桌全
部人離開。這樣的話從頂至下分析就可以構(gòu)造一下類: 一、大廳類(Hall class) 這個類并不復(fù)雜,可以這樣定義 public class Hall { //私有成員變量 //大廳本身屬性 private String m_strName ; //大廳名稱 private String m_strDescription ; //大廳描述 private String m_strServerIP ; //大廳主機ip,聯(lián)網(wǎng)訪問的ip,具體協(xié)議看需要 ......... //其它需要的屬性
//大廳包含的對象 private ArrayList m_arrUsers ; //用戶數(shù)組 private ArrayList m_arrConnections; //對應(yīng)每個用戶的連接,可以是udp或tcp,看需要。 pirvate ArrayList m_arrTables ; //桌子類數(shù)組 private ArrayList m_arrMatchs ;//每局游戲類,對應(yīng)每一局游戲 //屬性 public String Name .... ....
//以下為方法 //construction public Hall() { 起服務(wù)器winservice... }
///為每一個用戶建立一條socket連接 ///主要作用是取得user的ip建立socket然后把這個user加入到在線用戶數(shù)組 ///<parameter>a_objUser , 一個User對象,</parameter> public void Connect(User a_objUser) { ... }
///和上面方法相反,踢出用戶或用戶自然斷線 public void Disconnect(User a_objUser) { 。。。。。 }
//還有很多這種方法,略過…… }
二、棋桌類 (Table class) 大廳類構(gòu)造好了,現(xiàn)在來看棋桌(Table)類。 public class Table { //私有成員變量 private int m_intTableNo ;//棋桌號,唯一標(biāo)志 private String m_strName ; //棋桌名稱,如果有必要 .....其它類似變量
private ArrayList m_arrUsers ; //現(xiàn)在在這桌的用戶,包括正在玩的和觀戰(zhàn)的
privateMatch m_objMatch ; //當(dāng)前進行的一局游戲 private bool m_bPlayingFlag ;//標(biāo)志,說明是否牌局正在進行中
//method //加入這桌 , 根據(jù)m_bPlayingFlag來決定是否可以加入 public void Join(User a_objUser) { //把這個用戶加入到m_arrUsers中,并且根據(jù)m_arrUsers中玩家的多少決定該用戶的屬性,是上、下、左、右那一家或觀戰(zhàn) }
///如果人夠了,就可以開始一局游戲了 public void StartMatch() { m_objMatch.Play() ; }
///暫停游戲,如有用戶斷線或用戶共同協(xié)議封牌 ///保存棋局 public void PauseMatch() { m_objMatch.Pause() ; m_objMatch.Save() ; }
///繼續(xù)游戲,用戶重新連線或協(xié)議繼續(xù)進行已封的牌 public void ResumeMatch() { m_objMatch.Load() ; m_objMatch.Resume() ; }
///停止游戲,如有用戶斷線超過規(guī)定時間或一方勝利或協(xié)議結(jié)束 public void ResumeMatch() { m_objMatch.Save() ; m_objMatch.Stop() ; } }//end class declaretion
三,比賽類(Match class) public Class Match { //成員變量 privateint m_intMatchNo ;//唯一標(biāo)志 private User a_objTop ; //上家 private User a_objDown ;//下家 private User a_objLeft ; //左家 private User a_objRight ;//右家 private DateTime m_datBegin ; //開始時間 private DateTime m_datEnd ;//結(jié)束時間
private int m_intPoints ; //比分,可以根據(jù)正負來決定那方領(lǐng)先
private ArrayList m_arrSets ;//牌局數(shù)組,一場比賽可能有多局,m_intPoints就是多局之和 。。。。 ///方法,見table類中調(diào)用的那些,我就不祥述了 ....... }
四,牌局類(Set class) public class Set { //成員變量 private DateTime m_datBegin ; //開始時間 private DateTime m_datEnd ;//結(jié)束時間 private int m_intPoints ;//這局的比分
private ArrayList m_arrInializeCards ; //牌局中初始發(fā)牌數(shù)組 private ArrayList m_arrPlayCards ;//游戲中出牌數(shù)組,對規(guī)則我不了解,所以不知一次出多少張牌, //所以這個數(shù)組的每個元素都是一個每手出的牌數(shù)組,
//方法 public void GenerateCards() { //利用隨機函數(shù)產(chǎn)生開始發(fā)牌的順序,填充到m_arrInializeCards數(shù)組中 }
//出牌 public void SendCard() { // 根據(jù)用戶出牌構(gòu)造一個臨時牌數(shù)組,添加到m_arrPlayCards數(shù)組中 }
//算分,牌出完后根據(jù)規(guī)則來算分。 public void Caculation() { m_intPoints = ??? ; } }//end class
五、牌類(Card) public class Card() { //先定義一個枚舉變量,代表花色 public enum CardType { 方片,草花 , 黑桃 , 紅心 ;//用英語吧,我不會,呵呵 }
//成員變量 private int m_intPoint ;//牌點,1-15 private CardTypem_intCardType ;//牌花色
//方法 沒有什么特殊的方法,set,get一類的 }//end class
六、用戶類(User) public Class User() { 成員變量 private string m_strName ;//姓名 .......很多諸如此類的屬性。
//方法 .....沒有什么特殊的方法,set,get一類的 }
好了,看看,是不是已經(jīng)完成了?要注意的是不要在這些類中加入比如畫圖、操作數(shù)據(jù)庫一類的操作,而應(yīng)該繼承以后再和具體的系統(tǒng)環(huán)境結(jié)
合。
|