using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace SnakeWinForm1b { public struct Point { public int x, y; public Point(int x, int y) { this.x = x; this.y = y; } } public partial class Form1 : Form { public enum Direction { Left, Right, Up, Down}; int positionX = 0; int positionY = 0; int width = 16; int height = 16; int speed = 16; Direction direction = Direction.Right; Queue snake = new Queue(); Point newHead, head; Point food; Random randomNumber = new Random(); List obstacles = new List() { new Point(20, 20), new Point(10, 20), new Point(20, 10) }; bool gameRunning = true; public Form1() { InitializeComponent(); for (int i = 0; i < 5; i++) { snake.Enqueue(new Point(i, 0)); } food = new Point( randomNumber.Next(0, pbGame.Size.Width / speed), randomNumber.Next(0, pbGame.Size.Height / speed)); timer1.Interval = 100; timer1.Tick += UpdateScreen; timer1.Start(); } private void UpdateScreen(object sender, EventArgs e) { if (gameRunning) { pbGame.Invalidate(); } else { lblGamaeOver.Text = "Game Over! Press Esc to exit!"; lblGamaeOver.Visible = true; } } private void pbGame_Paint(object sender, PaintEventArgs e) { Graphics canvas = e.Graphics; Point segment; head = snake.Last(); switch (direction) { case Direction.Right : // if (positionX >= pbGame.Size.Width / speed) positionX = 0; // else positionX++; if (head.x >= pbGame.Size.Width / speed) newHead = new Point(0, head.y); else newHead = new Point(head.x + 1, head.y); break; case Direction.Left: // if (positionX <= 0) positionX = pbGame.Size.Width / speed; // else positionX--; if (head.x <= 0) newHead = new Point(pbGame.Size.Width / speed, head.y); else newHead = new Point(head.x - 1, head.y); break; case Direction.Up: // if (positionY <= 0) positionY = pbGame.Size.Height / speed; // else positionY--; if (head.y <= 0) newHead = new Point(head.x, pbGame.Size.Height / speed); else newHead = new Point(head.x, head.y - 1); break; case Direction.Down: // if (positionY >= pbGame.Size.Height / speed) positionY = 0; // else positionY++; if (head.y >= pbGame.Size.Height / speed) newHead = new Point(head.x, 0); else newHead = new Point(head.x, head.y + 1); break; } snake.Enqueue(newHead); // obstacle collision if (obstacles.Contains(newHead)) gameRunning = false; // food collision if (newHead.x == food.x && newHead.y == food.y) { // generate new food do{ food = new Point( randomNumber.Next(0, pbGame.Size.Width / speed), randomNumber.Next(0, pbGame.Size.Height / speed)); } while(snake.Contains(food)); } else { snake.Dequeue(); } // render obstacles foreach (Point obstacle in obstacles) { canvas.FillEllipse(Brushes.Blue, new Rectangle(obstacle.x * speed, obstacle.y * speed, width, height)); } // render food canvas.FillEllipse(Brushes.Green, new Rectangle(food.x * speed, food.y * speed, width, height)); // render snake for (int i = 0; i < snake.Count; i++) { segment = snake.ElementAt(i); if (i == snake.Count - 1) { canvas.FillEllipse(Brushes.Black, new Rectangle(segment.x * speed, segment.y * speed, width, height)); } else { canvas.FillEllipse(Brushes.Red, new Rectangle(segment.x * speed, segment.y * speed, width, height)); } } // canvas.FillEllipse(Brushes.Red, // new Rectangle(positionX * speed, positionY * speed, width, height)); } private void Form1_KeyDown(object sender, KeyEventArgs e) { switch (e.KeyCode) { case Keys.Right: // positionX++; direction = Direction.Right; break; case Keys.Left: // positionX--; direction = Direction.Left; break; case Keys.Up: // positionY--; direction = Direction.Up; break; case Keys.Down: // positionY++; direction = Direction.Down; break; case Keys.Escape: Application.Exit(); break; } } } }