Курсовая работа (т): Разработка приложения, состоящего из прикладного окна

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Разработка приложения, состоящего из прикладного окна

Министерство общего и профессионального образования

Российской Федерации

Казанский государственный технический университет

имени. А.Н. Туполева

Кафедра АСОИУ








Курсовая работа

по дисциплине «Технология программирования»


Исполнитель:

студент группы

Руководитель:

Оценка _____________________

Подпись_____________________




Казань 2015

Оглавление

1. Введение

1.1 Задание

1.2 Уточнение задания

2. Аннотация

3. Описание разрабатываемой программы с точки зрения пользователя

4. Описание разрабатываемой программы с точки зрения программиста

4.1 Объектное представление программы

4.2 События

4.3. Потоки

5. Поэтапная разработка программной системы

5.1 Разработка класса обычного объекта

5.2 Разработка классов Enemy и Dot

5.3 Разработка классов Wall и Map

5.4 Разработка прикладного окна

5.5 Разработка собственных Exception и Логгера

6. Описание проблем, возникших при разработке программной системы.

7. Заключение

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

Приложения

1. Введение

        

         1.1 Задание


Разработать оконное приложение, в окне которого будет лабиринт.

По лабиринту должны перемещать враг. Игрок, должен убегая от врагов собирать монетки.

Программа должна содержать:

классы

наследование

объекты

потоки

синхронизация потоков

делегаты и события

обработка исключений

Минимум 3 пункта меню, 2 из них должны содержать 3 подпункта.

        

         1.2 Уточнение задания


Программа состоит их прикладного окна. В области клиента прикладного окна расположен лабиринт. В игре несколько уровней. Каждый уровень представлен в виде квадратной матрицы где 0 это монетка, 1 стена, 2 игрок, 3 враг. Враги и игрок представлены в виде квадратов, на которые наложены изображения. Каждый враг и игрок имеют свой поток.

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

Программы реализовать в среде Microsoft Visual Studio 2013 на языке C#.

         2. Аннотация


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

3. Описание разрабатываемой программы с точки зрения пользователя

Программа представлена прикладным окном. В окне перемещаются n врагов.

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

Диаграмма вариантов использования языка UML изображает действия, выполняемые пользователем программы. С точки зрения пользователя приложение предполагает три варианта использования:

·        запустить игру

·        перезапустить уровень

·        загрузить уровень

·        отключить/включить изображения

·        отключить/включить показ столкновений

·        сбросить прохождение

·        открыть окошко «об игре»

·        управлять персонажем с помощью клавиш

Диаграмма вариантов использования представлена на рис. 3.1.

Рис. 3.1. Диаграмма вариантов использования приложения

Прекращение выполнения программы происходит при закрытии прикладного окна или при нажатии меню «выход»

4. Описание разрабатываемой программы с точки зрения программиста

        

         4.1 Объектное представление программы


Программа включает объекты разных типов. Главными объектами программы являются объект прикладного окна класса MainWindow. При старте игры уровень считывается из файла в 2мерный List. Класс Map создает все Entity расположенные на уровне (классы Player, Enemy, Dot). Класс Wall строит лабиринт. После срабатывания события LevelLoad, экземпляры Player, Enemy и Map запускают потоки. Все все созданные игровые объекты хранятся в списке _entities. Map в цикле пробегается по каждого игрового объекта и проверяет его пересечение со всеми остальными, а также посылает в Wall для проверки пересечения со стеной. Wall приводит координаты объекта к индексу в матрице и проверяет ячейку на наличие там стены. В случае столкновения объекта с другим у обоих объектов вызывается соответственная функция:

При столкновения игрока с врагом тратится жизнь.

При столкновении игрока с монетой, увеличиваются очки, монета исчезает.

Если игрок столкнулся с врагом при 0 жизней, игрок умирает, а уровень перезагружается. Когда игрок съедает все монеты, загружается следующий уровень.

При столкновении со стеной объект выезжает из стены (Player останавливается, а Enemy произвольно меняет направление движения). Во время движения, каждый раз, когда по бокам от Enemy есть пустые ячейки, Enemy произвольно может сменить направление с шансом от 30 до 70% (процент смены направления генерируется случайно в пределах заданного значения для каждого экземпляра).

4.2 События

В программе имеются несколько событий.

LevelLoad - Генерирует Map когда полностью создан уровень.

RestartLevel - Генерирует Map когда уровень перезагружается.

OnKeyDown - системное событие нажатия клавиши;

onKeyUp - системное событие отпускания клавиши;

        

         4.3 Потоки

приложение окно игра

Помимо основных потоков wpf, в программе используется дополнительные потоки. Класс Map создает поток для проверки коллизии. Враги и Игрок также имеют свой собственный поток для каждого экземпляра, в которых они перемещаются и реагируют на события.

         5. Поэтапная разработка программной системы


Разработка приложения будет осуществляться поэтапно. Вначале разработаем класс Map и Wall, которые будут отвечать за сцену. Создадим класс Player, и сделаем передвижение игрока по нажатию на кнопки. Затем создадим базовый класс Entity от которого наследуем класс Player потокового объекта и протестируем его. Вынесем в Entity базовые свойства игровых объектов. Создадим механизм проверки столкновений со стеной. Затем создадим и отладим класс Enemy, и протестируем механизм столкновений между врагами и игроком. Сделаем чтобы при столкновении со стеной враг менял направление. Сделаем определение пустых ячеек по бокам от врага, и генерацию процента для случайной смены направления во время движения. Создадим класс Dot и отнаследуем от Entity. Сделаем механизм поедания монет. Далее сделаем жизни, и смерть игрока. Сделаем перезагрузку уровней. Добавим меню.

.1 Разработка класса обычного объекта

На первом этапе создадим абстрактный базовый класс Entity, от которого будут наследоваться игровые объекты:

Перечисление типов игровых объектов:

public enum Type

{= 0,= 1,= 2,= 3,

}

Функции:(Canvas canvas, Map map, int x, int y)- Конструктор классаvoid OnRestart() Действия при перезагрузке уровня

void UpdateThread() функция потока

virtual void Sleep() приостановка потока

void StartUpdate() старт потока

void HideImage(bool isHide) скрыть изображения

void SetZIndex(int index) задает z-индекс для изображения

void InitImage() Инициализирует изображение

void SetImage(String path) Задает изображение

void SetLocation(int x, int y) Перемещает объект в указанные координаты

Rect GetRect() возвращает параллельный осям ограничивающий прямоугольник объекта AABB (axis-aligned bounding box)

virtual void Move(Vector velocity) перемещает объект по заданному вектору скорости

virtual void Update() функция обновления для объектов с потоком

Type GetEntityType() возвращает тип объекта

abstract void Collision(Collision c) срабатывает при коллизии объекта

virtual void Destroy() уничтожает объект

void Stop() останавливает поток

Далее создадим класс Player и пронаслеуем его от Entity

функции:(Canvas canvas, Map map, MainWindow window, int x, int y)

: base(canvas, map, x, y) конструкторonLevelLoad() обработчик события LevelLoad UpdateImage() обновление изображения

void WallCollision() столкновение со стеной

void onKeyDown(object sender, KeyEventArgs e) обработчик нажатия клавишиonKeyUp(object sender, KeyEventArgs e) обработчик отпускания клавиши CheckDirection() проверяет можно ли двигаться дальше в заданном направлении

Результат:

Игрок перемещается по сцене по нажатию на клавиши.

        

         5.2 Разработка классов Enemy и Dot


Добавим класс Enemy. Класс врагов, перемещается в произвольных направлениях.

Enemy(Canvas canvas, Map map,int x, int y):base(canvas,map, x, y) onLevelLoad() Обработчик события загрузки уровня

