Игра "змейка" с делегатами, событиями и потоками - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Задали курсовую, написать игру на С# с делегатами и событиями, а также, чтобы передвижение объектов выполнялось в потоке. Сроки жмут, пыталась переделать вот эту змейку, но ничего не вышло!! помогите пожалуйста:*:*:*

Решение задачи: «Игра "змейка" с делегатами, событиями и потоками»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Windows.Forms;
  4. using System.Drawing;
  5. using System.Threading; //<------ Подключим библиотеку для работы с потоками.
  6.  
  7. namespace Example
  8. {
  9.     public class Program : Form
  10.     {
  11.         /// <summary>
  12.         /// The main entry point for the application.
  13.         /// </summary>
  14.         [STAThread]
  15.         static void Main()
  16.         {
  17.             Application.Run(new Program());
  18.         }
  19.  
  20.         //класс для удобства работы с координатами яблока и сегментов змеи
  21.         public class coord
  22.         {
  23.             public int X;
  24.             public int Y;
  25.             public coord(int x, int y)
  26.             {
  27.                 X = x; Y = y;
  28.             }
  29.         }
  30.  
  31.         //Timer timer = new Timer();
  32.         Random rand = new Random((int)DateTime.Now.Ticks & 0x0000FFFF);
  33.         // условная ширина "поля действия" в клетках, высота и размер клетки в пикселах
  34.         int W = 20, H = 30, S = 20;
  35.         // собственно змея: список сегментов(нулевой индекс в списке - голова змеи)  
  36.         List<coord> snake = new List<coord>();
  37.         coord apple; // координаты яблока
  38.         int way = 0; // направление движения змеи: 0 - вверх, 1 - вправо, 2 - вниз, 3 - влево
  39.         int apples = 0; // количество собранных яблок
  40.         int stage = 1; // уровень игры
  41.         int score = 0; // набранные очки в игре
  42.         int SleepInterval = 200; // <----- задержка передвижения в мс
  43.         Thread t;
  44.         Program()
  45.         {
  46.             this.Text = "Snake"; // заголовок формы
  47.             this.FormBorderStyle = FormBorderStyle.FixedDialog; // мышкой нельзя растягивать форму
  48.             this.MaximizeBox = false; // делаем недоступной кнопку "развернуть во весь экран"
  49.             this.StartPosition = FormStartPosition.CenterScreen; // форма отображается по центру экрана
  50.             this.DoubleBuffered = true; // для прорисовки
  51.  
  52.             int caption_size = SystemInformation.CaptionHeight; // высота шапки формы
  53.             int frame_size = SystemInformation.FrameBorderSize.Height; // ширина границы формы
  54.             // устанавливаем размер внутренней области формы W * H с учетом высоты шапки и ширины границ
  55.             this.Size = new Size(W * S + 2 * frame_size, H * S + caption_size + 2 * frame_size);
  56.  
  57.             this.Paint += new PaintEventHandler(Program_Paint); // привязываем обработчик прорисовки формы
  58.             this.KeyDown += new KeyEventHandler(Program_KeyDown); // привязываем обработчик нажатий на кнопки
  59.  
  60.             // делаем змею из трех сегментов, с начальными координатами внизу и по-центру формы
  61.             snake.Add(new coord(W / 2, H - 3));
  62.             snake.Add(new coord(W / 2, H - 2));
  63.             snake.Add(new coord(W / 2, H - 1));
  64.  
  65.             apple = new coord(rand.Next(W), rand.Next(H)); // координаты яблока
  66.              t = new Thread(new ThreadStart(MovingThread));
  67.             t.Start();
  68.         }
  69.  
  70.         // обработка нажатий на клавиши(здесь только стрелки)
  71.         // меняем направление движения, если оно не противоположное
  72.         void Program_KeyDown(object sender, KeyEventArgs e)
  73.         {
  74.             switch (e.KeyData)
  75.             {
  76.                 case Keys.Up:
  77.                     if (way != 2)
  78.                         way = 0;
  79.                     break;
  80.                 case Keys.Right:
  81.                     if (way != 3)
  82.                         way = 1;
  83.                     break;
  84.                 case Keys.Down:
  85.                     if (way != 0)
  86.                         way = 2;
  87.                     break;
  88.                 case Keys.Left:
  89.                     if (way != 1)
  90.                         way = 3;
  91.                     break;
  92.             }
  93.         }
  94.  
  95.         private void MovingThread()
  96.         {
  97.             while (true)
  98.             {
  99.                 // запоминаем координаты головы змеи
  100.                 int x = snake[0].X, y = snake[0].Y;
  101.                 // в зависимости от направления вычисляем где будет голова на следующем шаге
  102.                 // сделал чтобы при достижении края формы голова появлялась с противоположной стороны
  103.                 // и змея продолжала движение
  104.                 switch (way)
  105.                 {
  106.                     case 0:
  107.                         y--;
  108.                         if (y < 0)
  109.                             GameOwer();
  110.                         break;
  111.                     case 1:
  112.                         x++;
  113.                         if (x >= W)
  114.                             GameOwer();
  115.                         break;
  116.                     case 2:
  117.                         y++;
  118.                         if (y >= H)
  119.                             GameOwer();
  120.                         break;
  121.                     case 3:
  122.                         x--;
  123.                         if (x < 0)
  124.                             GameOwer();
  125.                         break;
  126.                 }
  127.                 coord c = new coord(x, y); // сегмент с новыми координатами головы
  128.                 snake.Insert(0, c); // вставляем его в начало списка сегментов змеи(змея выросла на один сегмент)
  129.                 if (snake[0].X == apple.X && snake[0].Y == apple.Y) // если координаты головы и яблока совпали
  130.                 {
  131.                     apple = new coord(rand.Next(W), rand.Next(H)); // располагаем яблоко в новых случайных координатах
  132.                     apples++; // увеличиваем счетчик собранных яблок
  133.                     score += stage; // увеличиваем набранные очки в игре: за каждое яблоко прибавляем количество равное номеру уровня
  134.                     if (apples % 10 == 0) // после каждого десятого яблока
  135.                     {
  136.                         stage++; // повышаем уровень
  137.                         SleepInterval -= 10; // и уменьшаем интервал срабатывания яблока
  138.                     }
  139.                 }
  140.                 else // если координаты головы и яблока не совпали - убираем последний сегмент змеи(т.к. ранее добавляли новую голову)
  141.                     snake.RemoveAt(snake.Count - 1);
  142.                
  143.                 for (int i = 1; i < snake.Count; i++) // <-------
  144.                 {
  145.                     if ((snake[i].X == snake[0].X) && (snake[i].Y == snake[0].Y)) GameOwer();
  146.                 }
  147.                
  148.                 Invalidate();
  149.                 System.Threading.Thread.Sleep(SleepInterval);
  150.             }
  151.         }
  152.         private void GameOwer() // <-------- завершение игры
  153.         {
  154.             t.Abort();
  155.             Invalidate();
  156.         }
  157.  
  158.         // собственно, отрисовка
  159.         void Program_Paint(object sender, PaintEventArgs e)
  160.         {
  161.             // рисуем красным кружком яблоко, синим квадратом голову змеи и зелеными квадратами тело змеи
  162.             e.Graphics.FillEllipse(Brushes.Red, new Rectangle(apple.X * S, apple.Y * S, S, S));
  163.             e.Graphics.FillRectangle(Brushes.Blue, new Rectangle(snake[0].X * S, snake[0].Y * S, S, S));
  164.             for (int i = 1; i < snake.Count; i++)
  165.                 e.Graphics.FillRectangle(Brushes.Green, new Rectangle(snake[i].X * S, snake[i].Y * S, S, S));
  166.             // сообщение о количестве собранных яблок, уровне и количестве очков
  167.             string state = "Apples:" + apples.ToString() + "\n" +
  168.                 "Stage:" + stage.ToString() + "\n" + "Score:" + score.ToString();
  169.             // выводим это сообщение в левом верхнем углу
  170.             e.Graphics.DrawString(state, new Font("Arial", 10, FontStyle.Italic), Brushes.Black, new Point(5, 5));
  171.         }
  172.     }
  173. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.25 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы