关于拖拉机游戏的类设计

我不会拖拉机这种玩法,只能就一般牌类的玩法来谈谈我对这个的看法。首先,既然我们要用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 ;   //现在在这桌的用户,包括正在玩的和观战的

   private  Match 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
{
    //成员变量
   private  int 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 CardType  m_intCardType ;  //牌花色

  //方法
  没有什么特殊的方法,set,get一类的   
}//end class


六、用户类(User)
public Class User()
{
  成员变量
  private string m_strName ;                //姓名
  .......很多诸如此类的属性。

//方法
.....没有什么特殊的方法,set,get一类的
}



好了,看看,是不是已经完成了?要注意的是不要在这些类中加入比如画图、操作数据库一类的操作,而应该继承以后再和具体的系统环境结

合。