Advertisement
wingman007

SnakeWinFormFull1a

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