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