예제 #1
0
        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);
                }
            }
        }
예제 #2
0
        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++;
            }
        }
예제 #3
0
파일: Program.cs 프로젝트: spdr870/SnakeAI
        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);
            }
        }