Advertisement
wingman007

SnakeWinFormFull2a

Oct 21st, 2014
322
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.24 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10.  
  11. namespace SnakeWinForm2a
  12. {
  13.     struct Point
  14.     {
  15.         public int x, y;
  16.         public Point(int x, int y)
  17.         {
  18.             this.x = x;
  19.             this.y = y;
  20.         }
  21.     }
  22.     public partial class Form1 : Form
  23.     {
  24.  
  25.         public enum Direction { Left, Right, Up, Down};
  26.  
  27.         private int positionX = 10;
  28.  
  29.         private int positionY = 10;
  30.  
  31.         private int width = 16;
  32.         private int height = 16;
  33.         private int speed = 16;
  34.  
  35.         private Direction direction = Direction.Right;
  36.  
  37.         Queue<Point> snake = new Queue<Point>();
  38.  
  39.         private Point head, newHead, food;
  40.  
  41.         private Random randomNumber = new Random();
  42.  
  43.         List<Point> obstacles = new List<Point>() {
  44.             new Point(5, 10),
  45.             new Point(15, 10),
  46.             new Point(10, 5)
  47.         };
  48.  
  49.         private bool gameRunning = true;
  50.  
  51.         public Form1()
  52.         {
  53.             InitializeComponent();
  54.  
  55.             do {
  56.                   food = new Point(
  57.                     randomNumber.Next(0, pbGame.Size.Width / speed),
  58.                     randomNumber.Next(0, pbGame.Size.Height / speed)
  59.                 );
  60.             } while(snake.Contains(food) ||
  61.                 obstacles.Contains(food));
  62.  
  63.  
  64.             for (int i = 0; i < 5; i++)
  65.             {
  66.                 snake.Enqueue(new Point(i, 0));
  67.             }
  68.  
  69.             timer1.Interval = 100;
  70.             timer1.Tick += UpdateScreen;
  71.             timer1.Start();
  72.         }
  73.  
  74.         private void UpdateScreen(object source, EventArgs e)
  75.         {
  76.             if (gameRunning)
  77.             {
  78.                 pbGame.Invalidate();
  79.             }
  80.             else
  81.             {
  82.                 lblGameOver.Text = "The game is over! \nPress Esc to exit!";
  83.                 lblGameOver.Visible = true;
  84.             }
  85.         }
  86.  
  87.         private void Form1_Load(object sender, EventArgs e)
  88.         {
  89.  
  90.         }
  91.  
  92.         // Don't forget to attach the event listeners in the designer
  93.         private void pbGame_Paint(object sender, PaintEventArgs e)
  94.         {
  95.             Point segment;
  96.             head = snake.Last();
  97.             switch (direction)
  98.             {
  99.                 case Direction.Right:
  100.                     // positionX++;
  101.                     if (head.x >= pbGame.Size.Width / speed) newHead = new Point(0, head.y);
  102.                     else newHead = new Point(head.x + 1, head.y);
  103.                     break;
  104.                 case Direction.Left:
  105.                     // positionX--;
  106.                     if (head.x <= 0) newHead = new Point(pbGame.Size.Width / speed, head.y);
  107.                     else newHead = new Point(head.x - 1, head.y);
  108.                     break;
  109.                 case Direction.Up:
  110.                     // positionY--;
  111.                     if (head.y <= 0) newHead = new Point(head.x, pbGame.Size.Height / speed);
  112.                     else newHead = new Point(head.x, head.y - 1);
  113.                     break;
  114.                 case Direction.Down:
  115.                     // positionY++;
  116.                     if (head.y >= pbGame.Size.Height / speed) newHead = new Point(head.x, 0);
  117.                     else newHead = new Point(head.x, head.y + 1);
  118.                     break;
  119.             }
  120.  
  121.             snake.Enqueue(newHead);
  122.            
  123.             // collision detection with obstacles
  124.             if (obstacles.Contains(newHead))
  125.             {
  126.                 gameRunning = false;
  127.             }
  128.  
  129.             // collision detection with food
  130.             if (newHead.x == food.x && newHead.y == food.y)
  131.             {
  132.                 // generate new food
  133.                 do {
  134.                     food = new Point(
  135.                         randomNumber.Next(0, pbGame.Size.Width / speed),
  136.                         randomNumber.Next(0, pbGame.Size.Height / speed));
  137.                 } while(snake.Contains(food) ||
  138.                     obstacles.Contains(food));
  139.             }
  140.             else
  141.             {
  142.                 snake.Dequeue();
  143.             }
  144.            
  145.  
  146.             Graphics canvas = e.Graphics;
  147.  
  148.             // render obstacles
  149.             foreach (Point obstacle in obstacles)
  150.             {
  151.                 canvas.FillEllipse(Brushes.Blue,
  152.                    new Rectangle(obstacle.x * speed, obstacle.y * speed, width, height));              
  153.             }
  154.  
  155.             // render food
  156.             canvas.FillEllipse(Brushes.Green,
  157.                 new Rectangle(food.x * speed, food.y * speed, width, height));
  158.  
  159.             // render snake
  160.             for (int i = 0; i < snake.Count; i++)
  161.             {
  162.                 segment = snake.ElementAt(i);
  163.  
  164.                 if (i == snake.Count - 1)
  165.                 {
  166.                     canvas.FillEllipse(Brushes.Black,
  167.                         new Rectangle(segment.x * speed, segment.y * speed, width, height));
  168.                 }
  169.                 else
  170.                 {
  171.                     canvas.FillEllipse(Brushes.Red,
  172.                         new Rectangle(segment.x * speed, segment.y * speed, width, height));
  173.                 }
  174.             }
  175.  
  176.             // canvas.FillEllipse(Brushes.Red,
  177.             //    new Rectangle(positionX * speed, positionY * speed, width, height));
  178.         }
  179.  
  180.         private void Form1_KeyDown(object sender, KeyEventArgs e)
  181.         {
  182.             switch (e.KeyCode) {
  183.                 case Keys.Right :
  184.                     // positionX++;
  185.                     direction = Direction.Right;
  186.                     break;
  187.                 case Keys.Left:
  188.                     // positionX--;
  189.                     direction = Direction.Left;
  190.                     break;
  191.                 case Keys.Up:
  192.                     // positionY--;
  193.                     direction = Direction.Up;
  194.                     break;
  195.                 case Keys.Down:
  196.                     // positionY++;
  197.                     direction = Direction.Down;
  198.                     break;
  199.                 case Keys.Escape:
  200.                     Application.Exit();
  201.                     break;
  202.             }
  203.         }
  204.     }
  205. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement