Разработка компьютерной игры

Разработка легко модифицируемой игры типа tower defence (меняя фон и изображение объектов, можно получить как средневековые сценарии защиты, так и современные с участием ПВО, артиллерии, танков и самолетов). Применение механизма инкапсуляции, буферизация.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 13.08.2011
Размер файла 221,7 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Белорусский Государственный Университет Информатики и Радиоэлектроники

Кафедра «Информатика»

Пояснительная записка к курсовому проекту

по курсу ООП

На тему

«Разработка компьютерной игры»

Выполнил

Студент группы 702021

Дядькин С.В

Минск, 2011г.

Задание

Разработать компьютерную игру и выполнить следующие требования:

Должно быть разработано и реализовано множество классов. Построить работу ООП программы на функционировании и взаимодействии объектов различных классов.

Введение

Более 90 % современных детей и множество взрослых играют в видеоигры.

Но так ли они полезны, как говорят? Что касается взрослых, то они сами в состоянии решить, нужны им эти игры или нет. Многих компьютерные игры просто спасают, так как помогают пережить тяжёлое время (особенно во время болезни) или стресс, когда рядом никого из близких людей нет. Но как быть с детьми? На самом ли деле видеоигры их развивают, а если это так, то сколько времени им можно уделять без ущерба для гармоничного развития детей и подростков?

США (университет штата Иллинойс) такие же опыты провели с людьми старше 60 лет. И оказалось, что для них видеоигры полезны - они способствуют улучшению рабочей (кратковременной) памяти, ускоряют мозговую деятельность и т.д.

А как быть с детьми? Этим вопросом даже занимался Европейский парламент, настолько его достали предупреждения педагогов, психологов и других специалистов. И что вы думаете? Европарламент не нашёл доказательств того, что видеоигры вредны для детей. По мнению европарламентариев, даже жестокие игры полезны для детей. Многие игры развивают стратегическое, творческое, нестандартное мышление, а групповые игры учат взаимодействию между людьми.

Однако психологи не пришли к единому мнению о влиянии видеоигр на детей. Некоторые из них считают, что такие игры провоцируют агрессию. По мнению других, многие игры помогают развивать как умственные способности, так и социальные навыки. Возможно, как всегда, правы и те, и другие. В то же время учёные с тревогой отмечают признаки зависимости подростков в возрасте от 8 до 18 лет от видеоигр, похожей на наркотическую, что негативно влияет на другие стороны их личной жизни.

Видеоигры могут развлекать и развивать ребёнка. Однако они отнимают время, которое он мог бы потратить на другие занятия. По данным исследований, проведенных в России, подростки, увлекающиеся видеоиграми, тратят на домашние задания примерно на 40 % меньше времени, чем это было бы нужно, а на чтение - на 30 % меньше времени. Поэтому дело родителей - регулировать время, которое дети проводят за видеоиграми.

Таким образом, видеоигры могут быть полезными, а могут и навредить. Если дети занимаются ими в разумных пределах, это способствует, наряду с другой их деятельностью, умственному развитию и помогает усваивать новые навыки. Прежде всего, ребёнок приобретает и совершенствует навыки работы с компьютером, что пригодится ему при дальнейшем обучении. Правильно подобранные видеоигры развивают у детей мышление, внимание и логику, память и способность принимать решения. Управление видеоигрой улучшает координацию движений ребёнка. Обучающие игры помогают подготовить его к школе. Групповые видеоигры учат терпению и взаимодействию в группе. Некоторые игры развивают творческое воображение.

В то же время нужно приучать ребёнка больше читать книги и чаще бывать на свежем воздухе. Нужно помнить, что чрезмерное увлечение видеоиграми сдерживает развитие лобных долей мозга, отвечающих за логичное поведение и интеллектуальные способности. Так что всё хорошо в меру.

Так что научно-технический прогресс - это хорошо, если правильно его использовать.

компьютерная игра буферизация

Обзор существующих программных продуктов

Игр типа tower defence множество. Задача в таких играх, как правило, сводится к защите своего замка, дворца, базы от врагов путем расстановки оборонительных сооружений (башни, стены и т.д.) С каждым уровнем враги становятся все сильнее и сильнее. Защитные башни тоже можно модернизировать, покупать новые, ставить на них более мощные орудия. Отбить атаку можно обычно только путем правильной расстановки башен в определенных местах.

Как правило, существующие игры привязаны к средневековым и современным военным сценариям.

