Лабы по ООП 2023 / Baraeva_Elizaveta_lb5
.docМИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В. И. Ульянова (Ленина)
Кафедра МО ЭВМ
отчет
по лабораторной работе №5
по дисциплине «Объектно-ориентированное программирование»
Тема: Отслеживание изменений
Студентка гр. 2383 |
|
Бараева Е. Н. |
Преподаватель |
|
Жангиров Т. Р. |
Санкт-Петербург
2023
Цель работы.
Создание двух классов для взаимодействия игрока с игрой: класс отслеживания изменений в игре, отвечающий за запуск отрисовки, и класс отрисовки игры, осуществляющий визуальное представление игры.
Задание.
а) Реализовать класс, который связывается с игрой, и отслеживает изменения в игре: перемещение игрока, победа или выигрыш, срабатывание событий. Данный класс должен реагировать на изменения и отрисовывать игровое поле, а также выводить информацию для игрока (например, предлагать начать новую игру).
б) При отрисовке поля должна считываться информация с поля и об игроке, и в зависимости от расположения происходит вывод представления поля в терминал. В представлении поля непроходимые клетки, игрок, события должны отображаться различными символами. Игрок, события, клетки и другие игровые сущности не должны знать ничего о том, каким символом они отрисовываются. За выбор символа отвечает класс выполняющий отрисовку
Примечания:
Класс отслеживания и класс отрисовки рекомендуется делать отдельными сущностями. Таким образом, класс отслеживания инициализирует отрисовку, и при необходимости можно заменить отрисовку (например, на GUI) без изменения самого отслеживания
При проверке типов события можно использовать dynamic_cast / typeinfo, либо сделать связывание модель-представление
Выполнение работы.
Class Looking
Класс отслеживания изменений в игре. Имеет два поля: Controller& controller – ссылка на контроллер игрока в игре для передачи его в методы класса отрисовки, Rendering* print_game – указатель на объект класса отрисовки.
Методы класса Looking:
Looking(Controller& controller, Rendering* rendering) – конструктор класса, принимающий ссылку на контроллер и указатель на объект класса отрисовки для инициализации соответствующих полей.
void operator()() – переопределение оператора () для объектов данного класса, вызывает соответствующий метод отрисовщика print_game.
void draw_menu() – вызывает соответствующий метод отрисовщика print_game.
void draw_death_menu() – вызывает соответствующий метод отрисовщика print_game.
void draw_winning_menu() – вызывает соответствующий метод отрисовщика print_game.
~read() – деструктор класса, очищающий память по указателю print_game.
Class Rendering
Класс отрисовщика игры, выводящую ее в консоль.
Методы класса Rendering:
void print_cell(Cell& cell) – если клетка не проходимая, то выводится ”#”, иначе вызывается метод print_event.
void print_event(Cell& cell) – если события в клетке нет, то выводится ” ”, иначе определяется тип события в клетке, и выводится соответствующий событию символ.
void print_field(Controller controller_to_print) – выводится верхняя часть рамки, затем левая граница, потом в цикле выводится само поле игры (используя метод print_cell), а там, где стоит игрок, выводится ”Х”, далее выводится правая граница рамки, а в конце ее низ.
void operator()(Controller controller_to_print) – вызывает метод print_field.
void print_menu() – выводит обычное меню.
void print_death_menu() – выводит посмертное меню.
void print_winning_menu() – выводит меню выигрыша.
Тестирование.
Результаты тестирования представлены в табл. 1.
Таблица 1 – Результаты тестирования
№ п/п |
Входные данные |
Выходные данные |
Комментарии |
1. |
|
|
Проверка передвижения. Верно. |
2. |
|
|
Проверка меню. Верно. |
Вывод.
Был реализован графический интерфейс игры с помощью двух классов: классом отслеживания изменений в игре, отвечающим за запуск отрисовки, и классом отрисовки игры, выводящим игру в консоль.
ПРИЛОЖЕНИЕ А ИСХОДНЫЙ КОД ПРОГРАММЫ
Название файла: Rendering.h
#ifndef OOP_RENDERING_H
#define OOP_RENDERING_H
#include "Controller.h"
#include "Interface.h"
class Rendering {
public:
void print_cell(Cell& cell);
void print_event(Cell& cell);
void print_field(Controller controller_to_print);
void operator()(Controller controller_to_print);
void print_menu();
void print_death_menu();
void print_winning_menu();
};
#endif //OOP_RENDERING_H
Название файла: Rendering.cpp
#include "Rendering.h"
void Rendering::print_cell(Cell& cell) {
if (!cell.GetPassability())
std::cout << "# ";
else
print_event(cell);
}
void Rendering::print_event(Cell& cell) {
if (cell.GetEvent() == nullptr)
std::cout << " ";
else {
if (typeid(*cell.GetEvent()) == typeid(BadEvent))
std::cout << "* ";
if (typeid(*cell.GetEvent()) == typeid(GoodEvent))
std::cout << "+ ";
if (typeid(*cell.GetEvent()) == typeid(MovementEvent))
std::cout << "> ";
}
}
void Rendering::print_field(Controller control) {
control.ShowCharacteristics();
std::cout << "+";
for (int i = 0; i < control.GetLength() * 2 + 1; i++)
std::cout << "-";
std::cout << "+\n";
for (int i = 0; i < control.GetHeight(); i++) {
std::cout << "| ";
for (int j = 0; j < control.GetLength(); j++) {
if (control.GetCoordinates().x == j && control.GetCoordinates().y == i)
std::cout << "X ";
else
print_cell(control.GetCell(j, i));
}
std::cout << "|\n";
}
std::cout << "+";
for (int i = 0; i < control.GetLength() * 2 + 1; i++)
std::cout << "-";
std::cout << "+\n";
}
void Rendering::operator()(Controller controller_to_print) {
print_field(controller_to_print);
}
void Rendering::print_menu() {
system("cls");
printf("+---------+\n"
"| pause |\n"
"| quit |\n"
"| restart |\n"
"+---------+");
}
void Rendering::print_death_menu() {
system("cls");
printf("+---------+\n"
"| quit |\n"
"| restart |\n"
"+---------+");
}
void Rendering::print_winning_menu() {
system("cls");
printf("+---------+\n"
"| You win |\n"
"+---------+");
printf("\nPress any key...");
}
Название файла: Looking.h
#include "Rendering.h"
class Looking {
private:
Controller& controller;
Rendering* print_game;
public:
Looking(Controller& controller, Rendering* rendering);
void operator()();
void draw_menu();
void draw_death_menu();
void draw_winning_menu();
~Looking();
};
Название файла: Looking.cpp
#include "Looking.h"
Looking::Looking(Controller& controller, Rendering* rendering) : controller(controller), print_game(rendering) {}
void Looking::operator()(){
print_game->operator()(controller);
}
void Looking::draw_menu(){
print_game->print_menu();
}
void Looking::draw_death_menu(){
print_game->print_death_menu();
}
void Looking::draw_winning_menu(){
print_game->print_winning_menu();
}
Looking::~Looking(){
delete print_game;
print_game = nullptr;
}
