Объектно-ориентированное программирование
Описание разрабатываемой программы с точки зрения пользователя. Диаграмма вариантов использования приложения. Объектное представление программы. Разработка класса корабля, прикладного окна и события but. Окно приложения с перемещающимися кораблями.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 05.04.2014 |
Размер файла | 207,0 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Pause.setLocation(20, 110);
Pause.setSize(100, 25);
Pause.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent aE)
{
if (Pause.getLabel() == "Пауза")
{
for (int i = 0; i < prog.num; i++)// генерируем событие приостановки
{
prog.ship[i].Stop();
SetStatus(i, "Остановлен");
}
prog.charger.Stop();
Pause.setLabel("Старт");// меняем текст кнопки
}
else
{
for (int i = 0; i < prog.num; i++)// генерируем событие запуска
{
prog.ship[i].Start();
SetStatus(i, "В полете");
}
prog.charger.Start();
Pause.setLabel("Пауза");
}
}
});
this.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent wE)
{
System.exit(0);
}
});
Koord = new Point[10];
for (int i = 0; i < 10; i++)
Koord[i] = new Point(15, i * 21 + 40);
Sost = new TextField[10];
for (int i = 0; i < 10; i++)
{
Sost[i] = new TextField();
Sost[i].setLocation(Koord[i]);
Sost[i].setText(System.Convert.ToString(i) + ". Не запущен");
Sost[i].setSize(90, 20);
}
Sost[0].setText("0. В полёте");
// окошко с кнопками управления
ctrl = new Frame("Controls");
ctrl.setSize(150, 200);
ctrl.setLayout(new FlowLayout());
ctrl.setLocation(10, 50);
ctrl.add(AddShip);
ctrl.add(AddFuel);
ctrl.add(Pause);
ctrl.add(numShip);
ctrl.setVisible(true);
ctrl.show();
// окошко с информацией
Info = new Frame("Info");
Info.setSize(150, 260);
for (int i = 0; i < 10; i++)
Info.add(Sost[i], new Point()); // Массив сообщений во 2 окне
Info.setLocation(10, 250);
Info.setVisible(true);
Info.show();
AddShip.addActionListener(this);
AddFuel.addActionListener(this);
Pause.addActionListener(this);
}
public void SetStatus(int num, String str)
{
this.Sost[num].setText(System.Convert.ToString(num) + ". " + str);
}
public boolean IsntDisappeared(int i) // Проверка статуса на "исчезновение"
{
if (Sost[i].getText() == System.Convert.ToString(i) + ". Исчез")
return false;
else return true;
}
public void actionPerformed(ActionEvent aE)
{
//repaint();//Перерисовать
}
public static void main()
{
Controls MainForm = new Controls();
MainForm.show();
}
}
Приложение 4. Текст программы на языке C++/CLI
// UniteCPP.cpp : main project file.
#include "stdafx.h"
#include "Form1.h"
#using <System.dll>
#using <System.Windows.Forms.dll>
#using <System.Drawing.dll>
using namespace System::Threading;
using namespace UniteCPP;
public delegate void delBut(String ^btn, int numship); // делегат события кнопок
// класс формы с кнопками
ref class ButtonForm : Form
{
Form ^ctrl; // Форма с кнопками
Form ^Info;
Button ^AddShip; // Добавить новый корабль
Button ^AddFuel; // Добавить топливо
Button ^pause; // Приостановка всех кораблей
TextBox ^numShip; // Номер корабля, которому добавляется топливо
array< TextBox^ > ^Sost; // Сообщения о состоянии кораблей
public: event delBut ^but; // Привязываем к делегату события нажатия кнопок
// конструктор формы
public: ButtonForm()
{
// кнопки
AddShip = gcnew Button();
AddShip->Location = Point(10, 50);
AddShip->Text = "Добавить корабль";
AddShip->Size = System::Drawing::Size(120, 25);
AddShip->Click += gcnew EventHandler(this, &ButtonForm::onAdd);
AddFuel = gcnew Button();
AddFuel->Location = Point(10, 80);
AddFuel->Text = "Добавить топливо";
AddFuel->Size = System::Drawing::Size(120,25);
AddFuel->Click += gcnew EventHandler(this, &ButtonForm::onAddFuel);
pause = gcnew Button();
pause->Location = Point(20, 110);
pause->Size = System::Drawing::Size(100, 25);
pause->Text = "Пауза";
pause->Click += gcnew EventHandler(this, &ButtonForm::onPause);
numShip = gcnew TextBox();
numShip->Location = Point(35, 20);
numShip->Text = "0";
numShip->Size = Drawing::Size(65, 25);
Sost = gcnew array< TextBox^ >(10);;
for (int i = 0; i < 10; i++)
{
Sost[i] = gcnew TextBox();
Sost[i]->Location = Point(15, i*21 + 5); //Koord[i];
Sost[i]->Text = Convert::ToString(i)+". Не запущен";
Sost[i]->Size = System::Drawing::Size(90, 20);
}
Sost[0]->Text = "0. В полёте";
//окошко с кнопками управления
ctrl = gcnew Form();
ctrl->Location = Point(10,50);// позиционируем
ctrl->Text = "Controls";
ctrl->ClientSize = System::Drawing::Size(150,150);
ctrl->Controls->Add(AddShip);
ctrl->Controls->Add(AddFuel);
ctrl->Controls->Add(pause);
ctrl->Controls->Add(numShip);
// окошко с информацией
Info = gcnew Form();
Info->Text = "Info";
Info->ClientSize = System::Drawing::Size(110, 230);
for (int i = 0; i < 10; i++ ) Info->Controls->Add(Sost[i]); // Массив сообщений во 2 окне
ctrl->Location = Point(10, 50); // позиционируем
ctrl->Show(); // показываем окно
Info->Location = Point(10, 250);
Info->Show();
}
public: void SetStatus (int num, String ^str)
{
this->Sost[num]->Text = Convert::ToString(num) + ". " + str;
}
public: bool IsntDisappeared(int i) // Проверка статуса на "исчезновение"
{
if (Sost[i]->Text == Convert::ToString(i) + ". Исчез")
return false;
else return true;
}
// обработчик кнопки добавления корабля
void onAdd(System::Object^ sender, EventArgs^ e)
{
but("add", 0);
}
// обработчик кнопки приостановки
void onPause(Object^ sender, EventArgs^ e)
{
if (pause->Text == "Пауза")
{
pause->Text = "Старт"; // меняем текст кнопки
but("stop", 0); // генерируем событие приостановки
}
else
{
pause->Text = "Пауза";
but("start", 0); // генерируем событие запуска
}
};
// обработчик кнопки добавления топлива
void onAddFuel(Object^ sender, EventArgs^ e)
{
but("fuel", Convert::ToInt32(this->numShip->Text));
};
};
// Класс корабля.
ref class Ship
{
protected: System::Threading::Thread ^th;
public:int id; // Порядковый номер корабля
protected:bool live;
protected: double x, y; // позиция
protected: double speedX, speedY; // скорость
protected: double fi; // положение на окружности орбиты
double static fi2; // Копия фи
public: double fuel; // топливо
protected: bool WasOnMoon; // был ли на Луне
protected: bool start1; // только что стартовал
protected: bool comeback1; // первое возвращение
public: bool vstrecha;
// Конструктор класса. Принимает номер корабля.
public: Ship(int ns)
{
this->id = ns; // Записываем номер корабля
this->live = false; // первоначально не движемся
this->x = 160; // начальная позиция (поверхность Земли)
this->y = 300; // начальная позиция по высоте (поверхность Земли)
this->speedX = 0; // скорость движения по горизонтали
this->speedY = -3; // скорость движения по вертикали (старт с Земли)
this->fi = Math::PI;
this->fuel = 50; // начальный запас топлива
this->WasOnMoon = false; // изначально на Луне не был =)
this->start1 = true; // первый старт - да
this->comeback1 = false; // первое возвращение - нет
this->vstrecha = false; // встречи нет
Start(); // запускаем движение
}
// функция старта потока движения корабля
public: void Start()
{
if (live == false)
{
live = true;
th = gcnew Thread(gcnew ThreadStart(this, &Ship::Move)); // Создаем объект-поток "движение корабля"
th->Start(); // Стартуем поток
}
}
// функция остановки потока движения корабля
public: void Stop()
{
live = false;
}
// Поток, отвечающий за движение корабля
void Move()
{
while (live) // пока поток жив
{
if ((x > 0 && x < 420 && y > 210 && y < 600) && !(x == 160 && y > 232)) // Орбита Земли
{
if (WasOnMoon == false) // Если на Луне еще не был, разгон
{ // по орбите и полет к Луне
if (start1)
{
fi = -Math::PI / 2 - 0.2;
start1 = false;
}
speedY = 6 * Math::Cos(fi);
speedX = -6 * Math::Sin(fi);
y -= 0.16;
if (fi > Math::PI/2) fuel -= 0.5; // Разгон: топливо уменьшается
else fuel -= 0.05;
}
else // Если возвращается с Луны, становится на орбиту
{ // с вращением против часовой стрелки
if (comeback1 && x < 230)
{
fi = -Math::PI / 2;
comeback1 = false;
}
if (!comeback1)
{
speedY = 6 * Math::Cos(fi);
speedX = 6 * Math::Sin(fi);
y -= 0.05;
fuel -= 0.05;
}
}
}
if (x == 160 && y > 225 && y < 235) // Земля - Луна
{
speedX = -speedY + 3;
};
if (x > 465 && x < 630 && y < 180) // Орбита Луны
{
if (!WasOnMoon)
{
fi = Math::PI+0.4;
WasOnMoon = true;
comeback1 = true;
}
speedY = 4*Math::Cos(fi);
speedX = -4*Math::Sin(fi);
x += 0.04;
if (fi > Math::PI*2-0.3 || fi < Math::PI/2) fuel -= 0.5; // Разгон: топливо уменьшается
else fuel -= 0.05;
}
x += speedX; y += speedY; // движемся
if (fi < 2 * Math::PI) // изменяем угол фи
{
if (x > 425) fi += 0.051;
else fi += 0.032;
}
else fi = 0;
fi2 = fi;
this->th->Sleep(60); // спим
}
}
// публичные сеттеры/геттеры
public: property double X
{
double get() { return x ; } // чтение координаты х
};
public: property double Y
{
double get() { return Convert::ToInt32(y); } // чтение координаты у
};
public: property double setY
{
void set(double value) { y = value; } // запись координаты у
};
public: property double setX
{
void set(double value) { x = value; } // запись координаты х
};
public: property double spY
{
double get() { return Convert::ToInt32(speedY); } // чтение скорости по у
};
public: property double spX
{
double get() { return Convert::ToInt32(speedX); } // чтение скорости по х
};
public: property double setSpY
{
void set(double value) { speedY = value; } // запись скорости по у
};
public: property double setSpX
{
void set(double value) { speedX = value; } // запись скорости по х
};
public: property bool isStopped { bool get() { return !this->th->IsAlive; } };
};
ref class Charger : Ship
{
public: Charger(): Ship(10)
{
this->speedY = 0;
this->y = 225; // начальная позиция по высоте (орбита Земли)
this->x = 230;
this->fi = -Math::PI / 2 - 0.05; // начальная позиция на окружности орбиты
Stop(); // останавливаем запущенный поток для движения кораблей
StartCh(); // запускаем движение по стабильной орбите против часовой стрелки
}
public: void StartCh()
{
if (live == false)
{
this->th->Abort(); // Отключаем стандартный поток кораблей
live = true;
this->th = gcnew Thread(gcnew ThreadStart(this, &Charger::Move)); // Создаем новый поток с другой функцией движения
this->th->Start(); // Стартуем поток
}
}
void Move()
{
while (live) // пока поток жив
{
speedY = 12 * Math::Cos(fi);
speedX = 12 * Math::Sin(fi);
if (y > 415) y -= 0.27; else y -= 0.05;
x += speedX; y += speedY; // движемся
if (fi < 2 * Math::PI) fi += 0.065; // изменяем угол фи
else fi = 0;
this->th->Sleep(60); // спим
}
}
};
// Класс формы с объектами
ref class Program : public Form
{
ButtonForm ^ContForm;
array< Ship^ > ^ship;
Charger ^charger;
int num;
int numdis;
int s1, s2;
double dx, dy;
System::Threading::Thread ^th;
bool live;
// Констуктор
public: Program()
{
num = 1; // стартовое кол-во кораблей
Text = "Objects"; // заголовок окна
this->Size = System::Drawing::Size(675, 675); // размер окна
this->FormBorderStyle = System::Windows::Forms::FormBorderStyle::SizableToolWindow;
this->FormClosed += gcnew FormClosedEventHandler(this, &Program::exit);
this->Show(); // показываем
Location = Point(200, 50); // позиционируем окно
ContForm = gcnew ButtonForm(); // подключаем класс формы с кнопками управления
ContForm->but += gcnew delBut(this, &Program::ButPressed); // привязываем события нажатия кнопок
ship = gcnew array< Ship^ >(10); // Массив из 10 кораблей (макс)
for (int i = 0; i < num; i++) // Перебираем массив кораблей
{
ship[i] = gcnew Ship(i); // Создаем новый объект-корабль и помещаем его в массив
}
charger = gcnew Charger();
DoubleBuffered = true; // буферизация - устраняет мелькание
live = true; // стартуем
th = gcnew System::Threading::Thread(gcnew System::Threading::ThreadStart(this, &Program::run));
th->Start();
}
// потоковая функция
void run()
{
while (live)
{
// перебираем корабли
for (int i = 0; i < num; i++)
{
if (Math::Abs(ship[i]->X - charger->X) < 20 && Math::Abs(ship[i]->Y - charger->Y) < 20) // Заправка
if (!charger->isStopped)
{
if (ship[i]->fuel <= 89) ship[i]->fuel += 10; else ship[i]->fuel = 99;
}
if (ship[i]->fuel <= 0) // Если кончается топливо, корабль "исчезает".
{
ship[i]->Stop();
ship[i]->setX = 1000;
ship[i]->setY = 1000 + 50*i;
numdis = i;
this->Invoke(gcnew EventHandler(this, &Program::SetStat)); // Сообщение статуса
//gcnew EventHandler(this, &ButtonForm::onPause);
}
for (int j = i + 1; j < num; j++)
{
if (i < j) // Уступает корабль с бОльшим номером
{
s2 = j;
s1 = i;
}
else
{
s2 = i;
s1 = j;
}
if (Math::Abs(ship[s1]->X - ship[s2]->X) < 20 && Math::Abs(ship[s1]->Y - ship[s2]->Y) < 20)
{
ship[s2]->vstrecha = true; // Встреча началась
if (!ship[s1]->isStopped && !ship[s2]->isStopped) ship[s2]->Stop();
}
else if (ship[s2]->vstrecha)
{
ship[s2]->Start(); // Если пропускал, то продолжить движение
ship[s2]->vstrecha = false; // Встреча закончилась;
}
}
Invalidate();
Thread::Sleep(31);
}
}
}
void SetStat(System::Object^ sender, EventArgs^ e)
{
ContForm->SetStatus(numdis, "Исчез");
};
// перерисовка содержимого окна
protected: virtual void OnPaint(PaintEventArgs^ arg) override
{
Pen ^grayPen = gcnew Pen(Color::LightGray);
Pen ^blackPen = gcnew Pen(Color::Black);
SolidBrush ^blackBrush = gcnew SolidBrush(Color::Black);
SolidBrush ^whiteBrush = gcnew SolidBrush(Color::White);
SolidBrush ^greenBrush = gcnew SolidBrush(Color::Lime);
System::Drawing::Font ^ArialF = gcnew System::Drawing::Font("Arial", 10);
arg->Graphics->FillRectangle(blackBrush,0,0,1280,960); // Фон
arg->Graphics->FillRectangle(whiteBrush, 100, 150, 2, 2); // Звезды
arg->Graphics->DrawEllipse(grayPen, 40, 230, 370, 370); // Орбита Земли
arg->Graphics->DrawEllipse(grayPen, 468, 28, 162, 162); // Орбита Луны
arg->Graphics->FillEllipse(gcnew SolidBrush(Color::DeepSkyBlue), 100, 290, 250, 250); // Земля
arg->Graphics->FillEllipse(gcnew SolidBrush(Color::DarkKhaki), 500, 60, 100, 100); // Луна
for (int i = 0; i < num; i++) // перебираем корабли
{
arg->Graphics->FillEllipse(greenBrush, ship[i]->X, ship[i]->Y, 16, 16); // корабль
arg->Graphics->DrawEllipse(blackPen, ship[i]->X, ship[i]->Y, 16, 16); // обводим корабль
arg->Graphics->DrawString(ship[i]->id + "", ArialF, blackBrush, ship[i]->X + 4, ship[i]->Y); // номер
arg->Graphics->DrawString(Math::Round(ship[i]->fuel) + "", ArialF, whiteBrush, ship[i]->X - 1, ship[i]->Y - 15);
}
arg->Graphics->FillEllipse(gcnew SolidBrush(Color::DarkRed), charger->X, charger->Y, 16, 16); // заправщик
arg->Graphics->DrawEllipse(blackPen, charger->X, charger->Y, 16, 16); // обводим корабль
arg->Graphics->DrawString("C", ArialF, blackBrush, charger->X + 2, charger->Y); // номер
}
// обработчик событий кнопок формы управления
void ButPressed(String^ btn, int numship)
{
if (btn == "add")
if (num < 10)
{ // если кол-во < 10
ship[num] = gcnew Ship(num); // создаём
ContForm->SetStatus(num, "В полёте");
num++;
}
else
{
MessageBox::Show("Не больше 10!");
}
else if (btn == "start")
{
for (int i = 0; i < num; i++)
{
if (ContForm->IsntDisappeared(i)) ship[i]->Start(); // стартуем все корабли, кроме исчезнувших
ContForm->SetStatus(i, "В полёте");
}
charger->StartCh();
}
else if (btn == "stop")
{
for (int j = 0; j < num; j++)
{
ship[j]->Stop(); // приостанавливаем все корабли
ContForm->SetStatus(j, "Остановлен");
}
charger->Stop();
}
else if (btn == "fuel") // добавляем 20 единиц топлива
{
if (ship[numship] != nullptr)
{
ship[numship]->fuel += 20;
if (ship[numship]->fuel > 99) ship[numship]->fuel = 99; // если значение топлива превысит 99, то устанавливается в 99
}
}
}
// событие закрытия окна, завершаем потоки и зыкрываем программу
protected: virtual void OnClosed(EventArgs^ args) override
{
exit(nullptr, nullptr);
}
// обработчик выхода из программы
void exit(Object ^sender, FormClosedEventArgs ^e)
{
for (int i = 0; i < num; i++)
{
ship[i]->Stop();
}
charger->Stop();
th->Abort();
th->Join();
Application::Exit();
}
};
// основная функция
int main(array<System::String ^> ^args)
{
Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false);
Application::Run(gcnew Program); // запускаем программу по созданной ссылке
return 0;
}
Размещено на Allbest.ru
Подобные документы
Разработка оконного приложения на языке C#, в окне которого будет игра "Лабиринт. Диаграмма вариантов использования языка UML. Описание разрабатываемой программы с точки зрения программиста. Разработка прикладного окна, классов Enemy и Dot, Wall и Map.
курсовая работа [457,6 K], добавлен 22.06.2015Разработка программы с использованием принципов объектно-ориентированного программирования на языке высокого уровня С средствами Microsoft Visual Studio 2010. Построение алгоритма реализации. Класс программы, инструкция по использованию программы.
курсовая работа [1,0 M], добавлен 26.12.2013Введение в объектно-ориентированное программирование. Постановка задачи. Описание алгоритма решения в псевдокоде (команды в виде текста на русском языке). Исходный текст программы на С. Тестирование программы. Модификация программы. Полиморфизм.
курсовая работа [294,0 K], добавлен 08.09.2008Общая характеристика объектно-ориентированного подхода в программировании, его основные свойства и принципы. Разработка программы для автоматизация деятельности кафе на основе объектно-ориентированного подхода, проектирования и реализации схемы данных.
курсовая работа [1,2 M], добавлен 22.01.2012Методология объектно-ориентированного программирования в Java. Понятия класса, объекта и объектной переменной. Динамическая и статическая объектные модели. Логическое структурирование приложения. Наследование в Java. Отличия интерфейсов от классов.
курс лекций [547,2 K], добавлен 01.05.2014Создание потока с помощью конструктора на основе класса Thread, интерфейса Runnable, синхронизации потоков. Краткая справка по необходимым программным компонентам. Составление программы анимации мячей пространстве окна. Диаграмма классов приложения.
лабораторная работа [884,9 K], добавлен 01.05.2014Объектно-ориентированное программирование: понятие и содержание, история зарождения и развития, особенности и принципы реализации. Структура и назначение разрабатываемой программы, используемые технические и программные средства, формирование инструкции.
курсовая работа [1,2 M], добавлен 17.04.2013Описание технологии asp.net. Страницы веб-приложения, тестирование системы. Описание функциональной, динамической модели системы. Диаграммы вариантов использования, последовательности, база данных приложения. Реализация программы, интерфейс, тестирование.
курсовая работа [3,2 M], добавлен 30.01.2013Описание логической и модульной структуры разрабатываемой программы, используемые в данном процессе основные технические средства. Организация хранения данных в программе, проектирование интерфейса. Тестирование и отладка, листинг готовой программы.
курсовая работа [494,5 K], добавлен 20.06.2012Проблема скрытия и защиты информации от несанкционированного использования. История создания шифра. Решения задачи шифрования текста и кодирования данных. Тестирование полученного приложения и анализ работы программы с точки зрения пользователя.
курсовая работа [3,0 M], добавлен 24.11.2013