Example #1
0
        static void Main(string[] args)
        {
            Console.SetWindowSize(55, 40);

            Console.ForegroundColor = ConsoleColor.DarkRed;
            Console.WriteLine("\t   SNAKE GAME - Marek Swierkot 2018 Edition \n");

            Console.ForegroundColor = ConsoleColor.Gray;
            Console.WriteLine("\t  \t Press E, M, H to start... \n");
            Console.WriteLine("\t  \t [E]asy, [M]edium, [H]ard \n");

            Console.ForegroundColor = ConsoleColor.DarkGray;
            Console.WriteLine("\t     [SNAKE IS CONTROLLED WITH ARROWS] \n");

            Console.ForegroundColor = ConsoleColor.White;



            ConsoleKey key = Console.ReadKey(true).Key;

            if (key.Equals(ConsoleKey.E))
            {
                HardnessLevel = 15;
            }
            if (key.Equals(ConsoleKey.M))
            {
                HardnessLevel = 40;
            }
            if (key.Equals(ConsoleKey.H))
            {
                HardnessLevel = 50;
            }

            Console.Clear();
            Console.ForegroundColor = ConsoleColor.DarkGray;
            Console.WriteLine("\t\t CONSOLE SNAKE by Marek Swierkot");
            Console.ForegroundColor = ConsoleColor.White;
            // Array defines two dimensional array, used in the program as a board for Snake
            int[,] Array = new int[GAME_SIZE, GAME_SIZE];

            bool ButtonPressed = false;
            bool Eaten         = true;

            // Default direction on start = LEFT
            string Direction = "LEFT";

            // Predator, is a List of Snake type, which stores snake parts, starting from its head
            List <Snake> Predator = new List <Snake>();

            Snake  head       = new Snake((GAME_SIZE - 1) / 2, (GAME_SIZE - 1) / 2);
            Food   apple      = new Food();
            Random ranodmiser = new Random();

            DateTime time1 = DateTime.Now;
            DateTime time2 = DateTime.Now;


            //Populate list with first element - head - snake at the beggining must have at least head
            Predator.Add(head);
            Array[Predator[0].GetPosX(), Predator[0].GetPosX()] = 1;


            while (GAME)
            {
                time1         = DateTime.Now;
                ButtonPressed = false;


                //If boolean variable Eaten is set to true, which means that snake's head has met with apple object, generate new random x and y,
                // change Apple Position and set again Eaten to false
                if (Eaten)
                {
                    int x = ranodmiser.Next(0, GAME_SIZE);
                    int y = ranodmiser.Next(0, GAME_SIZE);

                    apple.UpdatePosition(x, y);
                    Eaten = false;
                }

                while (true)
                {
                    time2 = DateTime.Now;

                    if (time2.Subtract(time1).TotalMilliseconds > TIMER)
                    {
                        break;
                    }
                    if (Console.KeyAvailable)
                    {
                        ConsoleKeyInfo input = Console.ReadKey(true);

                        if (input.Key.Equals(ConsoleKey.UpArrow) && Direction != "DOWN" && ButtonPressed == false)
                        {
                            Direction     = "UP";
                            ButtonPressed = true;
                        }
                        if (input.Key.Equals(ConsoleKey.DownArrow) && Direction != "UP" && ButtonPressed == false)
                        {
                            Direction     = "DOWN";
                            ButtonPressed = true;
                        }
                        if (input.Key.Equals(ConsoleKey.LeftArrow) && Direction != "RIGHT" && ButtonPressed == false)
                        {
                            Direction     = "LEFT";
                            ButtonPressed = true;
                        }
                        if (input.Key.Equals(ConsoleKey.RightArrow) && Direction != "LEFT" && ButtonPressed == false)
                        {
                            Direction     = "RIGHT";
                            ButtonPressed = true;
                        }
                    }
                }

                int targetY, targetX;

                try
                {
                    switch (Direction)
                    {
                    case "LEFT":
                    {
                        ZeroArray(Array);         // refreshemnt of array
                        Array[apple.GetPosX(), apple.GetPosY()] = 2;


                        if (Predator.Count == 1)
                        {
                            Predator[0].MoveLeft();
                            Array[Predator[0].GetPosX(), Predator[0].GetPosY()] = 1;
                        }
                        else
                        {
                            Predator.RemoveAt(Predator.Count - 1);
                            Array[Predator[Predator.Count - 1].GetPosX(), Predator[Predator.Count - 1].GetPosY()] = 0;

                            targetX = Predator.First().GetPosX();
                            targetY = Predator.First().GetPosY();


                            Snake snake = new Snake(targetX - 1, targetY);
                            Predator.Insert(0, snake);


                            foreach (Snake part in Predator)
                            {
                                Array[part.GetPosX(), part.GetPosY()] = 1;
                            }
                        }


                        break;
                    }

                    case "UP":
                    {
                        ZeroArray(Array);
                        Array[apple.GetPosX(), apple.GetPosY()] = 2;

                        if (Predator.Count == 1)
                        {
                            Predator[0].MoveUp();
                            Array[Predator[0].GetPosX(), Predator[0].GetPosY()] = 1;
                        }
                        else
                        {
                            Predator.RemoveAt(Predator.Count - 1);
                            Array[Predator[Predator.Count - 1].GetPosX(), Predator[Predator.Count - 1].GetPosY()] = 0;

                            targetX = Predator.First().GetPosX();
                            targetY = Predator.First().GetPosY();


                            Snake snake = new Snake(targetX, targetY - 1);
                            Predator.Insert(0, snake);


                            foreach (Snake part in Predator)
                            {
                                Array[part.GetPosX(), part.GetPosY()] = 1;
                            }
                        }
                        break;
                    }

                    case "RIGHT":
                    {
                        ZeroArray(Array);
                        Array[apple.GetPosX(), apple.GetPosY()] = 2;

                        if (Predator.Count == 1)
                        {
                            Predator[0].MoveRight();
                            Array[Predator[0].GetPosX(), Predator[0].GetPosY()] = 1;
                        }
                        else
                        {
                            Predator.RemoveAt(Predator.Count - 1);
                            Array[Predator[Predator.Count - 1].GetPosX(), Predator[Predator.Count - 1].GetPosY()] = 0;

                            targetX = Predator.First().GetPosX();
                            targetY = Predator.First().GetPosY();


                            Snake snake = new Snake(targetX + 1, targetY);
                            Predator.Insert(0, snake);


                            foreach (Snake part in Predator)
                            {
                                Array[part.GetPosX(), part.GetPosY()] = 1;
                            }
                        }

                        break;
                    }

                    case "DOWN":
                    {
                        ZeroArray(Array);
                        Array[apple.GetPosX(), apple.GetPosY()] = 2;

                        if (Predator.Count == 1)
                        {
                            Predator[0].MoveDown();
                            Array[Predator[0].GetPosX(), Predator[0].GetPosY()] = 1;
                        }
                        else
                        {
                            Predator.RemoveAt(Predator.Count - 1);
                            Array[Predator[Predator.Count - 1].GetPosX(), Predator[Predator.Count - 1].GetPosY()] = 0;

                            targetX = Predator.First().GetPosX();
                            targetY = Predator.First().GetPosY();


                            Snake snake = new Snake(targetX, targetY + 1);
                            Predator.Insert(0, snake);


                            foreach (Snake part in Predator)
                            {
                                Array[part.GetPosX(), part.GetPosY()] = 1;
                            }
                        }
                        break;
                    }
                    }
                }
                catch (Exception ex)
                {
                    GameOver();
                }

                UpdateArray(Array);


                // Condition below, determines if Snake's head, has met with apple
                // Then it creates new object - eaten apple, which then is populated with posX and posY, and inserted to the beggining of the Predator list

                if (apple.GetPosX() == Predator.First().GetPosX() && apple.GetPosY() == Predator.First().GetPosY())
                {
                    Snake eatenApple = new Snake();


                    eatenApple.SetPosX(apple.GetPosX());
                    eatenApple.SetPosY(apple.GetPosY());

                    Predator.Insert(0, eatenApple);
                    Array[apple.GetPosX(), apple.GetPosY()] = 0;
                    Eaten = true;

                    if (TIMER > 100)
                    {
                        HardnessLevel = ranodmiser.Next(HardnessLevel - 5, HardnessLevel + 5);
                        TIMER        -= HardnessLevel;
                    }

                    RESULT += (HardnessLevel / 3);
                }

                if (Predator.Count > 3) // More than 3 because there's no point in checking if snake crashed into itself, if it's less than 4 segments long
                {
                    for (int i = 3; i < Predator.Count - 1; i++)
                    {
                        if (Predator.First().GetPosX() == Predator[i + 1].GetPosX() && Predator.First().GetPosY() == Predator[i + 1].GetPosY())
                        {
                            GameOver();
                        }
                    }
                }
            }
        }