static void Loop() { // Initialisera spelet const int frameRate = 15; List <GameObject> items = new List <GameObject>(); List <Tail> svans = new List <Tail>(); Player play = new Player(Direction.right, 'O', svans, 7, 4); Food fodd = new Food('©', 6, 8); GameWorld world = new GameWorld(0, items, play, fodd); ConsoleRenderer renderer = new ConsoleRenderer(world, 120, 60, play, fodd); // TODO Skapa spelare och andra objekt etc. genom korrekta anrop till vår GameWorld-instans // ... items.Add(play); items.Add(fodd); // Huvudloopen bool running = true; while (running) { // Kom ihåg vad klockan var i början DateTime before = DateTime.Now; // Hantera knapptryckningar från användaren // Använder piltangenterna för förflyttning. Förflyttar spelaren med hjälp av enum. Går ej flytta spelaren om spelaren trycker motsatt håll. Q körs gameover metod. ConsoleKey key = ReadKeyIfExists(); switch (key) { case ConsoleKey.Q: running = world.GameOver(false); break; case ConsoleKey.UpArrow: if (play._direction == Direction.down) { break; } else { play._direction = Direction.up; break; } case ConsoleKey.DownArrow: if (play._direction == Direction.up) { break; } else { play._direction = Direction.down; break; } case ConsoleKey.LeftArrow: if (play._direction == Direction.right) { break; } else { play._direction = Direction.left; break; } case ConsoleKey.RightArrow: if (play._direction == Direction.left) { break; } else { play._direction = Direction.right; break; } // TODO Lägg till logik för andra knapptryckningar // ... } // Uppdatera världen och rendera om renderer.RenderBlank(); world.Update(); renderer.Render(); running = world.GameOver(running); // Mät hur lång tid det tog double frameTime = Math.Ceiling((1000.0 / frameRate) - (DateTime.Now - before).TotalMilliseconds); if (frameTime > 0) { // Vänta rätt antal millisekunder innan loopens nästa varv Thread.Sleep((int)frameTime); } } }
static void Start() { // Initialisera spelet const int frameRate = 10; int updateCounter = 0; GameWorld world = new GameWorld(50, 20); ConsoleRenderer renderer = new ConsoleRenderer(world); Player player = new Player(world, Direction.Right); world.CreateFood(); // Huvudloopen bool running = true; while (running) { if (world.foodTimer == 0) { Console.Clear(); string endString1 = "Game over"; string endString2 = $"Your score was {world.Score}"; Console.SetCursorPosition((world.Width / 2) - (endString1.Length / 2), world.Height / 3); Console.Write(endString1); Console.SetCursorPosition((world.Width / 2) - (endString2.Length / 2), world.Height / 2); Console.Write(endString2); break; } // Kom ihåg vad klockan var i början DateTime before = DateTime.Now; // Hantera knapptryckningar från användaren ConsoleKey key = ReadKeyIfExists(); switch (key) { case ConsoleKey.Q: running = false; break; case ConsoleKey.UpArrow: player.Direction = Direction.Up; break; case ConsoleKey.DownArrow: player.Direction = Direction.Down; break; case ConsoleKey.LeftArrow: player.Direction = Direction.Left; break; case ConsoleKey.RightArrow: player.Direction = Direction.Right; break; } // Uppdatera världen och rendera om renderer.RenderBlank(); world.Update(); renderer.Render(); // Vi kollar om det har gått en sekund. if (updateCounter == frameRate - 1) { // Om det har det, uppdatera dessa timers så att de uppdateras varje sekund. world.foodTimer--; world.randomCounter++; updateCounter = 0; } // Mät hur lång tid det tog double frameTime = Math.Ceiling((1000.0 / frameRate) - (DateTime.Now - before).TotalMilliseconds); if (frameTime > 0) { // Vänta rätt antal millisekunder innan loopens nästa varv Thread.Sleep((int)frameTime); } updateCounter++; } }
static void Main(string[] args) { Console.CursorVisible = false; Console.WriteLine("Press 1 to train new neural network"); Console.WriteLine("Press 2 start snake with hardcoded AI"); Console.WriteLine("Press 3 to load trained network"); var key = Console.ReadKey(); bool isTraining = false; SnakeAI snakeAI = null; if (key.KeyChar == '1') { isTraining = true; new Thread(() => { Thread.CurrentThread.Priority = ThreadPriority.BelowNormal; TrainNeuralAI(); }).Start(); } else if (key.KeyChar == '2') { snakeAI = new SnakeFakeAI(); } else { snakeAI = new SnakeNeuralAI() { Network = NeuralNetwork.Load(@"AI\TrainedNetwork") }; } Console.Clear(); while (true) { if (isTraining) { lock (_lockObjectFile) { snakeAI = SnakeNeuralAI.Clone(SuperNetwork, false); } } World world = new World(worldWidth, worldHeigh, foodPoints); Stopwatch stopwatch = new Stopwatch(); while (world.Snake.Alive) { stopwatch.Restart(); snakeAI.MakeDecision(world); lock (_lockObjectConsole) { ConsoleRenderer.Render(world); } Thread.Sleep(Math.Max(0, 50 - (int)stopwatch.ElapsedMilliseconds)); if (Console.KeyAvailable) { Console.ReadKey(); break; } } lock (_lockObjectConsole) { ConsoleRenderer.Render(world); } Thread.Sleep(2000); } }