Главная страница
Навигация по странице:

  • Курсовой проект по дисциплине «Программирование» Тема: «Реализация игры Догонялки»

  • З А Д А Н И Е на курсовой проект Дисциплина

  • Тема

  • Сроки выполнения работы по календарному плану*

  • Требования к оформлению

  • Догонялки. Курсовая Догонялки. Курсовой проект по дисциплине Программирование


    Скачать 221.28 Kb.
    НазваниеКурсовой проект по дисциплине Программирование
    АнкорДогонялки
    Дата14.03.2023
    Размер221.28 Kb.
    Формат файлаdocx
    Имя файлаКурсовая Догонялки.docx
    ТипКурсовой проект
    #989159


    5МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ

    Федеральное государственное бюджетное образовательное учреждение

    высшего образования

    «Восточно-Сибирский государственный университет технологий и управления»
    Электротехнический факультет

    Кафедра систем информатики

    Курсовой проект

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

    Тема: «Реализация игры Догонялки»


    Выполнил: студент гр. Б650

    Солнцев Я.С.

    Руководитель: к.п.н., доцент каф. СИ

    Чимитова Е.Г.

    Оценка: ___________

    Дата защиты: ___________


    Улан-Удэ, 2021

    ВОСТОЧНО-СИБИРСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

    ТЕХНОЛОГИЙ И УПРАВЛЕНИЯ
    ЭЛЕКТРОТЕХНИЧЕСКИЙ ФАКУЛЬТЕТ

    Кафедра систем информатики

    ,

    З А Д А Н И Е

    на курсовой проект

    Дисциплина: Программирование

    Тема: Реализация игры Догонялки

    Исполнитель: Солнцев Ярослав Сергеевич

    Руководитель: к.п.н., доцент каф. СИ Чимитова Елена Гендуновна

    Краткое содержание проекта: данная курсовая работа посвящена написанию

    игры под названием Догонялки,




    1. Теоретическая часть: Словесная постановка задачи, оригинальная игра,

    отличия от оригинала, искусственный интеллект

    2. Практическая часть: Формальная постановка задачи, UML модель,

    алгоритм решения задачи, автомат в качестве искусственного интеллекта,

    реализация и тестирование игры

    Сроки выполнения работы по календарному плану*:

    Этап 1. Теоретический раздел – 15% к 4 неделе.

    Этап 2. Основной раздел. Проектирование – 25% к 6 неделе.

    Этап 3. Основной раздел. Кодирование – 50% к 8 неделе.

    Этап 4. Экспериментальный раздел – 80% к 12 неделе.

    Этап 5. Защита – 100 % к 16 неделе.




    Требования к оформлению:

    1. Отчет по курсовой работе должен быть представлен в электронной и твердой копиях.

    2. Объем отчета должен быть не менее 20 машинописных страниц без учета приложений.

    3. Отчет оформляется по ГОСТ 7.32-2017.


    Руководитель работы ___________ Чимитова Е.Г.

    Исполнитель ______ Солнцев Я.С.

    Дата выдачи "__" _______ 2021 г.

    Аннотация

    В данной курсовой работе рассмотрены вопросы применения объектно – ориентированного программирования для решения графической задачи на примере разработки приложения – игра в «догонялки». Задача реализуется на языке программирования Borland C++.

    В курсовой работе используются следующие сокращения:

    ООП – Объектно – ориентированное программирование.

    ПО – Программное обеспечение.

    Работа содержит:

    Рисунков – 5

    Листов машинописного текста – 23

    Библиографических источников – 5

    Приложений – 1

    Ключевые слова: С++, наследование, инкапсуляция, полиморфизм, догонялки, игра, потомок, родитель, класс, объект, ООП.

    СОДЕРЖАНИЕ

    ВВЕДЕНИЕ 5

    ВВЕДЕНИЕ


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

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

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

    Язык ООП должен обладать следующими свойствами:

    1. Инкапсуляции – механизма, связывающего вместе код и данные, которыми он манипулирует, и защищающего их от внешних помех и некорректного использования.

    2. Наследования – процесса, с помощью которого один объект приобретает свойства другого, т.е. поддерживается иерархической классификации.

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


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

    1. Определение основных объектов

    2. Определение закрытых данных для выбранных объектов

    3. Определение второстепенных объектов и их закрытых данных

    4. Определение иерархической системы классов, представляющих выбранные объекты

    5. Определение ключевых сообщений, которые должны обрабатывать объекты каждого класса

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

    7. Разработка методов, обрабатывающих каждое сообщение.

    8. Очистка проекта, то есть устранение всех вспомогательных промежуточных материалов, использовавшихся при проектировании

    9. Кодирование, отладка, компоновка и тестирование.

    Объектно – ориентированное программирование позволяет программисту моделировать объекты определённой предметной области путем программирования их содержания и поведения в пределах класса.

    Конструкция «класс» обеспечивает механизм инкапсуляции для реализации абстрактных типов данных. Инкапсуляция, как бы скрывает и подробности внутренней реализации типов, и внешние операции, и функции, допустимые для выполнения над объектами этого типа.

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

    «Охотник» в свою очередь оценивает ситуацию и пытается догнать «компьютер». Также созданы несколько препятствий прямоугольной формы. При достижении границ экрана или препятствий, новое направление выбирается произвольно (случайным образом) из возможных. После запуска программы его выполнение начинается автоматически. Игра считается законченной только в том случаи, когда объекты «компьютер» и «охотник» столкнутся между собой.


    1. Анализ задачи

    Целью данной курсовой работы является создание игры в «догонялки» с понятным пользователю интерфейсом. При выборе языка программирования для решения поставленной задачи следует также учитывать следующие обстоятельства:

    • скорость программы;

    • ожидаемый размер памяти, занимаемой программой во время работы;

    • типы данных, с которыми приходится иметь дело;

    • возможность использования стандартных библиотек и функций;

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

    С++ – это универсальный язык программирования, задуман­ный так, чтобы сделать программирование более приятным для разработчика. За исключением второстепенных дета­лей С++ является надмножеством языка программирования C. По­мимо возможностей, которые дает C, С++ предоставляет гибкие и эффективные средства определения новых типов.

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

    В программе создан объект прямоугольной формы. Этот объект реализован с помощью класса. Данный класс называется Robot, и он является базовым классом.

    От базового класса при помощи наследования созданы 2 производных класса – это RobotComp (робот – компьютер) и RobotUser(робот – охотник). Наследование, позволяет создавать классы потомки, которые наследуют все свойства и методы базового класса и имеют также набор своих свойств и методов.

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

    Отличительными чертами потомков базового класса являются цвет и скорость. Скорость у объекта «робот – компьютер» выше, чем у объекта «робот – охотник», чтобы у компьютера была возможность убежать от своего охотника. Охотник в свою очередь оценивает ситуацию и пытается всячески догнать компьютер. Охотнику не позволено сталкиваться с препятствиями и выходить за границы экрана. Объект, закрашенный синим цветом, является компьютером, а пользовательский объект закрашен оранжевым цветом.

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

    После запуска программы его выполнение начинается автоматически. Игра считается законченной только в том случаи, когда объекты «компьютер» и «охотник» столкнутся между собой.

    1. Проектирование классов


    В данной курсовой работе были разработаны следующие классы:

    1. Имя класса Robot.

    Ответственность:

    Базовый класс (родитель), задает точки x, y, цвет и скорость.

    Атрибуты класса:

    Координаты класса – x, y (int)

    Координаты прироста скорости по x и y – dx, dy (int)

    Цвет – color (int)

    Функции класса:

    Конструктор с параметрами – Robot(int, int)

    Функция проверки столкновения с другими объектами – int collision()

    Функция рисования – void draw()

    Деструктор – Robot()

    1. Имя класса RobotComp.

    Ответственность:

    Производный класс (потомок) от базового класса Robot. Основной целью является движение и обход препятствий.

    Атрибуты класса унаследованы у родителя.

    Функции класса:

    Конструктор с параметрами – RobotComp(int, int)

    Функция движения и обхода препятствий – void update()

    Деструктор по умолчанию – RobotComp()

    1. Имя класса RobotUser.

    Ответственность:

    Производный класс (потомок) от базового класса Robot. Основной целью является догнать RobotComp и обход препятствий.

    Атрибуты класса унаследованы у родителя.

    Функции класса:

    Конструктор с параметрами – RobotUser(int, int)

    Функция движения за RobotComp – void update(RobotComp* comp);

    Деструктор по умолчанию – RobotUser()

    1. Имя класса Item.

    Ответственность:

    Создание препятствий.

    Атрибуты класса:

    Координаты препятствий – x,y (int)

    Функции класса:

    Конструктор с параметрами – Item(int, int)

    Функция рисования препятствий – void draw()

    Деструктор по умолчанию – Item()
    Ниже на рис. 1 приведена иерархия классов, где от базового класса Robot создаются 2 потомка – RobotComp и RobotUser наследуя свойства у родителя. Класс Item, необходимый для создания препятствий, в данном случаи является независимым от других классов.


    Независимый класс Item

    Производный класс RobotUser

    Производный класс RobotComp

    Базовый класс Robot


    Рис.1 Иерархия классов



    1. Программирование задачи

    Синтаксис объявления класса в языке С++ в общем случае следующий:

    class <имя класса>

    { элементы класса

    <метка видимости>:< элементы класса>

    } объекты класса;
    В программе был создан базовый класс Robot:

    class Robot // Базовый класс

    { public: // Метка видимости

    int x, y; // Точки x и y

    int dx, dy; // Точки dx и dy (прирост скорости по x и y)

    int color; // Цвет

    public: // Метка видимости

    Robot(int _x, int _y); // Конструктор с параметрами

    int collision(); // Функция проверки столкновения с другими объектами

    void draw(); // Функция рисования

    Robot(){} // Деструктор по умолчанию

    };

    Также созданы 2 производных класса – RobotComp и RobotUser. Синтаксис объявления производного класса при простом наследовании следующий:

    class <имя базового класса>

    {<…>};

    class <имя производного класса> : <спецификатор доступа> <имя базового класса>

    {<…>};
    class RobotComp : public Robot // Производный класс от базового

    {public: // Метка видимости

    RobotComp(int _x, int _y); // Конструктор с параметрами

    void update(); // Функция движения и обхода препятствий

    RobotComp(){} // Деструктор по умолчанию

    };
    class RobotUser : public Robot // Производный класс от базового

    {public: // Метка видимости

    RobotUser(int _x, int _y); // Конструктор с параметрами

    void update(RobotComp* comp); // Функция движения и обхода препятствий

    RobotUser(){} // Деструктор по умолчанию

    };
    Создан один независимый класс Item:

    class Item // Независимый класс

    {public: // Метка видимости

    int x, y; // Точки x и y

    Item(int _x, int _y); // Конструктор с параметрами

    void draw(); // Функция рисования

    Item(){} // Деструктор по умолчанию

    };
    Полный текст программы приведен в приложении.



      1. Заголовочные файлы


    При написании программы были подключены заголовочные файлы. Все заголовочные файлы подключены с помощью директивы <#include> препроцессора языка C++.

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

    1. bar (int left, int top, int right, int bottom) – рисует двухмерный заполненный прямоугольник.

    2. setfillstyle (int pattern, int color) – устанавливает текущие цвет и шаблон заполнения.

    3. closegraph() – освобождает всю память,выделенную под графическую систему, затем восстанавливает экран в режим, который был до вызова initgraph.

    4. initgraph (int driver, int mode, char path) инициализирует графическую систему путем загрузки графического драйвера с диска и переводит систему в графический режим.

    5. cleardevice() – cтирает (это значит – зарисовывает текущим цветом фона) весь графический экран.

    6. getmaxx() – возвращает максимальное (относительно экрана) значение х для текущего драйвера и режима.

    7. getmaxy() – возвращает максимальное (относительно экрана) значение y для текущего драйвера и режима.

    – Заголовочный файл стандартной библиотеки языка С, который содержит в себе функции, занимающиеся выделением памяти, контроль процесса выполнения программы, преобразования типов и другие. Данный заголовочный файл был необходим для использования функции rand(), которая возвращает псевдослучайное число, и srand() – для инициализации некоторых различных значений функцией time. Значение, возвращенное функцией time отличается каждую секунду, что дает возможность получать совершенно случайные последовательности чисел, при каждом новом вызове функции rand.

    – Стандартный заголовочный файл стандартной библиотеки языка С, содержащий определения макросов, константы и объявления функций и типов, используемых для различных операций стандартного ввода и вывода. Из этого заголовочного файла использована функция вывода printf(), которая выполняет вывод сообщения.

    – Заголовочный файл, используемый в старых компиляторах, работающих в операционных системах MS – DOS, для создания текстового интерфейса пользователя. Этот заголовочный файл объявляет несколько библиотечных функций для работы с «консольным вводом и выводом» программы. Этот заголовочный файл был необходим для использования функции getch(), которая читает один символ, непосредственно с консоли, без вывода его на экран.

    – Заголовочный файл, включающий в себя функции интерфейса DOS. Из данного заголовочного файла использована функция delay (time), которая замораживает выполнение программы на интервал в микросекундах.


    1. Тестирование


    Чтобы полностью проверить корректность работы программы и соответствие заданным требованиям нужно провести тестирование. Тестирование ПО – это процесс исследования программного обеспечения с целью получения информации о качестве продукта.

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

    Ниже приведены несколько скриншотов работы программы.

    На рис. 2 представлен скриншот программы после его запуска.



    Рис. 2 Ирга в «догонялки» после запуска.

    На рисунке видно, что объект синего цвета это «робот – компьютер», а оранжевого цвета – «робот – охотник». Есть также 3 препятствия прямоугольной формы.

    На рис. 3 видно, что объекты изменили свое начальное положение, а значит, что объекты движутся, как предусмотрено в задании.



    Рис. 3 Ирга в «догонялки». Движение и обход препятствий.

    На рис. 4 показано, как в одном из случаев при достижении препятствий, «робот компьютер» выбирает свое направление (случайным образом).



    Рис. 4 Ирга в «догонялки». Выбор направления.

    После того, как произойдет столкновение этих объектов, выполнение игры заканчивается (рис 5.).


    Рис. 5 Ирга в «догонялки». Столкновение объектов.

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

    При желании можно усовершенствовать данный программный продукт.

    Заключение
    В данной курсовой работе была спроектирована и разработана программа для реализации игры в «догонялки». Программа была создана на языке программирования С++, который предоставляет наилучшие возможности для реализации программ на основе методов объектно-ориентированного программирования.

    Программа разрабатывалась с использованием объектно – ориентированного подхода, поэтому при ее реализации были использованы классы. Такое свойство объектно – ориентированного подхода как наследование помогло в значительной степени упростить написание программы.

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

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

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

    Список литературы


    1. Конспект лекций по дисциплине «Объектно – ориентированное

    программирование», 2013.

    1. С/С++. Программирование на языке высокого уровня / Т.А.Павловская. – СПб.: Питер, 2002. – 464 с.

    2. Фридман А. Л. Основы объектно – ориентированного программирования на языке С++. – М.: Горячая линия – Телеком, Радио и связь, 1999. – 208 с.

    3. Интернет сайт «Википедия» http://ru.wikipedia.org

    4. Интернет сайт «Клуб программистов» http://programmersforum.ru

    Приложение
    #include

    #include

    #include

    #include

    #include

    int maxX, maxY, run;

    class Robot

    {

    public:

    int x, y;

    int dx, dy;

    int color;

    public:

    Robot(int _x, int _y);

    int collision();

    void draw();

    Robot(){}

    };

    Robot::Robot(int _x, int _y) {

    x = _x;

    y = _y;

    }

    int Robot::collision() {

    int cx = 100;

    int cy = 340;

    if (x + 20 > cx && x < cx + 80) {

    if (y + 20 > cy && y < cy + 20) {

    dx = -dx;

    dy = -dy;

    return 1;

    }

    }

    cx = 200;

    cy = 100;

    if (x + 20 > cx && x < cx + 80) {

    if (y + 20 > cy && y < cy + 20) {

    dx = -dx;

    dy = -dy;

    return 1;

    }

    }

    cx = 500;

    cy = 200;

    if (x + 20 > cx && x < cx + 80) {

    if (y + 20 > cy && y < cy + 20) {

    dx = -dx;

    dy = -dy;

    return 1;

    }

    }

    return 0;

    }

    void Robot::draw() {

    setfillstyle(1, color);

    bar(x, y, x + 20, y + 20);

    }
    class RobotComp : public Robot

    {

    public:

    RobotComp(int _x, int _y);

    void update();

    RobotComp(){}

    };

    RobotComp::RobotComp(int _x, int _y) : Robot(_x, _y) {

    dx = 4;

    dy = 3;

    color = 1;

    }

    void RobotComp::update() {

    x += dx;

    y += dy;

    if (x + 20 >= maxX || x < 0) {

    if (dx < 0) {

    x = 0;

    dx = rand() % 6 + 1;

    }

    else {

    dx = -(rand() % 6 + 1);

    x = maxX - 20;

    }

    dy = rand() % 6 - 5;

    }

    if (y + 20 >= maxY || y < 0) {

    dx = rand() % 6 - 5;

    if (dy < 0) {

    y = 0;

    dy = rand() % 6 + 1;

    }

    else {

    y = maxY - 20;

    dy = -(rand() % 6 + 1);

    }

    }

    collision();

    }
    class RobotUser : public Robot

    {

    public:

    RobotUser(int _x, int _y);

    void update(RobotComp* comp);

    RobotUser(){}

    };

    RobotUser::RobotUser(int _x, int _y) : Robot(_x, _y) {

    dx = 1;

    dy = 2;

    color = 6;

    }

    void RobotUser::update(RobotComp* comp) {

    int cx = comp->x;

    int cy = comp->y;

    if (x + 20 > cx && x < cx + 20) {

    if (y + 20 > cy && y < cy + 20) {

    run = 0;

    return;

    }

    }

    x += dx;

    if (collision() == 0) y += dy;

    if (x + 20 >= maxX || x < 0) {

    dx = -dx;

    }

    if (y + 20 >= maxY || y < 0) {

    dy = -dy;

    }

    if (x - cx < 0) dx = 2;

    else dx = -1;

    if (y - cy < 0) dy = 2;

    else dy = -1;

    if (collision() == 1) x += 5;

    }
    class Item

    {

    public:

    int x, y;

    Item(int _x, int _y);

    void draw();

    Item(){}

    };

    Item::Item(int _x, int _y) {

    x = _x;

    y = _y;

    }

    void Item::draw() {

    setfillstyle(1, 7);

    bar(x, y, x + 100, y + 20);}

    Item *item1, *item2, *item3;
    int main() {

    int gdriver = DETECT, gmode, errorcode;

    initgraph(&gdriver, &gmode, "");

    errorcode = graphresult();

    if (errorcode != grOk) {

    printf("Graphics error: %s\n", grapherrormsg(errorcode));

    printf("Press any key to halt:");

    getch();

    exit(1);

    }

    maxX = getmaxx();

    maxY = getmaxy();

    srand(time(0));

    item1 = new Item(100, 340);

    item2 = new Item(200, 100);

    item3 = new Item(500, 200);

    RobotComp* comp = new RobotComp(80, 50);

    RobotUser* user = new RobotUser(20, 20);

    run = 1;

    while (run == 1) {

    comp->update();

    user->update(comp);

    cleardevice();

    comp->draw();

    user->draw();

    item1->draw();

    item2->draw();

    item3->draw();

    delay(30);

    }

    getch();

    closegraph();

    return 0;




    написать администратору сайта