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(); }
public MySnake() { Head = new SnakePart(20, 0); Head.rect.Height = Head.rect.Width = 10; Head.rect.Fill = Brushes.Black; Parts = new List<SnakePart>(); CreatDefaultParts(); }
private void GenerateFood() { Random random = new Random(); _food = new SnakePart { X = random.Next(0, _maxTileW), Y = random.Next(0, _maxTileH) }; }
/* * 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; }
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(); }
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(); }
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)); }
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)); }
//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); }
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(); } } }
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(); }
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(); } } }
//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) ); }
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(); }
/// <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); }
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); }
//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(); } }
private void GenerateFood() { Random random = new Random(); food = new SnakePart(random.Next(0, 20), random.Next(0, 15)); }
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; } } } }
/* * 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; }
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; } } }
/// <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; } } }