Guest User

Untitled

a guest
May 22nd, 2013
1,614
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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. }
RAW Paste Data

Adblocker detected! Please consider disabling it...

We've detected AdBlock Plus or some other adblocking software preventing Pastebin.com from fully loading.

We don't have any obnoxious sound, or popup ads, we actively block these annoying types of ads!

Please add Pastebin.com to your ad blocker whitelist or disable your adblocking software.

×