void СheckSideDirecktion() проверяет боковые стороны для смены движения

void RandomSpeed() генерирует случайную скорость

так же добавим класс Dot - класс монетки. Исчезает при столкновении с игроком.

Dot(Canvas canvas, Map map, int x, int y, int width) конструкторvoid Collision(Collision c) обработка столкновений

         5.3 Разработка классов Wall и Map


Создадим классы которые будут рисовать лабиринт и управлять столкновениями.

Класс Wall менеджер лабиринта

void Draw() Рисует лабиринт по матрице

void DrawBlock(int x, int y) создает квадраты для блоков лабиринта

void DrawImage(int x, int y) создает тайлы для лабиринта

void HideSprites(bool isHide) скрывает изображенияGetIndex(int x) переводит координату в индекс

bool CheckCollision(Rect rect) проверяет пересечение прямоугольника со стеной

bool Intersect(Rect r1, Rect r2) проверяет пересечение 2х прямоугольников

Rect GetRect(int w, int h) возвращает прямоугольник эквивалентный индексу в массиве

List<Vector> CheckSides(Rect rect, Vector direction) возвращает список возможных направлений для смены направления движения.

int GetTail(int x, int y) приравнивает координаты к сетке

Класс Map Менеджер игровых объектов

Map(Canvas canvas, MainWindow parentWindow) конструктор класса

void LoadMap(String path) считывает уровень из файла

void Load(String path) загружает уровень

void AddChild(Entity entity) добавляет игровой объект на карту

void CreatePlayer(int x, int y) создает игрока

void CreateEnemy(int x, int y) создает врага

void CreateDot(int x, int y) создает монетку

bool IsEmpty(Rect r) проверяет прямоугольник на пересечение со стеной

void draw() создает и расставляет объекты на сцене

void InvokeEvent(MapEvent mapEvent) создает заданное событие

void PlayerDie() функция срабатывает при смерти игрока

void CollisionUpdate() проверка коллизий

void AddScore() срабатывает, когда игрок есть монетку

void CheckEntityCollision() проверяет столкновения между объектами

HideSprites(bool isHide) скрывает картинки

void ClearCollisions() скрывает прямоугольники, показывающие места столкновений

SolidColorBrush GetSolidBrush(Color color, float opacity = 0.3f) возвращает кисть с заданными параметрами

List<Vector> CheckNext(Rect rect, Vector direction) обертка для функции CheckSides() в классе Wall

Rect GetFlipping(Rect rect) приравнивает прямоугольник к сетке

Rect GetFlipping(Rect rect) Задает Rectangle размеры из Rect

Rectangle GetDebugRectangle(int index) достает Rectangle из пула объектов, либо создает новый, если свободных нет.

void Destroy() Уничтожает карту

Результат:

Объекты сталкиваются со стенами и между собой.

        

         5.4 Разработка прикладного окна


Разработка функционала окошка.

MainWindow() конструктор

void InitLevels() инициализирует уровни

void OnLevelLoad() обработчик события LevelLoad

void NextLevel() загрузка следующего уровня

void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) обработчик закрытия окна

void StartGameMenu_OnClick(object sender, RoutedEventArgs e) Обработчик меню «новая игра»

void DebugMenu_OnClick(object sender, RoutedEventArgs e) обработчик меню «скрыть спрайты»

void CollisionMenu_OnClick(object sender, RoutedEventArgs e) обработчик меню «показать коллизию»

void ExitMenu_OnClick(object sender, RoutedEventArgs e) обработчик меню «выход»

void AboutMenu_OnClick(object sender, RoutedEventArgs e) обработчик меню «Об игре»

void MenuRestart_OnClick(object sender, RoutedEventArgs e) обработчик меню «Рестарт»

void MenuLevel1_OnClick(object sender, RoutedEventArgs e) обработчик меню «Левел1»

