用C#编写三国杀(二):牌堆的设计
2010-09-30 22:47:08 来源:WEB开发网很明显,只要游戏没有结束,牌堆中拿出使用过的废牌总要回收进行循环利用,所以废牌要保存起来,并让牌堆支持其中的Items的重生。因此CardHeap中便多了如下定义:
牌堆重生
private readonly IList<T> usedItems = new List<T>();
private void ReCreate()
{
// 将usedItems的牌还原到Items中,并进行洗牌,然后清空usedItems
((List<T>) Items).AddRange(usedItems);
usedItems.Clear();
Items.Shuffle();
}
既然多了usedItems,那么上面定义的Pop就需要有个重载,以指定牌堆是否可以进行重生,所以重构上面的Pop方法,改为重载:
重载Pop
/// <summary>
/// 从牌堆中压出指定数量的牌,这些牌将会从牌堆中移除。如果牌堆的牌数量不够,则只返回牌堆中剩余的牌。
/// </summary>
/// <param name="number">要压出的牌的数量。</param>
/// <returns>所压出的牌的数组。</returns>
public T[] Pop(int number)
{
return Pop(number, false);
}
/// <summary>
/// 从牌堆中压出指定数量的牌,这些牌将会从牌堆中移除。
/// </summary>
/// <param name="number">要压出的牌的数量。</param>
/// <param name="recreateHeap">在压出牌数量不够的时候是否重新创建牌堆。</param>
/// <returns>所压出的牌的数组。</returns>
public T[] Pop(int number, bool recreateHeap)
{
if (number <= 0)
return new T[0];
if (Items.Count < number && !recreateHeap)
number = Items.Count;
T[] newT = new T[number];
for (int i = 0; i < number; i++)
{
if (recreateHeap && Items.Count == 0)
{
ReCreate();
}
newT[i] = Items.First();
Items.RemoveAt(0);
usedItems.Add(newT[i]);
}
return newT;
}
这样,牌堆的定义就算基本完成了。但在此基础上考虑考虑扩展包的问题。实际上扩展包主要是牌的扩展,而且在设计初期,就已经考虑将标准版的牌从这个Core中分离,即除了基本牌的杀、闪、桃之外,锦囊和装备、武将都是由扩展包来提供。因此定义了个扩展包的接口:
扩展包接口
/// <summary>
/// 定义扩展包所必须实现的接口。
/// </summary>
public interface IPackage
{
/// <summary>
/// 扩展包中的游戏牌。
/// </summary>
GameCard[] GameCards { get; }
}
好,牌堆的设计就说到这里,后面就定义实际的基本牌,并将进入实际流程循环。
更多精彩
赞助商链接