明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

對于拖拉機(jī)游戲的類設(shè)計

[摘要]我不會拖拉機(jī)這種玩法,只能就一般牌類的玩法來談?wù)勎覍@個的看法。首先,既然我們要用oo的設(shè)計方法,那么就必須從頂至下來設(shè)計。讓我們先來分析一下聯(lián)眾這個游戲的流程,首先,我們進(jìn)入游戲大廳,然后選定一個...
我不會拖拉機(jī)這種玩法,只能就一般牌類的玩法來談?wù)勎覍@個的看法。首先,既然我們要用oo的設(shè)計方法,那么就必須從頂至下來設(shè)計。
讓我們先來分析一下聯(lián)眾這個游戲的流程,首先,我們進(jìn)入游戲大廳,然后選定一個牌桌,人湊齊后就可以玩了,可以玩很多局,直至這桌全

部人離開。這樣的話從頂至下分析就可以構(gòu)造一下類:
一、大廳類(Hall class)
這個類并不復(fù)雜,可以這樣定義
public class Hall
{
 //私有成員變量
//大廳本身屬性
private String m_strName ; //大廳名稱
private String m_strDescription ; //大廳描述
private String m_strServerIP ; //大廳主機(jī)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)前進(jìn)行的一局游戲

 private bool m_bPlayingFlag ;//標(biāo)志,說明是否牌局正在進(jìn)行中

 //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ù)進(jìn)行已封的牌
 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ù)正負(fù)來決定那方領(lǐng)先

private ArrayList m_arrSets ;//牌局?jǐn)?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()
 {
//利用隨機(jī)函數(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é)

合。