现在想制作一款象棋游戏,既可以单机游戏,又可以网络对战。具体怎么用面向对象的方法来设计呢?我的想法:当然有个棋子的基类,然后在这个类里实现一些方法,不过肯定是虚方法;(而且还要预留出其他接口,以便将来扩充功能)然后在派生类中实现具体走法。比如派生出  车类、马类、象类,等等。总共有七个子类。每个类里面实现自己的走棋规则,以及记录当前棋子的位置,颜色等等。问题来了,我怎么在每个类的走棋规则作判断,能不能走。因为要判断当前棋子移动方向上有没有其他的棋子,而这个信息在自己的类中是不能获得的。怎么做呢?(难道要写个棋盘类吗?)(或者怎么做到类似DELPHI的RTTI呢?)如果那位大侠有好的象棋游戏设计方法,可以讨论讨论!

解决方案 »

  1.   

    建议你先用RAD的方法实现了这个游戏 然后再用面向对象重构 
    一上手就是面向对象往往到最后什么都作不出来 
      

  2.   

    不同意楼上的观点!
    用RAD固然有他的好处,但不可多用。选择面向对象变成方法,究意味着要放弃一些可视化变成的方法!!!请大侠们在继续!!!
      

  3.   

    To:tonylk(=www.tonixsoft.com=) 说的还是很有道理的,我也想过了,那就是说你同意写个棋盘类,而不是写棋子类?
      

  4.   

    To:zzllabc(龙) 还不如每个棋子写一个走子规则函数。???那样不又回到面向过程上去了吗?现在就是想学习面向对象的思想!!!看看还又没有更好的方法?
      

  5.   

    我大致想了一下,好像应该这样,
    一个类“棋盘”,只负责记录棋局状态(是否开始比赛,是否停止比赛),棋的布局(由于棋子数目有限,只需要使用变量记录就可以了,用record来记录棋子状态好了,比如记录:是否已被吃,x,y坐标,棋子的种类),以及两个玩家类。”玩家“类,通用的记录,提供走棋,吃子等方法,具体又分为:玩家人,玩家电脑,从”玩家“类继承,玩家人关联到界面,等待用户的操作,再传回去,玩家电脑则自动对怎样下棋进行计算,并作出反应。棋子的状态,正如前面所说的,我觉得只需要用结构体来保存就可以了,不需要使用类,我知道你的本意:定义棋子的抽象类,再继承出各个棋子类。但是平时我们使用抽象类一般是因为各个子类的行为类似,用抽象来提供统一的接口而已,但在这个问题上,我觉得各个棋子的行为相差甚远,(那么多走法很难用统一的接口来提供,我觉得是这样,这点上还可以再讨论讨论),即使使用抽象,棋盘类最多也只能够获得某个棋子是否可以走到某个棋格的判断,其它走与不走的判断全在棋局的大局规划中,与各个棋子无关。
      

  6.   

    我也是想应该有个棋盘类,但是,具体怎么实现呢?还是有点糊涂!zzllabc(龙) 那个象棋空间那里有下载???
      

  7.   

    面象对象的设计,不是在一个类里实现的,对于复杂的系统,肯定有很多很多类
    类之间可能有关联
    类之间还可以通过发送消息进行操作
    看看<面向对象的系统分析>,书中有很多好例子我感觉你最少有这么几个类
    1\棋子类
    2\棋盘类
    3\棋局类
    4\玩家类你刚才问到,棋盘类
    我想应该包含这样的内容,1\棋盘上每个座标的状态(空,或是有哪一个棋子);2\当前应该哪一个玩家下;
      

  8.   

    //顺手写了下,仅供参考~~象棋 = 类(窗体控件)
      字段
        棋局; //1副棋局
        棋盘; //1个棋盘
        棋子列表; //32个棋子
        玩家列表; //2个玩家
      方法
        重新开始(玩家);
        画棋盘(); //画背景、坐标线
        画棋子();
        认输(玩家);
        和棋(玩家);
        悔棋(玩家);
        走棋(坐标)
        选棋(坐标);
        显示棋局(步数);
        记分();
        发送游戏信息();
        Paint; override;
      事件
        接收到信息时触发;棋局 = 类()
      方法
        保存;
        载入;
      属性
        象棋;
        当前步数;棋子 = 类()
      方法
        计算可移动位置;
        绘制棋子;
      属性
        象棋;
        坐标;
        名称;
        颜色;
        是否选中;
        是否被吃;玩家 = 类()
      属性
        象棋;
        是否执棋;
        绘制玩家;
        积分;
        时间;
        姓名;棋盘 = 类()
      方法
        绘制棋盘;
      属性
        象棋;
        大小;  //象棋本身就是一个类~~
      

  9.   

    TO:hongsushou(红酥手)    在那里下载的我忘了,你可以给我发邮件,我给你发过去,[email protected]
      

  10.   

    To:zzllabc(龙) 谢谢,我已经找到了,不过源码要RMB50啊,不知道值不值?