游戏流程图
玩家类
每场对战中有两个玩家实例
每个玩家拥有:
- 卡组
- 牌库
- 手牌
- 场上的英雄
- 生命值,能量值等属性
卡组
vector作为容器存储
vector<Card> CardsCombination;
由玩家自行组合
牌库
使用栈来作为容器,在对局开始时,用洗乱的玩家卡组作为玩家的牌库
stack<Card> CardsStack;
玩家与牌库的交互:
- 每个玩家回合开始时,取出牌库顶端的若干张牌放入玩家的手牌中。
- 若玩家触发丢弃/获得手牌的效果,依据效果丢弃/获得手牌
手牌
因为需要频繁增删,使用List作为容器存储
List<Card> CardsInHand;
玩家与手牌交互:玩家使用卡牌,根据卡牌类型(效果牌、英雄牌)来决定使用方式
- 若是英雄牌:生成英雄实例,并push_back到玩家的Heroes容器中
- 若是效果牌:直接造成效果
场上的英雄:
同样地,频繁增删,使用List容器来存储玩家场上的英雄
List<Hero> Heroes(10);
这个容器应实现自动移位:如当前有5个英雄,分别存储在Heroes[0……4]中,英雄Heroes[2]阵亡后,3,4应自动前移;
场景中对应的变化是:
ps:数字表示英雄存在于场上的槽位,英雄死亡后,在容器中的位置处于死亡英雄后的那些英雄都应向左移一个槽位。此例中,皇子和盖伦都会向左走一个槽位(需要动画)
生命值,能量值等属性
int类型
注意对属性值的修改操作要使用一个public的函数,而不应该直接用运算符更改,并做保证不超过上限/下限的处理
能量
- 初始值为1
- 使用卡牌时消耗
- 通过卡牌效果获得能量
能量上限
- 初始值为1
- 每个回合增加一点上限
- 通过卡牌效果增加上限
生命值
- 初始值为30
- 受到敌方伤害时减少
- 通过卡牌效果增加或减少
玩家类总结
Class Player {
// 以下为游戏运行就会使用的属性
private int HP; // 当前生命值
private int MP; // 当前能量值
private int MaxMP; // 最大能量值
private int MaxHP; // 最大生命值
private vector<Card> CardsCombination; // 自定义的卡组
// 以下为对局中才会用到的属性
private stack<Card> CardsStack; // 牌库
private List<Card> CardsInHand; // 手牌
private vector<Hero> Heroes(10); // 场上的英雄
Player() {
HP = 30;
MP = 1;
MaxMP = 1;
MaxHP = 30;
}
}
每个玩家打开游戏时便有一个一直存在的玩家实例,主要是为了存储玩家的自定义卡组。
在“对局开始”事件触发时,应对玩家属性进行一定的设定,如补满生命;初始化能量及上限;随机生成牌库;清空手牌,场上英雄等操作。
卡牌类
class Card{
private string Name; // 卡牌名称
private enum Type; // 卡牌类型(只有两种:效果牌/英雄)
private int Cost; // 卡牌耗费
private enum Effect; // 效果牌专有属性
// 英雄牌专有属性
private int HeroHP;
private int HeroDamage;
private enum HeroEffect;
public void CastEffect(); // 施展效果,根据Effect属性施展不同的效果
// 需要为每一个效果都写一个单独的施展处理段
// 是否有更好的解决方案?
public Hero SummonHero(); // 根据卡牌属性实例化一个Hero并返回
}
英雄类
Class Hero {
private string Name;
private int HeroHP;
private int HeroDamage;
private enum HeroEffect;
public void CastEffect();
}