對于拖拉機(jī)游戲的類設(shè)計
發(fā)表時間:2023-08-07 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]我不會拖拉機(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é)
合。