В разрабатываемом проекте предлагается расширить границы существующих проектов до космического пространства - и соответственно опробовать перспективные средства поражения.

Поле боя - космическое пространство, перспективные средства защиты лазерные батареи различной мощности, в качестве модели армии вторжения выбраны объекты, у которых возможны самые невероятные летные и огневые характеристики (НЛО).

Что касается трасс движения армии нападения - то генерация случайным образом набора промежуточных контрольных точек трассы для каждого объекта (или волны нападения объектов) позволяет разнообразить сценарий игры.

Разработка программного продукта

Анализ поставленной задачи

Задача курсового проекта создать игру при этом создать ряд классов, объекты которых будут взаимодействовать между собой. Графический интерфейс игры должен удовлетворять современным требованиям к подобным проектам.

В реализованном проекте можно расширять количество классов, порождая классы наследники от классов Tower и SpaceShip, тем самым увеличивая разнообразие, как средств нападения, так и средств защиты.

Математическая модель, положенная в основу проекта.

Основная сложность при реализации проекта - это движение объекта по сложной траектории.

В качестве модели траектории выбрана ломанная кривая, позволяющая адекватно представить сколь угодно сложную траекторию движения достаточно простой математической моделью. Рассмотрим отдельный участок ломанной кривой:

Объект движется по участку от до с шагом .

Программная модель курсового проекта

Для улучшения отображения игровых объектов на экране монитора использовалась двойная буферизация. Проясним некоторые специфические термины связанные с двойной буферизацией.

Рендеринг- это процесс подготовки, выдачи (прорисовки) изображения на экран. В общем, это все действия, которые связаны с выдачей картинки на экран.

Буфер - это область для временного хранения данных.

Двойная буферизация- это один из способов рендеринга, при котором существует два буфера. Содержимое первого (переднего) буфера (front buffer) показываеться на экран и вы видите какое то изображение. В это время на заднем буфере (back buffer) подготавливается следующий кадр (рисуется). Когда кадр на заднем буфере готов, тогда передний и задний буфер меняются местами. И затем все это повторяется. С помощью такой технологии избегается мерцание экрана.

В проекте используется следующая система классов (на схемах указаны лишь основные классы и основные атрибуты и функции):

Логика взаимодействия игровых объектов реализована в функциях событиях windows-формы.

Контроль качества курсового проекта

Разрабатываемый проект должен обладать следующими примитивами качества:

Завершенность (completeness) ? свойство, характеризующее степень обладания ПС всеми необходимыми частями и чертами, требующимися для выполнения своих явных и неявных функций.

Автономность (self-containedness) ? свойство, характеризующее способность ПС выполнять предписанные функции без помощи или поддержки других компонент программного обеспечения.

Коммуникабельность (communicativeness) ? свойство, характеризующее степень, в которой ПС облегчает задание или описание входных данных, и способность выдавать полезные сведения в достаточно простой форме и с простым для понимания содержанием.

Временная эффективность (time efficiency) ? мера, характеризующая способность ПС выполнять возложенные на него функции в течение определенного отрезка времени.

Структурированность (structuredness) ? свойство, характеризующее программы ПС с точки зрения организации взаимосвязанных их частей в единое целое определенным образом (например, в соответствии с принципами структурного программирования).

Удобочитаемость (readability) ? свойство, характеризующее легкость восприятия текста программ ПС (отступы, фрагментация, форматированность).

Расширяемость (augmentability) ? свойство, характеризующее способность ПС к использованию большего объема памяти для хранения данных или расширению функциональных возможностей отдельных компонент.

Модифицируемость (modifiability) ? мера, характеризующая ПС с точки зрения простоты внесения необходимых изменений и доработок на всех этапах и стадиях жизненного цикла ПС.

Модульность (modularity) ? свойство, характеризующее ПС с точки зрения организации его программ из таких дискретных компонент, что изменение одной из них оказывает минимальное воздействие на другие компоненты.

В процессе разработки использовался метод нисходящей отладки, т. е. в процессе разработки тестировался каждый добавляемый класс или функция в порядке их добавления в проект. Таким образом, была реализована автономная отладка программы. Далее была проведена комплексная отладка программного средства - тестировался весь сценарий игры от начала и до конца, с одновременной балансировкой первичной экономической модели игры.

Использование программного продукта

Руководство пользователя

В процессе игры возможна как предварительная расстановка башен, так и расстановка их в ходе атаки НЛО - для этого используется кнопка «Башня», с последующим указание мышью позиции установки башни.

Для улучшения характеристик огневой точки используется следующий алгоритм - выделение мышью башни, а затем кнопками “Огонь” и “Радиус” улучшаются соответствующие характеристики огневой точки.

Кнопка “Старт” используется для запуска очередной волны нападения.

Экономическая модель достаточно проста - установка и модернизация лазерных батарей требует определенных ресурсов. В начале игры доступно ограниченное количество ресурсов, которое в процессе игры пополняется после уничтожения атакующих НЛО.

Цель игры защитить лазерными батареями Землю от бомбардировок со стороны НЛО.

Руководство программиста

Приложение Dreaming of Space является типичным приложением-формой Windows.

В качестве среды разработки использовалась Microsoft Visual Studio 2008. В качестве языка программирования для реализации проекта используется C#. Каждый класс, входящий в проект, реализован в отдельном файле.

Возможны следующие модификации программы :

1) Увеличение разнообразия средств защиты и нападения - путем ввода новых классов или классов наследников.

2) Дальнейшее развитие системы улучшений огневых точек.

3) Меняя фон и графику объектов можно разнообразить сценарии игры.

Заключение

В результате реализации проекта была достигнута следующая цель - разработана легко модифицируемая игра типа tower defence (меняя фон и изображение объектов можно легко получить как средневековые сценарии защиты, так и современные с участием ПВО, артиллерии, танков и самолетов).

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

Список используемой литературы

1. Жарков В. А., «Компьютерная графика, мультимедиа и игры на Visual C# 2005», Москва «Жарков пресс», 2005

2. Конспект лекций по курсу «Объектно-ориентированное программирование», БГУИР кафедра информатики

3. А. А. Волосевич «Избранные главы информатики», Минск, БГУИР, кафедра информатики, 2006

Приложение A

Исходные коды:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Drawing.Drawing2D;

namespace Dreaming_of_Space_2

{

public partial class Form1 : Form

{

public int x_MouseDown_1, y_MouseDown_1;

//защита солнечной системы

SolarPRO OurPRO = new SolarPRO();

//планета Земля

Planet Earth = new Planet();

//формирование нашествия

SpaceInvasion InvasionWave = new SpaceInvasion();

public Form1()

{

InitializeComponent();

}

private void Form1_Load(object sender, EventArgs e)

{

timer1.Enabled = true;

timer1.Interval = 50;

//Используем двойную буферизацию:

this.SetStyle(ControlStyles.OptimizedDoubleBuffer |

ControlStyles.AllPaintingInWmPaint, true);

InvasionWave.UfoInvasion = new

SpaceShip[InvasionWave.MaxUfoQuantity];

for (int i = 0; i < InvasionWave.MaxUfoQuantity; i++)

InvasionWave.UfoInvasion[i] = new SpaceShip();

}

private void timer1_Tick(object sender, EventArgs e)

{

textBox1.Clear();

textBox1.AppendText(OurPRO.money.ToString());

Refresh();

}

private void button1_Click(object sender, EventArgs e)

{

if ((InvasionWave.CheckWaveIsDestroyed() ==

false)&&(InvasionWave.current_number_invasion_wave>0)) return;

InvasionWave.current_number_invasion_wave++;

OurPRO.money += 5000;

timer2.Enabled = true;

timer2.Interval = 2000;

InvasionWave.CreateInvasionWave();

InvasionWave.start_invasion = true;

}

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)

{

//Определяем координаты указателя в момент нажатия кнопки:

x_MouseDown_1 = e.X; y_MouseDown_1 = e.Y;

}

private void pictureBox1_MouseUp(object sender, MouseEventArgs e)

{

OurPRO.DetectSelectObject(x_MouseDown_1, y_MouseDown_1);

if (OurPRO.CheckDistanse(x_MouseDown_1, y_MouseDown_1) == false) return;

if (OurPRO.set_tower_enabled == false) return;

if ((OurPRO.DetectSelectObject(x_MouseDown_1, y_MouseDown_1) == false) && (OurPRO.money >= 2000))

{

Graphics myGraphics = CreateGraphics();

OurPRO.SetNewTower(x_MouseDown_1, y_MouseDown_1, myGraphics);

Cursor = Cursors.Arrow;

}

}

public bool OpenFire(PaintEventArgs e)

{

Pen myPen = new Pen(Color.Red, 1);

for (int j = 0; j < InvasionWave.CurrentInvasionQuantity; j++)

for (int i = 0; i < OurPRO.TowerQuantity; i++)

{

if ((InvasionWave.UfoInvasion[j].pos_of_ufo_x -

OurPRO.ProSolarSys[i].Pos.X) *

(InvasionWave.UfoInvasion[j].pos_of_ufo_x -

OurPRO.ProSolarSys[i].Pos.X) +

(InvasionWave.UfoInvasion[j].pos_of_ufo_y -

urPRO.ProSolarSys[i].Pos.Y) *

(InvasionWave.UfoInvasion[j].pos_of_ufo_y -

OurPRO.ProSolarSys[i].Pos.Y)

< OurPRO.ProSolarSys[i].fire_distance *

OurPRO.ProSolarSys[i].fire_distance)

{

if (InvasionWave.UfoInvasion[j].armor <= 0)

{

OurPRO.money += InvasionWave.UfoInvasion[j].cargo;

InvasionWave.UfoInvasion[j].cargo = 0;

continue;

}

e.Graphics.DrawLine(myPen, OurPRO.ProSolarSys[i].Pos.X,

OurPRO.ProSolarSys[i].Pos.Y,

InvasionWave.UfoInvasion[j].pos_of_ufo_x, InvasionWave.UfoInvasion[j].pos_of_ufo_y);

//нанесение повреждений

InvasionWave.UfoInvasion[j].armor = InvasionWave.UfoInvasion[j].armor -

OurPRO.ProSolarSys[i].damage;

}

}

return true;

}

private void pictureBox1_Paint(object sender, PaintEventArgs e)

{

Bitmap mySpace = new Bitmap(@"d:\solar_system_bg.bmp");

e.Graphics.DrawImage(mySpace, 0, 0);

InvasionWave.DrawInvasion(e, Earth);

//перепрорисовка башен

for (int i = 0; i < OurPRO.TowerQuantity; i++)

OurPRO.ProSolarSys[i].SetTower(OurPRO.ProSolarSys[i].Pos.X, OurPRO.ProSolarSys[i].Pos.Y, e.Graphics);

//прорисовка жизни планеты

Earth.Draw_Planet_life(e);

if (Earth.planet_life <= 0)

{

timer1.Stop();

timer2.Stop();

MessageBox.Show("Сражение проиграно", "Но решающие сражения впереди!",

MessageBoxButtons.OK, MessageBoxIcon.Warning);

//Application.Exit();

}

//ведение огня

OpenFire(e);

}

private void button2_Click(object sender, EventArgs e)

{

if (OurPRO.TowerQuantity < OurPRO.MaxTowerQuantity)

{

OurPRO.set_tower_enabled = true;

Cursor = Cursors.Cross;

}

}

private void button4_Click(object sender, EventArgs e)

{

for (int i = 0; i < OurPRO.TowerQuantity; i++)

if ((OurPRO.ProSolarSys[i].select == true) &&

(OurPRO.ProSolarSys[i].fire_distance < OurPRO.max_fire_distance) &&

(OurPRO.money >= 300))

{

OurPRO.ProSolarSys[i].fire_distance += 5;

OurPRO.money -= 300;

}

}

private void button3_Click(object sender, EventArgs e)

{

for (int i = 0; i < OurPRO.TowerQuantity; i++)

if ((OurPRO.ProSolarSys[i].select == true)

&& (OurPRO.ProSolarSys[i].damage < OurPRO.max_damage)

&& (OurPRO.money >= 300))

{

OurPRO.ProSolarSys[i].damage += 1;

OurPRO.money -= 300;

}

}

private void timer2_Tick(object sender, EventArgs e)

{

if (InvasionWave.UfoQuantity < InvasionWave.CurrentInvasionQuantity)

InvasionWave.UfoQuantity++;

}

private void button2_Click_1(object sender, EventArgs e)

{

if (OurPRO.TowerQuantity < OurPRO.MaxTowerQuantity)

{

if (OurPRO.set_tower_enabled == true)

{

OurPRO.set_tower_enabled = false;

Cursor = Cursors.Arrow;

}

else

{

OurPRO.set_tower_enabled = true;

Cursor = Cursors.Cross;

}

}

}

sing System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Drawing.Drawing2D;

using System.Drawing;

using System.ComponentModel;

using System.Data;

using System.Windows.Forms;

namespace Dreaming_of_Space_2

{

public class SolarPRO

{

public int money = 5000;

public int max_fire_distance = 50;

public int max_damage = 5;

public bool set_tower_enabled = false;

//Про солнечной системы

public int MaxTowerQuantity = 50;

public Tower[] ProSolarSys = new Tower[50];

public int TowerQuantity = 0;

public bool DetectSelectObject(int x_MouseDown_1, int y_MouseDown_1)

{

bool ret_val = false;

for (int i = 0; i < TowerQuantity; i++)

{

if ((x_MouseDown_1 - ProSolarSys[i].Pos.X) * (x_MouseDown_1 - ProSolarSys[i].Pos.X) +

(y_MouseDown_1 - ProSolarSys[i].Pos.Y) * (y_MouseDown_1 - ProSolarSys[i].Pos.Y) < 25)

{

ProSolarSys[i].select = true;

ret_val = true;

}

else ProSolarSys[i].select = false;

}

return ret_val;

}

public bool CheckDistanse(int x_MouseDown_1, int y_MouseDown_1)

{

for (int i = 0; i < TowerQuantity; i++)

{

if ((x_MouseDown_1 - ProSolarSys[i].Pos.X) * (x_MouseDown_1 - ProSolarSys[i].Pos.X) +

(y_MouseDown_1 - ProSolarSys[i].Pos.Y) * (y_MouseDown_1 - ProSolarSys[i].Pos.Y) < 900)

return false;

}

return true;

}

public bool SetNewTower(int x_MouseDown_1, int y_MouseDown_1, Graphics myGraphics)

{

//Graphics myGraphics = CreateGraphics();

Tower NewTower = new Tower();

NewTower.Pos.X = x_MouseDown_1;

NewTower.Pos.Y = y_MouseDown_1;

ProSolarSys[TowerQuantity] = NewTower;

ProSolarSys[TowerQuantity].SetTower(x_MouseDown_1, y_MouseDown_1, myGraphics);

money -= 2000;

TowerQuantity++;

set_tower_enabled = false;

return true;

}

}

}

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Drawing.Drawing2D;

namespace Dreaming_of_Space_2

{

public class SpaceInvasion

{

public bool start_invasion = false;

public int current_number_invasion_wave = 0; //номер волны нашествия

public int max_number_invasion_wave = 20;

//Корабли нашествия

public int MaxUfoQuantity = 20;

//public SpaceShip[] UfoInvasion = new SpaceShip[20];

public SpaceShip[] UfoInvasion;

public int UfoQuantity = 1; //колличество кораблей вышедших из подпространства

public int CurrentInvasionQuantity = 1;

public bool DrawInvasion(PaintEventArgs e, Planet Earth)

{

//прорисовка кораблей нашествия

if (start_invasion == true)

for (int i = 0; i < UfoQuantity; i++)

{

if (UfoInvasion[i].armor >= 0)

if (UfoInvasion[i].CalculateTrace() == true)

{

UfoInvasion[i].Redraw_Ufo(e);

UfoInvasion[i].UfoOpenFire(e, Earth);

}

}

return true;

}

public bool CreateInvasionWave()

{

if (current_number_invasion_wave > max_number_invasion_wave)

{

MessageBox.Show("Космос наш", "Победа!",

MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

return false;

}

UfoQuantity = 1;

start_invasion = false;

CurrentInvasionQuantity = current_number_invasion_wave;

for (int i = 0; i < MaxUfoQuantity; i++)

{

UfoInvasion[i].max_armor = 100 * current_number_invasion_wave;

UfoInvasion[i].armor = UfoInvasion[i].max_armor;

UfoInvasion[i].cargo = 100 * current_number_invasion_wave;

UfoInvasion[i].fire_power = 1000 * current_number_invasion_wave;

UfoInvasion[i].critical_damage = 10 + current_number_invasion_wave;

UfoInvasion[i].SpaceTrace1.GetRandomTrace();

UfoInvasion[i].InitTrace();

}

return true;

}

public bool CheckWaveIsDestroyed()

{

int count = 0;

for (int i = 0; i < CurrentInvasionQuantity; i++)

{

if ((UfoInvasion[i].armor <= 0) || (UfoInvasion[i].CalculateTrace() == false))

count++;

}

if (count == CurrentInvasionQuantity) return true;

else return false;

}

}

}

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Drawing.Drawing2D;

using System.Drawing;

using System.Windows.Forms;

namespace Dreaming_of_Space_2

{

public class SpaceShip

{

public int armor=100;

public int max_armor = 100;

public int cargo = 100;

public int speed=2;

public string ship_type;

public int critical_damage = 10;

public int fire_power = 1000;

//создаем форватер для кораблей

public SpaceTrace SpaceTrace1 = new SpaceTrace();

public int pos_of_ufo_x, pos_of_ufo_y;

public int index=0, posX, posY;

public double dl, x1, x2, y1, y2;

public SpaceShip() { pos_of_ufo_x = SpaceTrace1.way[0, 0]; pos_of_ufo_y = SpaceTrace1.way[0, 1]; }

//оптимальный вариант случайная генерация трассы в виде ломаной кривой

public bool InitTrace()

{

pos_of_ufo_x = SpaceTrace1.way[0, 0]; pos_of_ufo_y = SpaceTrace1.way[0, 1]; index = 0; dl = 0;

return true;

}

public bool CalculateTrace()

{

if (index == SpaceTrace1.way.GetLength(0) - 1) return false;

//движение корабля по траектории

dl = dl + speed;

posX = pos_of_ufo_x;

posY = pos_of_ufo_y;

//курс

x1 = SpaceTrace1.way[index, 0];

y1 = SpaceTrace1.way[index, 1];

x2 = SpaceTrace1.way[index + 1, 0];

y2 = SpaceTrace1.way[index + 1, 1];

//расчет перемещения

double tmp_x = 0, tmp_x1, tmp_x2, tmp_y;

tmp_x1 = x1 + dl * (x2 - x1) / System.Math.Sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));

tmp_x2 = x1 - dl * (x2 - x1) / System.Math.Sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));

if ((x2 - x1 >= 0) && (tmp_x1 > x1)) tmp_x = tmp_x1;

if ((x2 - x1 >= 0) && (tmp_x2 > x1)) tmp_x = tmp_x2;

if ((x2 - x1 < 0) && (tmp_x1 < x1)) tmp_x = tmp_x1;

if ((x2 - x1 < 0) && (tmp_x2 < x1)) tmp_x = tmp_x2;

if (x2 - x1 == 0)

{

if (y2 - y1 < 0) { tmp_y = y1 - dl; tmp_x = x1; }

else { tmp_y = y1 + dl; tmp_x = x1; }

}

else tmp_y = y1 + (tmp_x - x1) * (y2 - y1) / (x2 - x1);

//корректировка курса

if ((x2 - x1 <= 0) && (y2 - y1 <= 0) && (posX <= x2)/* && (posY <= y2)*/) { index++; dl = 0; }

if ((x2 - x1 > 0) && (y2 - y1 < 0) && (posX >= x2) /*&& (posY <= y2)*/) { index++; dl = 0; }

if ((x2 - x1 >= 0) && (y2 - y1 >= 0) && (posX >= x2)/* && (posY >= y2)*/) { index++; dl = 0; }

if ((x2 - x1 < 0) && (y2 - y1 > 0) && (posX <= x2) /*&& (posY >= y2)*/) { index++; dl = 0; }

pos_of_ufo_x = (int)System.Math.Ceiling(tmp_x);

pos_of_ufo_y = (int)System.Math.Ceiling(tmp_y);

return true;

}

public bool Redraw_Ufo(PaintEventArgs e)

{

//Создаем и рисуем летающую тарелку:

if (armor <= 0) return false;

Rectangle myRectangle1 = new Rectangle(

new Point(pos_of_ufo_x - 10, pos_of_ufo_y - 10),

new Size(20, 20));

e.Graphics.DrawRectangle(new Pen(Color.Transparent),

myRectangle1);

LinearGradientBrush myBrush1;

if (armor > critical_damage)

myBrush1 = new LinearGradientBrush(myRectangle1,

Color.LightGreen, Color.DarkGreen,

LinearGradientMode.Horizontal);

else

myBrush1 = new LinearGradientBrush(myRectangle1,

Color.Orange, Color.DarkRed,

LinearGradientMode.Horizontal);

e.Graphics.FillEllipse(myBrush1, myRectangle1);

Rectangle myRectangle2 = new Rectangle(

new Point(pos_of_ufo_x - 5, pos_of_ufo_y - 5),

new Size(10, 10));

e.Graphics.DrawRectangle(new Pen(Color.Transparent),

myRectangle2);

LinearGradientBrush myBrush2;

if (armor > critical_damage)

myBrush2 = new LinearGradientBrush(myRectangle2,

Color.LightGreen, Color.DarkGreen,

LinearGradientMode.Horizontal);

else

myBrush2 = new LinearGradientBrush(myRectangle2,

Color.Orange, Color.DarkRed,

LinearGradientMode.Horizontal);

e.Graphics.FillEllipse(myBrush2, myRectangle2);

int life = (int)System.Math.Ceiling((double)20*armor/max_armor);

Pen myPen = new Pen(Color.LightGreen, 2);

e.Graphics.DrawLine(myPen, pos_of_ufo_x - 10, pos_of_ufo_y - 15, pos_of_ufo_x - 10+life, pos_of_ufo_y - 15);

return true;

}

public bool UfoOpenFire(PaintEventArgs e, Planet TargetPlanet)

{

int target_x = TargetPlanet.pos_x, target_y = TargetPlanet.pos_y, target_R = TargetPlanet.R_orbit;

if ((pos_of_ufo_x - target_x) * (pos_of_ufo_x - target_x) +

(pos_of_ufo_y - target_y) * (pos_of_ufo_y - target_y) < target_R*target_R)

{

TargetPlanet.planet_life -= fire_power;

fire_power = 0;

Pen myPen = new Pen(Color.Red, 2);

e.Graphics.DrawLine(myPen, pos_of_ufo_x, pos_of_ufo_y,

target_x, target_y);

return true;

}

return false;

}

}

}

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Drawing;

using System.Drawing.Drawing2D;

namespace Dreaming_of_Space_2

{

public class SpaceTrace

{

public int[,] way = { {873,672}, {270,670}, {630,500}, {864,330}, {860,97}, {536,260}, {404,241},

{350,295}, {197,366}, {25,660}};

GraphicsPath myGraphicsPath3 = new GraphicsPath();

ublic bool GetRandomTrace()

{

Random rnd = new Random();

for (int i = 1; i < way.GetLength(0) - 1; i++)

{

way[i, 0] = rnd.Next(1,920);

way[i, 1] = rnd.Next(1,700);

}

way[7, 0] = 350;

way[7, 1] = 295;

return true;

}

public void DrawWay(Graphics myGraphics)

{

Point[] points = new Point[way.GetLength(0)];

for (int i = 0; i < way.GetLength(0); i++)

{

points[i] = new Point(way[i, 0], way[i, 1]);

}

myGraphicsPath3.AddCurve(points);

myGraphics.DrawPath(new Pen(Color.White, 1),

myGraphicsPath3);

}

}

}

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Drawing;

using System.Drawing.Drawing2D;

using System.Windows.Forms;

namespace Dreaming_of_Space_2

{

public class Tower

{

public int damage=1;

public Point Pos;

public int fire_distance=30;

public string FireType="laser";

public bool select=false;

public bool is_fire = false;

public bool SetTower(int x_MouseDown_1, int y_MouseDown_1, Graphics myGraphics)

{

Pen myPen = new Pen(Color.Black, 1);

// Graphics myGraphics = CreateGraphics();

//Создаем и рисуем огневую точку:

Rectangle myRectangle = new Rectangle(

new Point(x_MouseDown_1-5, y_MouseDown_1-5),

new Size(10, 10));

myGraphics.DrawRectangle(new Pen(Color.Transparent),

myRectangle);

//установка радиуса поражения

Pen myPen1 = new Pen(Color.Red, 1);

myPen1.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;

myGraphics.DrawEllipse(myPen1, x_MouseDown_1 - fire_distance, y_MouseDown_1 - fire_distance,

fire_distance * 2, fire_distance*2);

LinearGradientBrush myBrush;

myBrush = new LinearGradientBrush(myRectangle,

Color.White, Color.Black,

LinearGradientMode.Horizontal);

myGraphics.FillEllipse(myBrush, myRectangle);

// Create string to draw.

String drawString = damage.ToString();

// Create font and brush.

Font drawFont = new Font("Arial", 8);

SolidBrush drawBrush = new SolidBrush(Color.Green);

// Create point for upper-left corner of drawing.

float x = Pos.X-15;

float y = Pos.Y-15;

myGraphics.DrawString(drawString, drawFont, drawBrush, x, y);

if (select == true) Select(myGraphics);

return true;

}

public bool Select(Graphics myGraphics)

{

Pen myPen = new Pen(Color.ForestGreen, 1);

Point[] SelectPoints = new Point[3];

SelectPoints[0].X=Pos.X-15;

SelectPoints[0].Y=Pos.Y-10;

SelectPoints[1].X=Pos.X-15;

SelectPoints[1].Y=Pos.Y-15;

SelectPoints[2].X=Pos.X-10;

SelectPoints[2].Y=Pos.Y-15;

myGraphics.DrawLines(myPen, SelectPoints);

SelectPoints[0].X = Pos.X + 10;

SelectPoints[0].Y = Pos.Y - 15;

SelectPoints[1].X = Pos.X + 15;

SelectPoints[1].Y = Pos.Y - 15;

SelectPoints[2].X = Pos.X + 15;

SelectPoints[2].Y = Pos.Y - 10;

myGraphics.DrawLines(myPen, SelectPoints);

SelectPoints[0].X = Pos.X + 15;

SelectPoints[0].Y = Pos.Y + 10;

SelectPoints[1].X = Pos.X + 15;

SelectPoints[1].Y = Pos.Y + 15;

SelectPoints[2].X = Pos.X + 10;

SelectPoints[2].Y = Pos.Y + 15;

myGraphics.DrawLines(myPen, SelectPoints);

SelectPoints[0].X = Pos.X - 10;

SelectPoints[0].Y = Pos.Y + 15;

SelectPoints[1].X = Pos.X - 15;

SelectPoints[1].Y = Pos.Y + 15;

SelectPoints[2].X = Pos.X - 15;

SelectPoints[2].Y = Pos.Y + 10;

myGraphics.DrawLines(myPen, SelectPoints);

return true;

}

}

}

