Воскресенье, 22 Декабря 2024, 10:04

Приветствую Вас Гость

Меню сайта
Наш опрос
Кто вы?
Всего ответов: 24701
Блог » 2016 » февраля » 22 » Проект Bloks
Проект Bloks
20:17

Давно мне не давала покоя игры кубики, где нужно было убирать несколько одноцветных блоков и получать за них очки. На самом деле вещь очень и очень затягивающая. Ее я увидел еще на карманном организаторе HP. И залипал в нее много часов. Но теперь интерес создать игру с нуля переборол мою геймерскую страсть и я написал данный проект. А так же сделал набор видео уроков которые помогут и Вам повторить мой подвиг.






Код

public partial class Form1 : Form
  {
  //сколько очков набрал игрок  
  int Score = 0;
  //Размер поля по высоте и ширине экрана
  static int Col=10 , Row=13;
  //генератор случайных чисел встроенный в C#
  Random RND = new Random();
  //список картинок из которых случайно выбирается одна
  Image[] img =
  {
  global::BloksGame.Properties.Resources.Green,
  global::BloksGame.Properties.Resources.grey,
  global::BloksGame.Properties.Resources.Red,
  global::BloksGame.Properties.Resources.Yello,
  };

  //список претендентов на уничтожение  
  List<Point> Pretindent = new List<Point>();

  PictureBox[,] Pole = new PictureBox[Col, Row];

  public Form1()
  {
  InitializeComponent();
  }

  private void button2_Click(object sender, EventArgs e)
  {
  //Завершение работы проекта
  Application.Exit();
  }

  private void button1_Click(object sender, EventArgs e)
  {
  //обнуляем очки
  Score = 0;
  //показываем игровое поле
  panel2.Visible = true;
  //создаем игровое поле
  CreatePole();
  //включаем таймер
  timer1.Enabled = true;

  }

  private void Form1_Load(object sender, EventArgs e)
  {

  }
  //функция гравитации блоков
  void MoverDown()  
  {
  //перебираем блоки по вертикали  
  for (int yy = 0; yy < Row; yy++)
  {
  //перебираем блоки по горизонтали  
  for (int xx = 0; xx < Col; xx++)
  {
  //если блок не имеет цвета то
  if (Pole[xx, yy].Image == null)  
  {
  //если над блоком без цвета есть блок
  if (yy + 1 < Row)
  {
  //отбираем у верхнего блока цвет
  Pole[xx, yy].Image = Pole[xx, yy + 1].Image;
  //и обнуляем у верхнего блока цвет  
  Pole[xx, yy + 1].Image = null;
  }
  else  
  {
  //если нет с вехру блока то берем случайный цвет  
  Pole[xx, yy].Image = img[RND.Next(img.Length)];
  }
  }
  }
  }
  }
   
  //генератор координат которые нужно проверить
  List<Point> IndexList(Point coord)
  {
  //создаем список предполагаемых мест для поиска точки
  List<Point> P = new List<Point>();
  //объявляем переменную которая будет расчетным буфером для точки  
  Point T;
  //проверяем существует ли в обще точка в том раене где хотим проверять
  //точка с лева
  if ((coord.X - 1) >= 0) { T = new Point(coord.X - 1, coord.Y); P.Add(T); }
  //точка с права  
  if ((coord.X + 1) < Col) { T = new Point(coord.X + 1, coord.Y); P.Add(T); };
  //точка с верху
  if ((coord.Y - 1) >= 0 ) { T = new Point(coord.X , coord.Y - 1); P.Add(T); };
  // точка с низу
  if ((coord.Y + 1) < Row) { T = new Point(coord.X , coord.Y + 1); P.Add(T); };
  //возвращаем найденный список точек  
  return P;
  }

  //рекурсивная функция проверки точек
  void TestPole(Point coord, Image Color)  
  {
  //проверяем есть ли точка в списке
  int Index = Pretindent.IndexOf(coord);
  //если точки нет в списке то проверяем
  if (Index == -1)  
  {
  //проверяем того ли она цвета
  if (Pole[coord.X, coord.Y].Image == Color)
  {
  //если она нужного цвета то добавляем ее в список
  Pretindent.Add(coord);
  //рассчитываем координаты для поиска далее  
  List<Point> Test = IndexList(coord);
  //создаем для точки набор соседей
  foreach (Point T in Test)  
  {
  //проверяем соседей
  TestPole(T, Color);
  }
  }
  }
  }
   

  void Click(object sender, EventArgs e)  
  {
  //очищаем список проверяемых точек
  Pretindent.Clear();
  //получаем данные о блока на который нажали
  PictureBox PicClik = sender as PictureBox;
  //читаем с нажатого блока картинку
  Image CurrentPic = PicClik.Image;
  //определяем по имени координаты блока  
  string[] NamePars = PicClik.Name.Split('_');
  //вычисляем позицию блока
  int _X_ = Convert.ToInt32(NamePars[1]);
  int _Y_ = Convert.ToInt32(NamePars[2]);
  //создаем точку для более простых операция с данными  
  Point I = new Point(_X_, _Y_);
  //запускаем рекурсивную проверку точек
  TestPole(I, CurrentPic);
  //если количество соседних блоков с таким же цветом 3 и более то удаляем из них картинку
  if (Pretindent.Count > 2)
  {
  //перебираем каждый найденный блок
  foreach (Point ClearPoint in Pretindent)
  {
  //удаляем картинку из него
  Pole[ClearPoint.X, ClearPoint.Y].Image = null;
  //подсчет уничтоженных блоков
  Score += Pretindent.Count;
  }
  }
  }
  //
  //Функция генерации поля
  void CreatePole()  
  {
  //начальные координаты создания 1 блока
  int X = 0, //координата по Х
  Y = panel2.Height - 50; //координата по У
  //Очищаем поле игры
  panel2.Controls.Clear();
  //создаем пустой массив картинок по размеру поля
  Pole = new PictureBox[Col, Row];

  //начинаем перебирать строки с 0
  for (int yy = 0; yy < Row; yy++)
  {
  //обнуляем позицию по Х
  X = 0;
  //Начинаем двигаться по столбцам  
  for (int xx = 0; xx < Col; xx++)
  {
  //создаем новую картинку
  PictureBox pic = new PictureBox()
  {
  Image = img[RND.Next(img.Length)], //загружаем случайную картинку блока
  Location = new System.Drawing.Point(X, Y), //устанавливаем позицию блока
  Name = "_"+xx+"_"+yy, //задаем имя блока
  Size = new System.Drawing.Size(50, 50), //задаем размер блока
  SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage //задаем параметр в писания картинки в границ элемента
  };
  //добавляем реакцию блока на клик мышкой
  pic.Click += Click;
  //добавляем картинку на игровое поле
  panel2.Controls.Add(pic);
  //запоминаем картинку на карте  
  Pole[xx, yy] = pic;
  //смещаем координаты на ширину картинки
  X = X + 50;
  }
  //смещаем коодинаты на высоту картинки
  Y = Y - 50;
  }
  }

  //  
  private void timer1_Tick(object sender, EventArgs e)
  {
  //каждые 100 мили секунд таймера пробуем выполнить гравитацию
  MoverDown();
  //выводим на экран очки сколько заработал игрок  
  label2.Text = " набранные очки " + Score;  
  }

  private void button3_Click(object sender, EventArgs e)
  {
  panel1.Visible = true;
  panel2.Visible = false;  
  }
  }

