我不会拖拉机这种玩法,只能就一般牌类的玩法来谈谈我对这个的看法。首先,既然我们要用oo的设计方法,那么就必须从顶至下来设计。 让我们先来分析一下联众这个游戏的流程,首先,我们进入游戏大厅,然后选定一个牌桌,人凑齐后就可以玩了,可以玩很多局,直至这桌全
部人离开。这样的话从顶至下分析就可以构造一下类: 一、大厅类(Hall class) 这个类并不复杂,可以这样定义 public class Hall { //私有成员变量 //大厅本身属性 private String m_strName ; //大厅名称 private String m_strDescription ; //大厅描述 private String m_strServerIP ; //大厅主机ip,联网访问的ip,具体协议看需要 ......... //其它需要的属性
//大厅包含的对象 private ArrayList m_arrUsers ; //用户数组 private ArrayList m_arrConnections; //对应每个用户的连接,可以是udp或tcp,看需要。 pirvate ArrayList m_arrTables ; //桌子类数组 private ArrayList m_arrMatchs ;//每局游戏类,对应每一局游戏 //属性 public String Name .... ....
//以下为方法 //construction public Hall() { 起服务器winservice... }
///为每一个用户建立一条socket连接 ///主要作用是取得user的ip建立socket然后把这个user加入到在线用户数组 ///<parameter>a_objUser , 一个User对象,</parameter> public void Connect(User a_objUser) { ... }
///和上面方法相反,踢出用户或用户自然断线 public void Disconnect(User a_objUser) { 。。。。。 }
//还有很多这种方法,略过…… }
二、棋桌类 (Table class) 大厅类构造好了,现在来看棋桌(Table)类。 public class Table { //私有成员变量 private int m_intTableNo ;//棋桌号,唯一标志 private String m_strName ; //棋桌名称,如果有必要 .....其它类似变量
private ArrayList m_arrUsers ; //现在在这桌的用户,包括正在玩的和观战的
privateMatch m_objMatch ; //当前进行的一局游戏 private bool m_bPlayingFlag ;//标志,说明是否牌局正在进行中
//method //加入这桌 , 根据m_bPlayingFlag来决定是否可以加入 public void Join(User a_objUser) { //把这个用户加入到m_arrUsers中,并且根据m_arrUsers中玩家的多少决定该用户的属性,是上、下、左、右那一家或观战 }
///如果人够了,就可以开始一局游戏了 public void StartMatch() { m_objMatch.Play() ; }
///暂停游戏,如有用户断线或用户共同协议封牌 ///保存棋局 public void PauseMatch() { m_objMatch.Pause() ; m_objMatch.Save() ; }
///继续游戏,用户重新连线或协议继续进行已封的牌 public void ResumeMatch() { m_objMatch.Load() ; m_objMatch.Resume() ; }
///停止游戏,如有用户断线超过规定时间或一方胜利或协议结束 public void ResumeMatch() { m_objMatch.Save() ; m_objMatch.Stop() ; } }//end class declaretion
三,比赛类(Match class) public Class Match { //成员变量 privateint m_intMatchNo ;//唯一标志 private User a_objTop ; //上家 private User a_objDown ;//下家 private User a_objLeft ; //左家 private User a_objRight ;//右家 private DateTime m_datBegin ; //开始时间 private DateTime m_datEnd ;//结束时间
private int m_intPoints ; //比分,可以根据正负来决定那方领先
private ArrayList m_arrSets ;//牌局数组,一场比赛可能有多局,m_intPoints就是多局之和 。。。。 ///方法,见table类中调用的那些,我就不祥述了 ....... }
四,牌局类(Set class) public class Set { //成员变量 private DateTime m_datBegin ; //开始时间 private DateTime m_datEnd ;//结束时间 private int m_intPoints ;//这局的比分
private ArrayList m_arrInializeCards ; //牌局中初始发牌数组 private ArrayList m_arrPlayCards ;//游戏中出牌数组,对规则我不了解,所以不知一次出多少张牌, //所以这个数组的每个元素都是一个每手出的牌数组,
//方法 public void GenerateCards() { //利用随机函数产生开始发牌的顺序,填充到m_arrInializeCards数组中 }
//出牌 public void SendCard() { // 根据用户出牌构造一个临时牌数组,添加到m_arrPlayCards数组中 }
//算分,牌出完后根据规则来算分。 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一类的 }
好了,看看,是不是已经完成了?要注意的是不要在这些类中加入比如画图、操作数据库一类的操作,而应该继承以后再和具体的系统环境结
合。
|