void MenuLevel2_OnClick(object sender, RoutedEventArgs e) обработчик меню «Левел2»

void MenuLevel3_OnClick(object sender, RoutedEventArgs e) обработчик меню «Левел3»

void MenuCancel_OnClick(object sender, RoutedEventArgs e) обработчик меню «Сбросить»

void LoadLevel() Загрузка уровня

void UpdateHP() обновляет хп на экране

Результат:

Появилось оформление окна и меню.

рис 5.4.1 Окно игры

         5.5 Разработка собственных Exception и Логгера


Создадим класс LocalExeption для обработки собственных ошибок.

LocalExeption(string message):base(message) конструктор

Далее cсоздадим класс Logger который будет записывать ошибки в файл Log.txt

Logger() конструктор

static void Write(string str) Записывает сообщение в файл лога

static void Write(Exception e) Записывает содержание ошибки в файл лога

static void Open() открывает файл

static void Close() закрывает файл

После чего добавим конструкцию которая будет отлавливать пользовательские ошибки и записывать их в лог:

try

{

}(LocalExeption e)

{.Write(e);

}

        
6. Описание проблем, возникших при разработке программной системы


Поэтапная разработка программы позволила быстро разработать её и отладить. Проблем не было.

        

         7. Заключение


В ходе разработки приложения были закреплены навыки языка C#, а так же навыки поэтапной разработки программного обеспечения.

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


1.   Троелсен Э. Язык программирования C# 2010 и платформа .NET 4.0 Вильямс, 2010 -1392с

2.      Медведев В.И. Программирование на С++, C++.NET и С#: - Казань: Мастер Лайн, 2005. - 270 c.: ил. - (Серия «Современная прикладная математика и информатика»).

3.      Applications = Code + Markup: A Guide to the Microsoft® Windows® Presentation Foundation: A Guide to the Microsoft Windows Presentation Foundation (Developer Reference) Hardcover by Charles Petzold - September 13, 2006 -944 с

4.      Microsoft Documentation <https://msdn.microsoft.com/>

        

         Приложение 1. Диаграмма классов разработанной программы


         Приложение 2. Исходный код разработанной программы

.csSystem;System.Collections.Generic;System.Linq;System.Reflection;System.Text;System.Threading;System.Threading.Tasks;System.Windows;System.Windows.Controls;System.Windows.Controls.Primitives;System.Windows.Media;System.Windows.Media.Imaging;System.Windows.Shapes;System.Windows.Threading;wpfman

{class Entity

{enum Type

{= 0,= 1,= 2,= 3,

}Entity(Canvas canvas, Map map, int x, int y)

{

_map = map;

_canvas = canvas;.AddChild(this);();(x, y);

_startX = x;

_startY = y;= false;

}virtual void OnRestart()

{(_startX, _startY);

}void UpdateThread()

{(IsWorking)

{

_image.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new(() =>

{(this)

{

{();

}(LocalExeption e)

{.Write(e);

}

}

}));();

}.Write("End thread "+ GetEntityType());

}virtual void Sleep()

{.Sleep(20);

}void StartUpdate()

{= new Thread(UpdateThread);= true;.Start();

}void HideImage(bool isHide)

{

_image.Visibility = (isHide)?Visibility.Hidden : Visibility.Visible;

}void SetZIndex(int index)

{.SetZIndex(_image, index);

}void InitImage()

{

_image = new Image();= new ScaleTransform();.ScaleX = 1;= new RotateTransform();.Angle = 0;

_image.Stretch = Stretch.Fill;myTransformGroup = new TransformGroup();.Children.Add(Scale);.Children.Add(Rotation);

_image.RenderTransform = myTransformGroup;

_image.RenderTransformOrigin = new Point(0.5, 0.5);

_canvas.Children.Add(_image);

}void SetImage(String path)

Источник: https://www.bibliofond.ru/detail.aspx?id=868752

Смотрите также: