Доработка программ, или игра Змейка


Одна из услуг, которую я оказываю – это доработка программ на C#, Java или C++. В чем это заключается? В расширении функционала или изменении дизайна у существующего проекта. Рассмотрим пример.

Потребовалось заказчику модифицировать исходный код игры «Змейка». Ну знаете, такая обычная игра – управляем крестиком (клавишами) и бегаем за яблоками. Съедая яблоко, змея становится длиннее на одну ячейку. Врезаясь в себя (хвост) или стену – игра прекращается.



Так вот, у заказчика уже был проект для Visual Studio на C# для данной игры. И требовалось добавить одну деталь: чтобы появлялись яблоки не только обычные, съедобные, но и червивые. При съедении которых игра бы также прекращалась.

Причём яблоки должны были появляться с интервалом раз в пять секунд на новом месте. Что ж, давайте посмотрим на исходный код Змейки. А видим мы тут, что яблоrо для змейки – это просто объект класса Circle:

private Circle food;
Вот таким методом он инициализируется/генерируется.

private void GenerateFood(){
int maxXPos = pbCanvas.Size.Width / Settings.Width;
int maxYPos = pbCanvas.Size.Height / Settings.Height;
int vspomX = random.Next(0, maxXPos);
food = new Circle {X = vspomX, Y = random.Next(0, maxYPos)};
Console.WriteLine(vspomX);        }
А в методе движения (MovePlayer()), который вызывается при каждой обрисовке экрана, проверяется на столкновение голова и это яблоко:

if (Snake[0].X == food.X && Snake[0].Y == food.Y){
Eat();}
Метод Eat:

private void Eat(){
Circle circle = new Circle{
X = Snake[Snake.Count - 1].X,
Y = Snake[Snake.Count - 1].Y
};
Snake.Add(circle);
//Счёт
Settings.Score += Settings.Points;
lblScore.Text = Settings.Score.ToString();
GenerateFood();
}
Рисуется, кстати, вот так:

canvas.FillEllipse(Brushes.Red,
new Rectangle(food.X * Settings.Width,
food.Y * Settings.Height, Settings.Width, Settings.Height));
}
Отлично. Тогда самое простое решение, которое приходит в голову – это добавить private Circle food2 – объект еды, но червивый.Также инициализировать его:

private void GenerateFood2(){
int maxXPos = pbCanvas.Size.Width / Settings.Width;
int maxYPos = pbCanvas.Size.Height / Settings.Height;
int vspomX = random.Next(0, maxXPos);
food2 = new Circle { X = vspomX, Y = random.Next(0, maxYPos) };
Console.WriteLine(vspomX);}
Нарисовать:

canvas.FillEllipse(Brushes.DimGray,new Rectangle(food2.X * Settings.Width, food2.Y * Settings.Height, Settings.Width, Settings.Height));
Обработать столкновение

if (Snake[0].X == food2.X && Snake[0].Y == food2.Y){
 Die();
}
Все хорошо, но один момент. Наше отравленное яблоко будет рисовать только один раз, а нам надо чтобы менялось раз в пять секунд его расположение. Кидаем на форму таймер и приписываем такой код:

private void timer1_Tick(object sender, EventArgs e){
int maxXPos = pbCanvas.Size.Width / Settings.Width;
int maxYPos = pbCanvas.Size.Height / Settings.Height;
int vspomX = random.Next(0, maxXPos);
food2 = new Circle { X = vspomX, Y = random.Next(0, maxYPos) };        }
И все прекрасно работает:



Если вам требуется помочь с проектами по C# или Java, то пишите мне и узнавайте актуальные цены на мои услуги по программированию. Пишите, договоримся!
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегизаметки, услуги, си шарп, программы




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.



Распознавание файловой системы Windows
Урок 26. Массивы C#
Урок 7. Перегрузка конструктора в C#