Размещено на Allbest.ru


Подобные документы

  • Общие сведения и существующие среды реализации компьютерной игры "Лабиринт". Разработка алгоритмов в виде блок-схемы, принципы программной реализации игры. Особенности тестирования разработанного программного продукта. Аспекты эксплуатации продукта.

    курсовая работа [1,4 M], добавлен 18.01.2017

  • Разработка компьютерной игры "Эволюция" с помощью игрового движка Unit. Сравнение критериев игры-аналога и разрабатываемой игры. Разработка графического интерфейса пользователя. Настройки камеры в редакторе Unity. Структура файла сохранения игры.

    дипломная работа [3,6 M], добавлен 11.02.2017

  • Разработка и реализация компьютерной игры "Змейка" с помощью языка программирования Pascal и модуля CRT. Составление общего алгоритма программы, выделение ее функциональных частей. Разработка тестовых примеров. Использование типизированных файлов.

    курсовая работа [2,1 M], добавлен 23.02.2011

  • Описание правил игры "Морской бой". Особенности современных компьютеров и искусственного интеллекта. Создание общей блок-схемы программы, ее внешний вид. Необходимые переменные, процедуры и функции. Характеристика объектов, используемых в приложении.

    курсовая работа [950,1 K], добавлен 05.11.2012

  • Особенности программирования аркадных игр в среде Python. Краткая характеристика языка программирования Python, его особенности и синтаксис. Описание компьютерной игры "Танчики" - правила игры, пояснение ключевых строк кода. Демонстрация работы программы.

    курсовая работа [160,3 K], добавлен 03.12.2014

  • Алгоритмическое представление и описание правил игры "Эволюция". Построение диаграммы прецедентов. Разработка графического интерфейса пользователя. Реализация интерфейса в среде Unity. Структура файла сохранения игры. Проектирование поведения компьютера.

    дипломная работа [3,3 M], добавлен 18.02.2017

  • Приемы практического использования объектно-ориентированного подхода в создании законченного программного продукта. Разработка кроссплатформенной компьютерной игры "Морской бой". Принципы "хорошего стиля программирования C++/Qt". Описание классов игры.

    курсовая работа [2,7 M], добавлен 12.08.2014

  • Обзор методов и средств реализации поставленной задачи. Описание компьютерной игры "Японские кроссворды". Обоснование инструментария разработки программного продукта. Алгоритмический анализ задачи. Графический интерфейс и лингвистическое обеспечение.

    курсовая работа [725,4 K], добавлен 27.08.2013

  • Понятие и эволюция игр, анализ их различных жанров и существующих аналогов. Выбор программных средств для реализации игры, написание сюжета и выбор среды разработки игры. Алгоритмы для придания гибкости обучающей игре. Описание программных модулей.

    дипломная работа [2,7 M], добавлен 27.10.2017

  • Разработка и создание игры "Змейка". Использование динамически-активных принципов языка Java. Графические объекты программы. Описание игры, правила, теоретические сведения. Классы приложения. Типы данных. Реализация. Метод. Объект. Блок-схема игры.

    курсовая работа [12,4 K], добавлен 18.06.2008

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.