http://hero.pongo.cn/Question/Details?ID=168&ExamID=163

    /// <summary>
    /// 单词博弈游戏
    /// </summary>
    public class Game
    {
        /// <summary>
        /// 字母序列
        /// </summary>
        List<char> _List;
        /// <summary>
        /// 游戏历史记录
        /// </summary>
        List<KeyValuePair<int, char>> _History;
        /// <summary>
        /// 游戏参与者
        /// </summary>
        string[] _Playrs;
        /// <summary>
        /// 当前游戏者
        /// </summary>
        int _CurrentPlayerIndex;

        /// <summary>
        /// 使用一起单词开始游戏
        /// </summary>
        public Game(string str)
        {
            Console.WriteLine("游戏单词:" + str);
            Console.WriteLine("=============游戏开始==============");
            _List = str.ToLower().ToList();
            _History = new List<KeyValuePair<int, char>>();
            _Playrs = new string[2];
            _CurrentPlayerIndex = 0;
        }
        /// <summary>
        /// 获取或设定1号游戏者名字
        /// </summary>
        public string Player1
        {
            get
            {
                return _Playrs[0];
            }
            set
            {
                _Playrs[0] = value;
            }
        }
        /// <summary>
        /// 获取或设定2号游戏者名字
        /// </summary>
        public string Player2
        {
            get
            {
                return _Playrs[1];
            }
            set
            {
                _Playrs[1] = value;
            }
        }
        /// <summary>
        /// 切换游戏者
        /// </summary>
        private void SwapPlayr()
        {
            _CurrentPlayerIndex = _CurrentPlayerIndex ^ 1;
        }
        /// <summary>
        /// 当前游戏者名字
        /// </summary>
        public string CurrentPlayer
        {
            get
            {
                return _Playrs[_CurrentPlayerIndex];
            }
        }
        /// <summary>
        /// 移除指定索引的字母
        /// </summary>
        public void Remove(int index)
        {
            if (index < 0 || index >= _List.Count)
            {
                throw new IndexOutOfRangeException();
            }
            Console.Write(new string(' ', _History.Count * 2));
            Console.Write(CurrentPlayer + "抽取'" + _List[index] + "'");
            _History.Add(new KeyValuePair<int, char>(index, _List[index]));
            _List.RemoveAt(index);
            Console.Write(" 剩余: " + this);
            SwapPlayr();
        }
        /// <summary>
        /// 悔一步
        /// </summary>
        public void Undo()
        {
            if (_History.Count == 0)
            {
                throw new NotImplementedException();
            }
            var kv = _History.Last();
            _History.RemoveAt(_History.Count - 1);
            _List.Insert(kv.Key, kv.Value);
            SwapPlayr();
        }
        /// <summary>
        /// 当前剩余字母数
        /// </summary>
        public int Count
        {
            get { return _List.Count; }
        }

        /// <summary>
        /// 判断当前剩余字母是否是升序序列
        /// </summary>
        public bool IsAscending()
        {
            if (Count <= 1)
            {
                return true;
            }
            var ee = _List.GetEnumerator();
            ee.MoveNext();
            var pre = ee.Current;
            while (ee.MoveNext())
            {
                if (ee.Current > pre)
                {
                    pre = ee.Current;
                }
                else
                {
                    return false;
                }
            }
            return true;
        }
        /// <summary>
        /// 返回当前单词被抽离字母以_(下划线)代替的字符串
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            var list = new List<char>(_List);
            for (int i = _History.Count - 1; i >= 0; i--)
            {
                list.Insert(_History[i].Key, '_');
            }
            return string.Concat(list);
        }
        /// <summary>
        /// 继续游戏,返回胜利者编号 0:一号游戏者 1:二号游戏者
        /// </summary>
        public int Play()
        {
            if (IsAscending())
            {
                Console.Write(" " + _Playrs[_CurrentPlayerIndex ^ 1] + "");
                return _CurrentPlayerIndex ^ 1;
            }
            for (int i = 0; i < Count; i++)
            {
                Console.WriteLine();
                Remove(i);
                if (Play() != _CurrentPlayerIndex)
                {
                    Undo();
                    Console.WriteLine(" " + CurrentPlayer + "放弃");
                    return _CurrentPlayerIndex;
                }
                Undo();
                Console.Write(new string(' ', _History.Count * 2));
                Console.Write(CurrentPlayer + "重来");
            }
            Console.Write(" " + CurrentPlayer + "没字母可抽了 请求再悔一步");
            return _CurrentPlayerIndex ^ 1;
        }
    }
Game类

相关文章: