Лабы по ООП 2023 / Baraeva_Elizaveta_lb1
.docМИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В. И. Ульянова (Ленина)
Кафедра МО ЭВМ
отчет
по лабораторной работе №1
по дисциплине «Объектно-ориентированное программирование»
Тема: Создание классов
Студентка гр. 2383 |
|
Бараева Е. Н. |
Преподаватель |
|
Жангиров Т. Р. |
Санкт-Петербург
2023
Цель работы.
Создание класса игрока с характеристиками и методов для работы с характеристиками, а также создание класса, который будет следить за передвижением игрока по карте.
Задание.
а) Создать класс игрока. У игрока должны быть поля, которые определяют его характеристики, например кол-во жизней, очков и т.д. Также в классе игрока необходимо реализовать ряд методов для работы с его характеристиками. Данные методы должны контролировать значения характеристик (делать проверку на диапазон значений).
б) Создать класс, передвигающий игрока по полю и работу с характеристиками. Данный класс всегда должен знать об объекте игрока, которым управляет, но не создавать класс игрока. В следующих лаб. работах данный класс будет проводить проверку, может ли игрок совершить перемещение по карте.
Примечания:
Не забывайте для полей и методов определять модификатор доступа
Для указания направления движения можно использовать перечисление enum или дополнительную систему классов. Использования чисел или строк является для указания направления является плохой практикой
Делать отдельный метод под каждое направление делает класс перегруженным, и в будущем ограничивает масштабирование класса
Выполнение работы.
Class Player
В данном классе были созданы приватные поля характеристик игрока: health, strength, endurance. Также был объявлен конструктор, который выставляет значения по умолчанию в приватные поля. Для взаимодействия с характеристиками у класса есть геттеры: GetHealth, GetStrength, GetEndurance, возвращающие значения поля, и сеттеры: SetHealth, SetStrength, SetEndurance, принимающие какое-то значение и присваивающие его соответствующему приватному полю, а также есть метод вывода характеристик на экран (ShowCharacteristics) для информирования игрока.
Class Controller
Перед классом были созданы: enum Directions, в котором перечислены направления движений, структура Coordinates для удобного хранения координат.
В данном классе были созданы приватные поля для координат и ссылка на игрока. Также был объявлен конструктор, который инициализирует поля переданными данными. Еще был создан метод Move, принимающий направление, в зависимости от которого изменялись координаты игрока с помощью switch-case. Метод GetCoordinates возвращает структуру координат. Методы ShiftHealth, ShiftStrength, ShiftEndurance принимают какое-то значение, проверяют, находится ли в границах допустимого значение поля игрока плюс сдвиг, и присваивают эту сумму соответствующему полю игрока. Также есть метод Alive, он проверят, жив ли игрок в донный момент, и возвращает True или False.
Все методы и конструкторы классов были вынесены в соответствующие cpp-файлы.
Разработанный программный код см. в приложении А.
Тестирование.
Результаты тестирования представлены в табл. 1.
Таблица 1 – Результаты тестирования
№ п/п |
Входные данные |
Выходные данные |
Комментарии |
1. |
Player p; std::cout << p.GetStrength() << ' ' << p.GetEndurance() << ' ' << p.GetHealth() << std::endl << std::endl; p.ShowCharacteristics(); std::cout << std::endl; p.SetHealth(-1000); p.SetEndurance(-25); p.SetStrength(12); p.ShowCharacteristics(); |
10 100 100
ХАРАКТЕРИСТИКИ ПЕРСОНАЖА Здоровье: 100 Сила: 10 Выносливость: 100
ХАРАКТЕРИСТИКИ ПЕРСОНАЖА Здоровье: 0 Сила: 22 Выносливость: 75 |
Проверка создания класса Player, проверка методов класса. Верно. |
2. |
Player p; Movement m(p, {10, 15}); m.Move(0); m.Move(2); std::cout << m.GetCoordinates().x << " " << m.GetCoordinates().y << std::endl; m.Move(1); m.Move(3); std::cout << m.GetCoordinates().x << " " << m.GetCoordinates().y << std::endl; |
9 14 10 15 |
Проверка создания класса Movement, проверка изменения координат. Верно. |
Вывод.
Были изучены основы объектно-ориентированно программирования, создан класса игрока с методами, изменяющими его характеристики, а также создан класс передвижения, который будет отвечать за перемещение игрока.
ПРИЛОЖЕНИЕ А ИСХОДНЫЙ КОД ПРОГРАММЫ
Название файла: Player.h
#ifndef OOP_PLAYER_H
#define OOP_PLAYER_H
class Player {
private:
int health;
int strength;
int endurance;
public:
Player();
int GetHealth() const;
int GetStrength() const;
int GetEndurance() const;
void SetHealth(int value);
void SetStrength(int value);
void SetEndurance(int value);
void ShowCharacteristics() const;
};
#endif //OOP_PLAYER_H
Название файла: Player.cpp
#include <iostream>
#include "Player.h"
Player::Player(): health{100}, strength{10}, endurance{100} {}
int Player::GetHealth() const{
return health;
}
int Player::GetStrength() const{
return strength;
}
int Player::GetEndurance() const{
return endurance;
}
void Player::SetHealth(int value){
health = value;
}
void Player::SetStrength(int value){
strength = value;
}
void Player::SetEndurance(int value){
endurance = value;
}
void Player::ShowCharacteristics() const{
printf("ХАРАКТЕРИСТИКИ ПЕРСОНАЖА\nЗдоровье: %d\nСила: %d\nВыносливость: %d\n", health, strength, endurance);
}
Название файла: Controller.h
#ifndef OOP_CONTROLLER_H
#define OOP_CONTROLLER_H
#include "Player.h"
enum Directions {up, down, left, right};
struct Coordinates{
int x;
int y;
};
class Controller {
private:
Player &player;
Coordinates coordinates;
public:
Controller(Player &plr, Coordinates coord);
Coordinates GetCoordinates() const;
void Move(int direction);
void ShiftHealth(int value);
void ShiftStrength(int value);
void ShiftEndurance(int value);
bool Alive();
};
#endif //OOP_CONTROLLER_H
Название файла: Controller.cpp
#include "Controller.h"
#define MIN_LIM 0
#define MAX_LIM 100
Controller::Controller(Player &plr, Coordinates coord): player{plr}, coordinates{coord} {}
void Controller::Move(int direction){
switch (direction){
case up:
coordinates.y--;
break;
case down:
coordinates.y++;
break;
case left:
coordinates.x--;
break;
case right:
coordinates.x++;
}
}
Coordinates Controller::GetCoordinates() const{
return {coordinates.x, coordinates.y};
}
void Controller::ShiftHealth(int value){
int temporary_health = player.GetHealth() + value;
if(temporary_health < MIN_LIM)
player.SetHealth(MIN_LIM);
else{
if(temporary_health >= MAX_LIM)
player.SetHealth(MAX_LIM);
else
player.SetHealth(temporary_health);
}
}
void Controller::ShiftStrength(int value){
int temporary_strength = player.GetStrength() + value;
if(temporary_strength < MIN_LIM)
player.SetStrength(MIN_LIM);
else{
if(temporary_strength >= MAX_LIM)
player.SetStrength(MAX_LIM);
else
player.SetStrength(temporary_strength);
}
}
void Controller::ShiftEndurance(int value){
int temporary_endurance = player.GetEndurance() + value;
if(temporary_endurance < MIN_LIM)
player.SetEndurance(MIN_LIM);
else{
if(temporary_endurance >= MAX_LIM)
player.SetEndurance(MAX_LIM);
else
player.SetEndurance(temporary_endurance);
}
}
bool Controller::Alive(){
if(player.GetHealth())
return true;
return false;
}
