private void MoveSnake()
        {
            int snakePartsCount = Snake.Parts.Count;
            if(PartsToAdd > 0)
            {
                SnakePart newPart = new SnakePart(Snake.Parts[Snake.Parts.Count - 1].X, Snake.Parts[Snake.Parts.Count - 1].Y);
                grid.Children.Add(newPart.rect);
                Snake.Parts.Add(newPart);
                PartsToAdd--;
            }
            for (int i = snakePartsCount - 1; i >= 1; i--)
            {
                Snake.Parts[i].X = Snake.Parts[i - 1].X;
                Snake.Parts[i].Y = Snake.Parts[i - 1].Y;
            }
            Snake.Parts[0].X = Snake.Head.X;
            Snake.Parts[0].Y = Snake.Head.Y;
            Snake.Head.X += directionX;
            Snake.Head.Y += directionY;

            
            if (CheckCollision())
                EndGame();
            else
                Snake.DrawSnake();
            EatFood();

        }
Beispiel #2
0
 public MySnake()
 {
     Head = new SnakePart(20, 0);
     Head.rect.Height = Head.rect.Width = 10;
     Head.rect.Fill = Brushes.Black;
     Parts = new List<SnakePart>();
     CreatDefaultParts();
 }
Beispiel #3
0
 private void GenerateFood()
 {
     Random random = new Random();
     _food = new SnakePart
     {
         X = random.Next(0, _maxTileW),
         Y = random.Next(0, _maxTileH)
     };
 }
Beispiel #4
0
        /*
         * Method which determines if the snake has reached the item
         * */
        public Boolean IsReached(SnakePart snake)
        {
            Boolean isReached = false;

            if ((snake.Get_X() == _X) && (snake.Get_Y() == _Y))
                isReached = true;

            return isReached;
        }
Beispiel #5
0
 public bool checkFood(SnakePart food)
 {
     if (getHead().X == food.X && getHead().Y == food.Y) {
         snake.Add(new SnakePart(food.X, food.Y));
         return true;
     }
     else {
         return false;
     }
 }
        private void StartGame()
        {
            gameover  = false;
            score     = 0;
            direction = 0;
            snake.Clear();
            SnakePart head = new SnakePart();

            head.X = 10;
            head.Y = 5;
            snake.Add(head);
            GenerateFood();
        }
 void InitFood()
 {
     //poczatkowa lokalizacja jedzenia
     _food = new SnakePart(20, 10);
     //kolor jedzenia
     _food.Rect.Fill = Brushes.Blue;
     //rozmiar jedzenia
     _food.Rect.Height = _food.Rect.Width = 20;
     //dodaj jedzenie (prostokat ktory do reprezentuje) do okna
     grid.Children.Add(_food.Rect);
     //dodaj jedzenie do okna (konkretna kolumna i wiersz)
     Grid.SetColumn(_food.Rect, _food.X);
     Grid.SetRow(_food.Rect, _food.Y);
 }
        void RuchWeza()
        {
            int snakePartCount = _snake.Parts.Count;

            if (_partsToAdd > 0)
            {
                SnakePart newPart = new SnakePart(_snake.Parts[_snake.Parts.Count - 1].X, _snake.Parts[_snake.Parts.Count - 1].Y);
                grid.Children.Add(newPart.Rect);
                _snake.Parts.Add(newPart);
                _partsToAdd--;
            }


            //zaczynamy od liczby elementow pomniejszonej o 1;
            //petla konczy sie na 1 elemencie;
            //stopniowo przechodzimy przez kazdy element;
            for (int i = _snake.Parts.Count - 1; i >= 1; i--)
            {
                _snake.Parts[i].X = _snake.Parts[i - 1].X;
                _snake.Parts[i].Y = _snake.Parts[i - 1].Y;
            }
            //pierwszy element ciala weza przyjmuje wspolrzedne glowy w poprzedniej chwili
            _snake.Parts[0].X = _snake.head.X;
            _snake.Parts[0].Y = _snake.head.Y;
            //glowa zyskuje ustawiony kierunek
            _snake.head.X += _directionX;
            _snake.head.Y += _directionY;
            //Czy nastapila kolizja
            if (CheckCollision())
            {
                KoniecGry();
            }

            else
            {
                //Jeśli wąż znalazł pożywienie to rysuj kolejne jedzenie
                if (CzyJedzenie())
                {
                    //Dodaj ilosc punktow zgodnie z wybrany,m poziomem trudnosci
                    Points += Mode;
                    //Wyswietl aktualna liczbe punktow
                    LabelPoints.Content = Convert.ToString(Points);
                    RysujJedzenie();
                }
                //Po dokonaniu zmian narysuj weza
                _snake.Rysuj();
            }
        }
        private void MoveSnake()
        {
            while (snakeParts.Count >= snakeLength)
            {
                GameArea.Children.Remove(snakeParts[0].UiElement);
                snakeParts.RemoveAt(0);
            }

            foreach (SnakePart snakePart in snakeParts)
            {
                (snakePart.UiElement as Rectangle).Fill = snakeBodyBrush;
                snakePart.IsHead = false;
            }

            SnakePart snakeHead = snakeParts[snakeParts.Count - 1];
            double    nextX     = snakeHead.Position.X;
            double    nextY     = snakeHead.Position.Y;

            switch (snakeDirection)
            {
            case SnakeDirection.Left:
                nextX -= SnakeSquareSize;
                break;

            case SnakeDirection.Right:
                nextX += SnakeSquareSize;
                break;

            case SnakeDirection.Up:
                nextY -= SnakeSquareSize;
                break;

            case SnakeDirection.Down:
                nextY += SnakeSquareSize;
                break;
            }

            snakeParts.Add(new SnakePart()
            {
                Position = new Point(nextX, nextY),
                IsHead   = true
            });

            DrawSnake();

            DoCollisionCheck();
        }
Beispiel #10
0
        private void MoveSnake()
        {
            // Определяем сторону, в которую будет двигаться змейка
            Point     old_head  = snakeParts[snakeParts.Count - 1].Position;
            SnakePart snakeHead = snakeParts[snakeParts.Count - 1];
            double    nextX     = snakeHead.Position.X;
            double    nextY     = snakeHead.Position.Y;

            switch (snakeDirection)
            {
            case SnakeDirection.Left:
                nextX -= SnakeSquareSize;
                break;

            case SnakeDirection.Right:
                nextX += SnakeSquareSize;
                break;

            case SnakeDirection.Up:
                nextY -= SnakeSquareSize;
                break;

            case SnakeDirection.Down:
                nextY += SnakeSquareSize;
                break;
            }
            snakeParts[snakeParts.Count - 1].Position = new Point(nextX, nextY);
            Point old;

            for (int i = snakeParts.Count - 2; i >= 0; i--)
            {
                old = snakeParts[i].Position;
                snakeParts[i].Position = old_head;
                old_head = old;
            }
            if (snakeLength > snakeParts.Count)
            {
                snakeParts.Insert(0, new SnakePart()
                {
                    Position = old_head
                });
            }
            DrawSnake();
            // Проверка столкновений
            DoCollisionCheck();
        }
Beispiel #11
0
 public MySnake()
 {
     Head            = new SnakePart(20, 0);
     Head.Rect.Width = Head.Rect.Height = 10;
     Head.Rect.Fill  = System.Windows.Media.Brushes.Red;
     Parts           = new List <SnakePart>();
     Parts.Add(new SnakePart(19, 0));
     Parts.Add(new SnakePart(18, 0));
     Parts.Add(new SnakePart(17, 0));
     Parts.Add(new SnakePart(16, 0));
     Parts.Add(new SnakePart(15, 0));
     Parts.Add(new SnakePart(14, 0));
     Parts.Add(new SnakePart(13, 0));
     Parts.Add(new SnakePart(12, 0));
     Parts.Add(new SnakePart(11, 0));
     Parts.Add(new SnakePart(10, 0));
 }
Beispiel #12
0
        public MySnake() // konstruktor - glowa
        {
            Head            = new SnakePart(20, 0);
            Head.Rect.Width = Head.Rect.Height = 20;
            Head.Rect.Fill  = System.Windows.Media.Brushes.Pink;
            Parts           = new List <SnakePart>();

            Parts.Add(new SnakePart(19, 0)); // tworzenie kolejnych czesci snake
            Parts.Add(new SnakePart(18, 0));
            Parts.Add(new SnakePart(17, 0));
            Parts.Add(new SnakePart(16, 0));
            Parts.Add(new SnakePart(15, 0));
            Parts.Add(new SnakePart(14, 0));
            Parts.Add(new SnakePart(13, 0));
            Parts.Add(new SnakePart(12, 0));
            Parts.Add(new SnakePart(11, 0));
            Parts.Add(new SnakePart(10, 0));
        }
Beispiel #13
0
        //Updating snake parts positions after each time interval to simulate movement
        public void UpdatePartsPositions()
        {
            double newHeadX = SnakeParts[0].Position.X;
            double newHeadY = SnakeParts[0].Position.Y;

            //Checking movement direction to determine where to position head
            switch (SnakeDirection)
            {
            case SnakeDirection.Left:
                newHeadX -= Constants.SNAKESQUARESIZE;
                break;

            case SnakeDirection.Right:
                newHeadX += Constants.SNAKESQUARESIZE;
                break;

            case SnakeDirection.Up:
                newHeadY -= Constants.SNAKESQUARESIZE;
                break;

            case SnakeDirection.Down:
                newHeadY += Constants.SNAKESQUARESIZE;
                break;
            }

            ISnakePart newHead = new SnakePart(isHead: true)
            {
                Position = new Point()
                {
                    X = newHeadX,
                    Y = newHeadY
                }
            };

            //Changing old head tile to become body part
            SnakeParts[0].SwitcHeadToBody();
            //Inserting new head at the beginning of the snake
            SnakeParts.Insert(0, newHead);
            //Removing snakes tail
            SnakeParts.RemoveAt(SnakeParts.Count - 1);
        }
Beispiel #14
0
        private void MoveSnake()
        {
            int snakePartCount = _snake.Parts.Count;

            if (_partsToAdd > 0)
            {
                SnakePart newPart = new SnakePart(_snake.Parts[_snake.Parts.Count - 1].X,
                                                  _snake.Parts[_snake.Parts.Count - 1].Y);
                grid.Children.Add(newPart.Rect);
                _snake.Parts.Add(newPart);
                _partsToAdd--;
            }

            for (int i = snakePartCount - 1; i >= 1; i--)
            {
                _snake.Parts[i].X = _snake.Parts[i - 1].X;
                _snake.Parts[i].Y = _snake.Parts[i - 1].Y;
            }

            _snake.Parts[0].X = _snake.Head.X;
            _snake.Parts[0].Y = _snake.Head.Y;
            _snake.Head.X    += _directionX;
            _snake.Head.Y    += _directionY;
            _snake.RedrawSnake();

            if (CheckCollision())
            {
                EndGame();
            }
            else
            {
                if (CheckFood())
                {
                    RedrawFood();
                    _snake.RedrawSnake();
                }
            }
        }
Beispiel #15
0
        static void Main(string[] args)
        {
            Console.Title         = "Snake!";
            Console.CursorVisible = false;

            Random random = new Random();

            SnakePart tempSP = new SnakePart();

            tempSP.x = random.Next(16);
            tempSP.y = random.Next(32);
            snakeParts.Add(tempSP);

            appleX = random.Next(16);
            appleY = random.Next(32);
            DrawPixel(appleX, appleY, "*");

            Thread t = new Thread(new ThreadStart(ReadKeys));

            t.Start();

            UpdateMethod();
        }
Beispiel #16
0
        private void DoCollisionCheck()
        {
            SnakePart snakeHead = snakeParts[snakeParts.Count - 1];

            if ((snakeHead.Position.X == Canvas.GetLeft(snakeFood)) && (snakeHead.Position.Y == Canvas.GetTop(snakeFood)))
            {
                EatSnakeFood();
                return;
            }

            if ((snakeHead.Position.Y < 0) || (snakeHead.Position.Y >= Map.ActualHeight) ||
                (snakeHead.Position.X < 0) || (snakeHead.Position.X >= Map.ActualWidth))
            {
                EndGame();
            }

            foreach (SnakePart snakeBodyPart in snakeParts.Take(snakeParts.Count - 1))
            {
                if ((snakeHead.Position.X == snakeBodyPart.Position.X) && (snakeHead.Position.Y == snakeBodyPart.Position.Y))
                {
                    EndGame();
                }
            }
        }
Beispiel #17
0
 //make food
 void initFood()
 {
     _food = new SnakePart(10,10);
     _food.Rect.Width = _food.Rect.Height = 10;
     _food.Rect.Fill = Brushes.Blue;
     grid.Children.Add(_food.Rect);
     Grid.SetColumn(_food.Rect, _food.X);
     Grid.SetRow(_food.Rect, _food.Y);
 }
 private void generateFood()
 {
     Random random = new Random();
     food = new SnakePart(
                 random.Next(0, MAX_HEIGHT),
                 random.Next(0, MAX_WIDTH)
                 );
 }
Beispiel #19
0
        static void UpdateMethod()
        {
            bool x = false;

            for (int i = snakeParts.Count - 1; i >= 1; i--)
            {
                if (!x)
                {
                    DrawPixel(snakeParts[i].x, snakeParts[i].y, " ");
                }
                x = true;

                snakeParts[i].x = snakeParts[i - 1].x;
                snakeParts[i].y = snakeParts[i - 1].y;
                DrawPixel(snakeParts[i].x, snakeParts[i].y, "#");
            }

            if (snakeParts.Count == 1)
            {
                DrawPixel(snakeParts[0].x, snakeParts[0].y, " ");
            }

            switch (direction)
            {
            case 0:
                snakeParts[0].y--;
                DrawPixel(snakeParts[0].x, snakeParts[0].y, "#");
                break;

            case 1:
                snakeParts[0].y++;
                DrawPixel(snakeParts[0].x, snakeParts[0].y, "#");
                break;

            case 2:
                snakeParts[0].x++;
                DrawPixel(snakeParts[0].x, snakeParts[0].y, "#");
                break;

            case 3:
                snakeParts[0].x--;
                DrawPixel(snakeParts[0].x, snakeParts[0].y, "#");
                break;

            default:
                break;
            }

            if (snakeParts[0].x == appleX && snakeParts[0].y == appleY)
            {
                SnakePart tempSP = new SnakePart();
                tempSP.x = snakeParts[snakeParts.Count - 1].x;
                tempSP.y = snakeParts[snakeParts.Count - 1].x;
                snakeParts.Add(tempSP);

                Random random = new Random();
                appleX = random.Next(32);
                appleY = random.Next(32);
                DrawPixel(appleX, appleY, "*");
            }

            Thread.Sleep(WAIT_MS);
            UpdateMethod();
        }
Beispiel #20
0
        /// <summary>
        /// This function executes each time the snake moves
        /// </summary>
        /// <param name="head">A <see cref="SnakePart"/> which is initialized as the head of the head snake</param>
        /// <param name="snakeParts">A list of <see cref="SnakePart"/> objects which contains all the snake's body except the head and the tail</param>
        /// <param name="tail">A <see cref="SnakePart"/> which is initialized as the tail of the head snake</param>
        /// <param name="gameBoard">The <see cref="Board"/> which is made in the beginning of the game</param>
        /// <param name="headDirection">The next snake's <see cref="Direction"/> which is either left, right, up or down</param>
        /// <returns>The <see cref="GameStatus"/> which is either still playing, won or lost</returns>
        public static GameStatus SnakeMove(SnakePart head, List <SnakePart> snakeParts, SnakePart tail, Board gameBoard, Direction headDirection)
        {
            Point headTemp = head.Location;
            Point newPoint; // Next head's location if possible

            switch (headDirection)
            {
            case Direction.Up:
                newPoint = Point.ToPoint(head.Location.X, head.Location.Y == 0 ? gameBoard.Height - 1 : head.Location.Y - 1);
                break;

            case Direction.Down:
                newPoint = Point.ToPoint(head.Location.X, head.Location.Y == gameBoard.Height - 1 ? 0 : head.Location.Y + 1);
                break;

            case Direction.Left:
                newPoint = Point.ToPoint(head.Location.X == 0 ? gameBoard.Width - 1 : head.Location.X - 1, head.Location.Y);
                break;

            case Direction.Right:
                newPoint = Point.ToPoint(head.Location.X == gameBoard.Width - 1 ? 0 : head.Location.X + 1, head.Location.Y);
                break;

            default:
                newPoint = Point.ToPoint(0, 0);     // Just to remove the warning
                break;
            }

            if (!gameBoard.FreePoints.Contains(newPoint)) // Checks if the snake's head touched its body
            {
                return(GameStatus.Lost);
            }
            // Moving the snake in the console
            head.Location = newPoint;
            gameBoard.AddSnake(newPoint);
            Point tailTemp = snakeParts[snakeParts.Count - 1].Location;

            for (int i = snakeParts.Count - 1; i > 0; i--)
            {
                snakeParts[i].Location = snakeParts[i - 1].Location;
            }
            snakeParts[0].Location = headTemp;
            if (head.Location.Equals(gameBoard.Fruit))                          // The snake ate the fruit
            {
                snakeParts.Add(new SnakePart(tailTemp));                        // Resizing the snake after eating the fruit
                if (snakeParts.Count == gameBoard.Height * gameBoard.Width - 2) // The screen is full so the user wins
                {
                    return(GameStatus.Won);
                }
                gameBoard.SetFruitLocation(); // Putting another fruit in the console
            }
            else
            {
                gameBoard.RemoveSnake(tail.Location);
                tail.Location = tailTemp;
            }

            return(GameStatus.StillPlaying);
        }
Beispiel #21
0
 private void CreateFood()
 {
     Random random = new Random();
     int x = random.Next(5, 55);
     int y = random.Next(5, 55);
     Food = new SnakePart(x, y);
     DeletedFood = new SnakePart(x, y);
     x = y = 0; // clear
     Food.rect.Height = Food.rect.Width = 10;
     Food.rect.Fill = Brushes.Blue;
     grid.Children.Add(Food.rect);
     Grid.SetColumn(Food.rect, Food.X);
     Grid.SetRow(Food.rect, Food.Y);
 }
Beispiel #22
0
        //move snake
        private void MoveSnake()
        {
            int snakePartCount = _snake.Parts.Count;
            if (_partsToAdd>0)
            {
                SnakePart newPart = new SnakePart(_snake.Parts[_snake.Parts.Count - 1].X, _snake.Parts[_snake.Parts.Count-1].Y );
                grid.Children.Add(newPart.Rect);
                _snake.Parts.Add(newPart);
                _partsToAdd--;
            }

            for (int i = snakePartCount - 1; i >= 1; i-- )
            {
                _snake.Parts[i].X = _snake.Parts[i - 1].X;
                _snake.Parts[i].Y = _snake.Parts[i - 1].Y;
            }
            _snake.Parts[0].X = _snake.Head.X;
            _snake.Parts[0].Y = _snake.Head.Y;
            _snake.Head.X += _directionX;
            _snake.Head.Y += _directionY;
            if (CheckCollision())
            {
                EndGame();
            }
            else
            {
                if (CheckFood())
                    RedrawFood();
                _snake.RedrawSnake();
            }
        }
Beispiel #23
0
        private void GenerateFood()
        {
            Random random = new Random();

            food = new SnakePart(random.Next(0, 20), random.Next(0, 15));
        }
Beispiel #24
0
        private void UpdateSnake(object sender, EventArgs e)
        {
            if (!gameover)
            {
                for (int i = snake.Count - 1; i >= 0; i--)
                {
                    if (i == 0)
                    {
                        switch (direction)
                        {
                        case 0:
                            snake[i].Y++;
                            break;

                        case 1:
                            snake[i].X--;
                            break;

                        case 2:
                            snake[i].X++;
                            break;

                        case 3:
                            snake[i].Y--;
                            break;
                        }
                        //check for out of bounds
                        SnakePart head = snake[0];
                        if (head.X >= 20 || head.X < 0 || head.Y >= 15 || head.Y < 0)
                        {
                            if (head.X >= 20)
                            {
                                head.X -= 20;
                            }
                            if (head.X < 0)
                            {
                                head.X += 20;
                            }
                            if (head.Y >= 15)
                            {
                                head.Y -= 15;
                            }
                            if (head.Y < 0)
                            {
                                head.Y += 15;
                            }
                        }
                        //check for collision with body
                        for (int j = 1; j < snake.Count; j++)
                        {
                            if (head.X == snake[j].X && head.Y == snake[j].Y)
                            {
                                GameOver();
                            }
                        }
                        //check for collision with food
                        if (head.X == food.X && head.Y == food.Y)
                        {
                            SnakePart part = new SnakePart(snake[snake.Count - 1].X, snake[snake.Count - 1].Y);
                            snake.Add(part);
                            GenerateFood();
                            score++;
                            if (snakeRate < 30)
                            {
                                snakeRate += 0.3f;

                                snakeLoop.Interval = (int)(1000 / snakeRate);
                            }
                        }
                    }
                    else
                    {
                        snake[i].X = snake[i - 1].X;
                        snake[i].Y = snake[i - 1].Y;
                    }
                }
            }
        }
