Advertisement
Guest User

Untitled

a guest
May 22nd, 2013
1,845
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 9.20 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Windows.Forms;
  4. using System.Drawing;
  5.  
  6. namespace Example
  7. {
  8.     public class Program : Form
  9.     {
  10.         /// <summary>
  11.         /// The main entry point for the application.
  12.         /// </summary>
  13.         [STAThread]
  14.         static void Main()
  15.         {
  16.             Application.Run(new Program());
  17.         }
  18.  
  19.         //класс для удобства работы с координатами яблока и сегментов змеи
  20.         public class coord
  21.         {
  22.             public int X;
  23.             public int Y;
  24.             public coord(int x, int y)
  25.             {
  26.                 X = x; Y = y;
  27.             }
  28.         }
  29.  
  30.         Timer timer = new Timer();
  31.         Random rand = new Random((int)DateTime.Now.Ticks & 0x0000FFFF);
  32.         // условная ширина "поля действия" в клетках, высота и размер клетки в пикселах
  33.         int W = 80, H = 60, S = 10;
  34.         // собственно змея: список сегментов(нулевой индекс в списке - голова змеи)  
  35.         List<coord> snake = new List<coord>();
  36.         coord apple; // координаты яблока
  37.         int way = 0; // направление движения змеи: 0 - вверх, 1 - вправо, 2 - вниз, 3 - влево
  38.         int apples = 0; // количество собранных яблок
  39.         int stage = 1;
  40.         private Label label1; // уровень игры
  41.         int score = 0; // набранные очки в игре
  42.  
  43.         Program()
  44.         {
  45.  
  46.  
  47.  
  48.             // other
  49.             this.Text = "Snake"; // заголовок формы
  50.             this.FormBorderStyle = FormBorderStyle.FixedSingle; // мышкой нельзя растягивать форму
  51.             this.BackgroundImage = global::SnakeGame2.Properties.Resources.gresh_green_grass_wide;
  52.             this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
  53.             this.MaximizeBox = false; // делаем недоступной кнопку "развернуть во весь экран"
  54.             this.StartPosition = FormStartPosition.CenterScreen; // форма отображается по центру экрана
  55.             this.DoubleBuffered = true; // для прорисовки
  56.  
  57.             int caption_size = SystemInformation.CaptionHeight; // высота шапки формы
  58.             int frame_size = SystemInformation.FrameBorderSize.Height; // ширина границы формы
  59.             // устанавливаем размер внутренней области формы W * H с учетом высоты шапки и ширины границ
  60.             this.Size = new Size(W * S + 2 * frame_size, H * S + caption_size + 2 * frame_size);
  61.  
  62.             this.Paint += new PaintEventHandler(Program_Paint); // привязываем обработчик прорисовки формы
  63.             this.KeyDown += new KeyEventHandler(Program_KeyDown); // привязываем обработчик нажатий на кнопки
  64.  
  65.             timer.Interval = 200; // таймер срабатывает раз в 200 милисекунд
  66.             timer.Tick += new EventHandler(timer_Tick); // привязываем обработчик таймера
  67.             timer.Start(); // запускаем таймер
  68.  
  69.             // делаем змею из трех сегментов, с начальными координатами внизу и по-центру формы
  70.             snake.Add(new coord(W / 2, H - 3));
  71.             snake.Add(new coord(W / 2, H - 2));
  72.             snake.Add(new coord(W / 2, H - 1));
  73.  
  74.             apple = new coord(rand.Next(W), rand.Next(H)); // координаты яблока
  75.         }
  76.  
  77.         // обработка нажатий на клавиши(здесь только стрелки)
  78.         // меняем направление движения, если оно не противоположное
  79.         void Program_KeyDown(object sender, KeyEventArgs e)
  80.         {
  81.             switch (e.KeyData)
  82.             {
  83.                 case Keys.Up:
  84.                     if (way != 2)
  85.                         way = 0;
  86.                     break;
  87.                 case Keys.Right:
  88.                     if (way != 3)
  89.                         way = 1;
  90.                     break;
  91.                 case Keys.Down:
  92.                     if (way != 0)
  93.                         way = 2;
  94.                     break;
  95.                 case Keys.Left:
  96.                     if (way != 1)
  97.                         way = 3;
  98.                     break;
  99.             }
  100.  
  101.             if (e.KeyCode == Keys.P)
  102.             {
  103.                 timer.Enabled = false;
  104.             }
  105.  
  106.             if (e.KeyCode == Keys.Enter)
  107.             {
  108.                 Pause();
  109.             }
  110.  
  111.         }
  112.  
  113.         public void Pause()
  114.         {
  115.             timer.Enabled = true;
  116.         }
  117.  
  118.         void timer_Tick(object sender, EventArgs e)
  119.         {
  120.             // запоминаем координаты головы змеи
  121.             int x = snake[0].X, y = snake[0].Y;
  122.             // в зависимости от направления вычисляем где будет голова на следующем шаге
  123.             // сделал чтобы при достижении края формы голова появлялась с противоположной стороны
  124.             // и змея продолжала движение
  125.             switch (way)
  126.             {
  127.                 case 0:
  128.                     y--;
  129.                     if (y < 0)
  130.                         y = H - 1;
  131.                     break;
  132.                 case 1:
  133.                     x++;
  134.                     if (x >= W)
  135.                         x = 0;
  136.                     break;
  137.                 case 2:
  138.                     y++;
  139.                     if (y >= H)
  140.                         y = 0;
  141.                     break;
  142.                 case 3:
  143.                     x--;
  144.                     if (x < 0)
  145.                         x = W - 1;
  146.                     break;
  147.             }
  148.             coord c = new coord(x, y); // сегмент с новыми координатами головы
  149.             snake.Insert(0, c); // вставляем его в начало списка сегментов змеи(змея выросла на один сегмент)
  150.             if (snake[0].X == apple.X && snake[0].Y == apple.Y) // если координаты головы и яблока совпали
  151.             {
  152.                 apple = new coord(rand.Next(W), rand.Next(H)); // располагаем яблоко в новых случайных координатах
  153.                 apples++; // увеличиваем счетчик собранных яблок
  154.                 score += stage; // увеличиваем набранные очки в игре: за каждое яблоко прибавляем количество равное номеру уровня
  155.                 if (apples % 10 == 0) // после каждого десятого яблока
  156.                 {
  157.                     stage++; // повышаем уровень
  158.                     if (timer.Interval <= 10)
  159.                     {
  160.  
  161.                     }
  162.  
  163.                     else
  164.                     {
  165.                         timer.Interval -= 10; // и уменьшаем интервал срабатывания яблока
  166.                     }
  167.                 }
  168.             }
  169.             else // если координаты головы и яблока не совпали - убираем последний сегмент змеи(т.к. ранее добавляли новую голову)
  170.                 snake.RemoveAt(snake.Count - 1);
  171.             Invalidate(); // перерисовываем, т.е. идет вызов Program_Paint
  172.         }
  173.  
  174.         // собственно, отрисовка
  175.         void Program_Paint(object sender, PaintEventArgs e)
  176.         {
  177.             // рисуем красным кружком яблоко, синим квадратом голову змеи и зелеными квадратами тело змеи
  178.             e.Graphics.FillEllipse(Brushes.Red, new Rectangle(apple.X * S, apple.Y * S, S, S));
  179.             e.Graphics.FillRectangle(Brushes.Blue, new Rectangle(snake[0].X * S, snake[0].Y * S, S, S));
  180.             for (int i = 1; i < snake.Count; i++)
  181.                 e.Graphics.FillRectangle(Brushes.Black, new Rectangle(snake[i].X * S, snake[i].Y * S, S, S));
  182.             // сообщение о количестве собранных яблок, уровне и количестве очков
  183.             string state = "Maças:" + apples.ToString() + "\n" +
  184.                 "Nivel:" + stage.ToString() + "\n" + "Pontos:" + score.ToString();
  185.             // выводим это сообщение в левом верхнем углу
  186.             e.Graphics.DrawString(state, new Font("Arial", 8, FontStyle.Italic), Brushes.Black, new Point(5, 5));
  187.         }
  188.  
  189.         private void InitializeComponent()
  190.         {
  191.  
  192.  
  193.         }
  194.  
  195.     }
  196. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement