编牌类游戏时遇到的类的设计问题

魔法软糖 2012-04-11 08:49:31
学VB8年了,但是最近才开始初学面向对象编程,设计复杂的类关系时遇到了麻烦
文章比较长,如果对此不感兴趣建议不看本文。

以下是我设计的牌类游戏的类:
(我的设计目的是通过读取规则文件自动实现所有牌类的规则并运行,例如斗地主、桥牌、甚至是万智牌,但是目前只设计扑克牌)
牌 -> 扑克牌
牌堆 -> 扑克牌堆
牌型 -> 扑克牌型
牌管理 -> 扑克牌管理 (负责管理牌的集合、发放、移动等)
牌堆管理 -> 扑克牌堆管理
牌局
游戏(内含牌管理和牌堆管理两个类的实例)
玩家
阵营
规则
规则事件
规则条件
规则动作
规则文件

问题是:
1.类的继承问题,如何在不知道是何子类的情况下调用子类的方法?
例如游戏类含有一个牌管理类,根据斗地主的规则:
创建一个扑克牌管理赋值给[游戏.牌管理],然后调用它的【创建整副扑克牌】方法
但是问题在于[游戏.牌管理]的类型为[牌管理]而不是[扑克牌管理],所以没有这个方法,无法调用
难道我要再去弄个游戏的子类[扑克游戏]出来?有否更简单的方法,使我只需要一个游戏类,却可以根据规则调用各种牌(万智牌、游戏王)。

2.接口有什么用,我这个游戏类使用面向接口设计会更好么,看了很多接口的文章,但是实际用起来就不会了。

3.规则如何实现?
我想要实现类似魔兽3触发器的功能,读取文本文件并执行。目前大概的想法是事件驱动规则。
游戏类主要功能:
- 储存牌、牌堆、玩家、规则、牌局的对象实例
- 接收玩家输入,并引发事件发送给规则管理
- 规则管理根据事件和预装载的规则文件,检查规则条件,并做出相应规则动作
- 游戏根据规则管理反馈的信息,进行下一步逻辑,并调用画面管理更新游戏画面

附上斗地主规则:(主要是流程规则,还有牌型规则和积分规则就不贴上了)
【阶段 - 准备】
备牌 - (1副)
设置玩家人数 - 3
创建牌堆 - 发牌堆
设置牌堆属性 - 背面, 54张
创建牌堆 - 弃牌堆
设置牌堆属性 - 正面, 0张
创建牌堆 - 地主牌堆, 容量3张
设置牌堆属性 - 背面, 0张
创建牌堆 - [每位玩家],容量17张
设置牌堆属性 - 背面, 0张, 仅玩家自己可见

【阶段 - 发牌】
按顺序发放给4个牌堆使其填满容量

【阶段 - 叫牌】
如果 首次游戏 = 真 随机选择 叫牌玩家
否则 叫牌玩家 = 上次赢家
增加玩家命令 - [每位玩家] 1分
增加玩家命令 - [每位玩家] 2分
增加玩家命令 - [每位玩家] 3分
增加玩家命令 - [每位玩家] 不叫
开始循环 玩家号 = 1 to 玩家人数 [循环一次]
叫牌:可以叫“1分”,“2分”,“3分”,“不叫”。后叫牌者只能叫比前面玩家高的分或者不叫。叫牌结束后所叫分值最大的玩家为地主;
如果有玩家叫“3分”则立即结束叫牌,该玩家为地主;
如果都不叫,则重新发牌,重新叫牌。
结束循环
移除所有玩家命令

【阶段 - 出牌】
地主获得地主牌堆3张牌
移交出牌权给地主
增加玩家命令 - [每位玩家] 出牌
增加玩家命令 - [每位玩家] 跳过
循环 直到 任一玩家手牌为空
轮流出牌
结束循环

...全文
107 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
c19102989 2012-04-16
  • 打赏
  • 举报
回复
你去下个c++的棋牌游戏 你去看一下 需要的话 我给你一个0.0 参考一下 留下email
skigil 2012-04-16
  • 打赏
  • 举报
回复
一个简单的游戏,你搞太复杂了

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