/// <summary> /// startet ein Mini-Konsolen Spiel /// </summary> /// <param name="field">Spielfeld, was gespielt werden soll</param> public static void Run(SokowahnField field) { var game = new SokowahnField(field); var steps = new Stack<ushort[]>(); for (; ; ) { string output = game.ToString(); int playerChar = output.IndexOfAny(new[] { '@', '+' }); Console.Clear(); Console.ForegroundColor = ConsoleColor.Gray; Console.Write(output.Substring(0, playerChar)); Console.ForegroundColor = ConsoleColor.Yellow; Console.Write(output[playerChar]); Console.ForegroundColor = ConsoleColor.Gray; Console.Write(output.Remove(0, playerChar + 1)); Console.WriteLine(); Console.WriteLine(); Console.WriteLine("Steps: " + steps.Count.ToString("N0")); Console.WriteLine(); Console.WriteLine("Remain: " + game.boxesRemain); if (game.boxesRemain == 0) return; bool step = false; var oldState = game.GetGameState(); switch (Console.ReadKey(true).Key) { case ConsoleKey.Escape: return; case ConsoleKey.A: case ConsoleKey.NumPad4: case ConsoleKey.LeftArrow: step = game.MoveLeft(); break; case ConsoleKey.D: case ConsoleKey.NumPad6: case ConsoleKey.RightArrow: step = game.MoveRight(); break; case ConsoleKey.W: case ConsoleKey.NumPad8: case ConsoleKey.UpArrow: step = game.MoveUp(); break; case ConsoleKey.S: case ConsoleKey.NumPad2: case ConsoleKey.DownArrow: step = game.MoveDown(); break; case ConsoleKey.Z: case ConsoleKey.Delete: case ConsoleKey.Backspace: { if (steps.Count == 0) break; game.SetGameState(steps.Pop(), 0); } break; default: continue; } if (step) { steps.Push(oldState); } } }