Beispiel #25
0
        /*
         * Method which determines if the snake has reached the insect
         */
        public Boolean IsReached(SnakePart snakePart)
        {
            Boolean isReached = false;

            if (((snakePart.Get_X() == _X) && (snakePart.Get_Y() == _Y)) || ((snakePart.Get_X() == (_X + (_Side / 2 + 1))) && (snakePart.Get_Y() == _Y)) || ((snakePart.Get_X() == _X) && (snakePart.Get_Y() == (_Y + (_Side / 2) + 1))) || ((snakePart.Get_X() == (_X + (_Side / 2 + 1))) && (snakePart.Get_Y() == (_Y + (_Side / 2) + 1))))
                isReached = true;

            return isReached;
        }
Beispiel #26
0
        private void UpdateSnake()
        {
            _head = _snakeParts[0];
            switch (_direction)
            {
                case 0: // Aşağı git
                    _snakeParts.RemoveAt(_snakeParts.Count - 1);
                    _snakeParts.Insert(0, new SnakePart { X = _head.X, Y = (_head.Y + 1) });
                    break;
                case 1: // Sola git
                    _snakeParts.RemoveAt(_snakeParts.Count - 1);
                    _snakeParts.Insert(0, new SnakePart { X = _head.X - 1, Y = _head.Y });
                    break;
                case 2: // Sağa git
                    _snakeParts.RemoveAt(_snakeParts.Count - 1);
                    _snakeParts.Insert(0, new SnakePart { X = _head.X + 1, Y = _head.Y });
                    break;
                case 3: // Yukarı git
                    _snakeParts.RemoveAt(_snakeParts.Count - 1);
                    _snakeParts.Insert(0, new SnakePart { X = _head.X, Y = _head.Y - 1 });
                    break;
            }

            _head = _snakeParts[0];

            // Kendine çarpan kısımların sayısını al
            int sp = _snakeParts.Count(s => s.X == _head.X && s.Y == _head.Y);

            if (sp > 1) // Kendine çarpan kısım varsa
            {
                GameOver();

            } // Kafası duvara çarpmışsa
            else if (_head.X < 0 || _head.X >= _maxTileW || _head.Y < 0 || _head.Y >= _maxTileH)
            {
                GameOver();

            } // Yem yemişse
            else if (_snakeParts[0].X == _food.X && _snakeParts[0].Y == _food.Y)
            {
                // Yılana kuyruk ekle
                _snakeParts.Add(new SnakePart{ X = _snakeParts[_snakeParts.Count - 1].X, Y = _snakeParts[_snakeParts.Count - 1].Y });

                // Puanı arttır ve yazdır
                _score++;
                lblScore.Text = string.Format("Puan: {0}", _score);

                // Hızı arttır (timer interval düşür) ve ekrana yazdır
                gameTimer.Interval = gameTimer.Interval - 10;
                lblSpeed.Text = string.Format("Hız: {0}", ((410 - gameTimer.Interval) / 10));

                // Yeni yem oluştur
                GenerateFood();
            }
        }
        private async void RenderGame()
        {
            Canvas.SetLeft(snakeHead.Rectangle, snakeHead.PosX);
            Canvas.SetTop(snakeHead.Rectangle, snakeHead.PosY);
            GameField.Children.Add(snakeHead.Rectangle);

            GenerateFeed(snake);

            while (true)
            {
                for (int i = snake.Count - 1; i > 0; i--)
                {
                    snake[i].PosX = snake[i - 1].PosX;
                    snake[i].PosY = snake[i - 1].PosY;
                }

                await Task.Delay(delay);

                if (direction == Direction.Left)
                {
                    snake[0].PosX -= snakeSize;
                }
                else if (direction == Direction.Right)
                {
                    snake[0].PosX += snakeSize;
                }
                else if (direction == Direction.Up)
                {
                    snake[0].PosY -= snakeSize;
                }
                else if (direction == Direction.Down)
                {
                    snake[0].PosY += snakeSize;
                }


                for (int i = 0; i < snake.Count; i++)
                {
                    GameField.Children.Remove(snake[i].Rectangle);
                    Canvas.SetLeft(snake[i].Rectangle, snake[i].PosX);
                    Canvas.SetTop(snake[i].Rectangle, snake[i].PosY);
                    GameField.Children.Add(snake[i].Rectangle);
                }

                if (snake[0].PosX == feed.PosX && snake[0].PosY == feed.PosY)
                {
                    SnakePart snakePart = new SnakePart(snakeSize, false)
                    {
                        PosX = snake.Last().PosX,
                        PosY = snake.Last().PosY,
                    };
                    snake.Add(snakePart);

                    GameField.Children.Remove(feed.Rectangle);

                    GenerateFeed(snake);
                }

                if (snake[0].PosX < 0 || snake[0].PosX > 400 || snake[0].PosY < 0 || snake[0].PosY > 500)
                {
                    MessageBox.Show("Game over!", "Snake", MessageBoxButton.OK, MessageBoxImage.Warning);
                    break;
                }
                else if (snake.Where(s => s.PosX == snake[0].PosX && s.PosY == snake[0].PosY).Count() > 1)
                {
                    MessageBox.Show("Game over!", "Snake", MessageBoxButton.OK, MessageBoxImage.Warning);
                    break;
                }
            }
        }
Beispiel #28
0
        /// <summary>
        /// This function starts the game
        /// </summary>
        /// <param name="delay">Delay value returned from <see cref="ChooseLevel"/></param>
        /// /// <param name="score">User's score after losing the game</param>
        /// <returns>The game status which is whether won or lost. See also <seealso cref="GameStatus"/></returns>
        static GameStatus Snake(int delay, out int score)
        {
            // Few requirements before the game starts
            Board     gameBoard = new Board();
            SnakePart head      = new SnakePart(Point.ToPoint(gameBoard.Width / 2, gameBoard.Height / 2 - 1));

            gameBoard.AddSnake(head.Location);
            List <SnakePart> snakeParts = new List <SnakePart> {
                new SnakePart(Point.ToPoint(gameBoard.Width / 2, gameBoard.Height / 2))
            };

            gameBoard.AddSnake(snakeParts[0].Location);
            SnakePart tail = new SnakePart(Point.ToPoint(gameBoard.Width / 2, gameBoard.Height / 2 + 1));

            gameBoard.AddSnake(tail.Location);
            Direction headDirection = Direction.Up;

            gameBoard.SetFruitLocation();
            while (true)
            {
                do
                {
                    GameStatus status = SnakePart.SnakeMove(head, snakeParts, tail, gameBoard, headDirection);
                    if (status != GameStatus.StillPlaying)
                    {
                        score = snakeParts.Count - 1;
                        return(status); // The game status is whether won or lost
                    }

                    Thread.Sleep(delay);
                } while (!Console.KeyAvailable);   // Checks if the user wants to change the direction

                switch (Console.ReadKey(true).Key) // Changing the direction if it is possible
                {
                case ConsoleKey.UpArrow:
                    if (headDirection != Direction.Down)
                    {
                        headDirection = Direction.Up;
                    }
                    break;

                case ConsoleKey.DownArrow:
                    if (headDirection != Direction.Up)
                    {
                        headDirection = Direction.Down;
                    }
                    break;

                case ConsoleKey.LeftArrow:
                    if (headDirection != Direction.Right)
                    {
                        headDirection = Direction.Left;
                    }
                    break;

                case ConsoleKey.RightArrow:
                    if (headDirection != Direction.Left)
                    {
                        headDirection = Direction.Right;
                    }
                    break;

                default:
                    continue;
                }
            }
        }