Advertisement
wingman007

SnakeWinFormFull1b

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