Скачиваний:
0
Добавлен:
09.09.2026
Размер:
316 Кб
Скачать

МИНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В. И. Ульянова (Ленина)

Кафедра МО ЭВМ

отчет

по лабораторной работе №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;

}

8

Соседние файлы в папке Лабы по ООП 2023