WEB开发网
开发学院软件开发C语言 用C#编写三国杀(二):牌堆的设计 阅读

用C#编写三国杀(二):牌堆的设计

 2010-09-30 22:47:08 来源:WEB开发网   
核心提示: 很明显,只要游戏没有结束,用C#编写三国杀(二):牌堆的设计(3),牌堆中拿出使用过的废牌总要回收进行循环利用,所以废牌要保存起来,牌堆的设计就说到这里,后面就定义实际的基本牌,并让牌堆支持其中的Items的重生,因此CardHeap中便多了如下定义:牌堆重生 privatereadonlyIL

很明显,只要游戏没有结束,牌堆中拿出使用过的废牌总要回收进行循环利用,所以废牌要保存起来,并让牌堆支持其中的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; }
    }

好,牌堆的设计就说到这里,后面就定义实际的基本牌,并将进入实际流程循环。

上一页  1 2 3 

Tags:编写 三国 设计

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接