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; } }