Категория: Разработка игр | Просмотров: 1500 | Рейтинг: 4.5/2 |
Теги: HP, Видео, блоки, обучение, организатор, проект, видео уроки, Bloks, Смотреть, Создать игру
Дополнительные опции:
Также если вы считаете, что данный материал мог быть интересен и полезен кому-то из ваших друзей, то вы бы могли посоветовать его, отправив сообщение на e-mail друга:

Игровые объявления и предложения:
Если вас заинтересовал материал «Проект Bloks», и вы бы хотели прочесть что-то на эту же тему, то вы можете воспользоваться списком схожих материалов ниже. Данный список сформирован автоматически по тематическим меткам раздела. Предлагаются такие схожие материалы: Если вы ведёте свой блог, микроблог, либо участвуете в какой-то популярной социальной сети, то вы можете быстро поделиться данной заметкой со своими друзьями и посетителями.

Всего комментариев: 1
+1-
1 Vostrugin   (23 Февраля 2016 17:49) [Материал]
Забавно. Но вот наименование бы подтянуть. Разобраться то можно, но читать не очень приятно всякие labelN, panelN и т.д.

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Автор материала
Ник:
cibergod
Ещё:
Все его записи
Календарь заметок
«  февраля 2016  »
ПнВтСрЧтПтСбВс
1234567
891011121314
15161718192021
22232425262728
29
Поиск по сайту
Записи по месяцам
Друзья сайта
Игровой форум GFAQ.ru Перевод консольных игр
Все права сохранены. GcUp.ru © 2008-2024 Рейтинг