Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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 SnakeWinForm2b
- {
- struct Point
- {
- public int x, y;
- public Point(int x, int y)
- {
- this.x = x;
- this.y = y;
- }
- }
- public enum Direction { Left, Right, Up, Down};
- public partial class Form1 : Form
- {
- private int positionX = 0;
- private int positionY = 0;
- private int width = 16;
- private int height = 16;
- private int speed = 16;
- Queue<Point> snake = new Queue<Point>();
- Direction direction = Direction.Right;
- Point head, newHead, food;
- Random randomNumber = new Random();
- List<Point> obstacles = new List<Point>() {
- new Point(20, 10),
- new Point(10, 20),
- new Point(5, 30)
- };
- bool gameRunning = true;
- public Form1()
- {
- InitializeComponent();
- do
- {
- food = new Point(
- randomNumber.Next(0, pbGame.Size.Width / speed),
- randomNumber.Next(0, pbGame.Size.Height / speed));
- } while (snake.Contains(food) || obstacles.Contains(food));
- for (int i = 0; i < 5; i++)
- {
- snake.Enqueue(new Point(i, 0));
- }
- timer1.Interval = 100;
- timer1.Tick += UpdateScreen;
- timer1.Start();
- }
- private void UpdateScreen(object sender, EventArgs e)
- {
- if (gameRunning)
- {
- pbGame.Invalidate();
- }
- else
- {
- lblGameOver.Text = "The game is over! \nPress Esc to exit.";
- lblGameOver.Visible = true;
- timer1.Stop();
- }
- }
- private void Form1_Load(object sender, EventArgs e)
- {
- }
- 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);
- // collision detection with food
- if (newHead.x == food.x && newHead.y == food.y)
- {
- // generate new position of the food
- do{
- food = new Point(
- randomNumber.Next(0, pbGame.Size.Width / speed),
- randomNumber.Next(0, pbGame.Size.Height / speed));
- } while (snake.Contains(food) || obstacles.Contains(food));
- }
- else
- {
- snake.Dequeue();
- }
- // colission detection PrintControllerWithStatusDialog obstacles
- if (obstacles.Contains(newHead))
- {
- gameRunning = false;
- }
- // 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));
- }
- }
- // render point
- //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;
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement