From e4a76f41ddeed958151ec0ea291da958acc29ed8 Mon Sep 17 00:00:00 2001 From: Lukas Jiriste Date: Fri, 18 Oct 2024 12:21:42 +0200 Subject: [PATCH] Add solution to ex01 --- ex01/ClapTrap.cpp | 82 +++++++++++++++++++++++++++++++++++++++++++++++ ex01/ClapTrap.h | 26 +++++++++++++++ ex01/Makefile | 54 +++++++++++++++++++++++++++++++ ex01/ScavTrap.cpp | 48 +++++++++++++++++++++++++++ ex01/ScavTrap.h | 23 +++++++++++++ ex01/main.cpp | 29 +++++++++++++++++ 6 files changed, 262 insertions(+) create mode 100644 ex01/ClapTrap.cpp create mode 100644 ex01/ClapTrap.h create mode 100644 ex01/Makefile create mode 100644 ex01/ScavTrap.cpp create mode 100644 ex01/ScavTrap.h create mode 100644 ex01/main.cpp diff --git a/ex01/ClapTrap.cpp b/ex01/ClapTrap.cpp new file mode 100644 index 0000000..390ca63 --- /dev/null +++ b/ex01/ClapTrap.cpp @@ -0,0 +1,82 @@ +#include "ClapTrap.h" +#include +#include + +ClapTrap::ClapTrap(std::string name): + m_name(name), m_hp(10), m_energy(10), m_attack(0) +{ + std::cout << "ClapTrap " << m_name << " has spawned.\n"; +} + +ClapTrap::ClapTrap(const ClapTrap &other) +{ + std::cout << "ClapTrap " << m_name << " has spawned.\n"; + *this = other; +} + +ClapTrap::~ClapTrap() +{ + std::cout << "ClapTrap " << m_name << " has despawned.\n"; +} + +ClapTrap &ClapTrap::operator=(const ClapTrap &other) +{ + if (this == &other) + return (*this); + m_name = other.m_name; + m_hp = other.m_hp; + m_energy = other.m_energy; + m_attack = other.m_attack; + return (*this); +} + +void ClapTrap::attack(const std::string &target) +{ + if (m_hp == 0) + std::cout << "ClapTrap " << m_name + << " is dead, hence cannot attack.\n"; + else if (m_energy == 0) + std::cout << "ClapTrap " << m_name + << " does not have enough energy to attack.\n"; + else + { + std::cout << "ClapTrap " << m_name + << " attacks " << target << " and deals " << m_attack << " damage.\n"; + --m_energy; + } +} + +void ClapTrap::takeDamage(unsigned int amount) +{ + if (m_hp == 0) + std::cout << m_name << + " is already dead and cannot be damaged further.\n"; + else if (amount >= m_hp) + { + std::cout << m_name + << " takes " << amount << " damage and dies\n"; + m_hp = 0; + } + else + { + std::cout << m_name + << " takes " << amount << " damage.\n"; + m_hp -= amount; + } +} + +void ClapTrap::beRepaired(unsigned int amount) +{ + if (m_hp == 0) + std::cout << m_name + << " is dead, hence cannot repair itself.\n"; + else if (m_energy == 0) + std::cout << m_name + << " does not have enough energy to repair itself.\n"; + else + { + std::cout << m_name + << " repairs iself for " << amount << " hit points.\n"; + m_hp += amount; + } +} diff --git a/ex01/ClapTrap.h b/ex01/ClapTrap.h new file mode 100644 index 0000000..59e7d33 --- /dev/null +++ b/ex01/ClapTrap.h @@ -0,0 +1,26 @@ +#ifndef CLAPTRAP_H +# define CLAPTRAP_H + +# include + +class ClapTrap +{ + protected: + std::string m_name; + unsigned int m_hp; + unsigned int m_energy; + unsigned int m_attack; + + public: + ClapTrap(std::string name = "DEFAULT"); + ClapTrap(const ClapTrap &other); + ~ClapTrap(); + + ClapTrap &operator=(const ClapTrap &other); + + void attack(const std::string &target); + void takeDamage(unsigned int amount); + void beRepaired(unsigned int amount); +}; + +#endif // CLAPTRAP_H diff --git a/ex01/Makefile b/ex01/Makefile new file mode 100644 index 0000000..d0e1e0e --- /dev/null +++ b/ex01/Makefile @@ -0,0 +1,54 @@ +CC := c++ +CFLAGS = -std=c++98 -Wall -Wextra -Werror -Wpedantic + +ifneq ("$(wildcard .debug)","") + CFLAGS += -g +endif + +RM := rm -f + +INCDIR := inc +INCDIR += $(addsuffix /inc, $(SUBPROJECTS)); +ifneq ($(INCLUDE),) + INCLUDE := $(addprefix -I, $(INCDIR)) +endif + +SRCDIR := . + +SOURCES := main.cpp \ + ClapTrap.cpp \ + ScavTrap.cpp \ + +SOURCES := $(addprefix $(SRCDIR)/, $(SOURCES)) + +OBJECTS := $(SOURCES:.cpp=.o) + +NAME := scavtrap + +all : $(NAME) + +debug : .debug + $(MAKE) all + +nodebug : + $(RM) .debug + $(MAKE) re + +.% : + $(MAKE) shallow_fclean + touch $@ + +$(NAME) : $(OBJECTS) + $(CC) $(CFLAGS) -o $@ $^ $(LINKS) + +%.o : %.cpp + $(CC) $(CFLAGS) -o $@ -c $< $(INCLUDE) + +clean : + $(RM) $(OBJECTS) + +fclean : clean + $(RM) $(NAME) + +re : fclean + $(MAKE) all diff --git a/ex01/ScavTrap.cpp b/ex01/ScavTrap.cpp new file mode 100644 index 0000000..63fcf58 --- /dev/null +++ b/ex01/ScavTrap.cpp @@ -0,0 +1,48 @@ +#include "ScavTrap.h" +#include "ClapTrap.h" +#include +#include + +ScavTrap::ScavTrap(std::string name): ClapTrap(name) +{ + std::cout << "ScavTrap " << m_name << " has spawned.\n"; + m_hp = 100; + m_energy = 50; + m_attack = 20; + m_is_guading = 0; +} + +ScavTrap::ScavTrap(const ScavTrap &other) +{ + *this = other; +} + +ScavTrap::~ScavTrap() +{ + std::cout << "ScavTrap " << m_name << " has despawned.\n"; +} + +ScavTrap &ScavTrap::operator=(const ScavTrap &other) +{ + if (this == &other) + return (*this); + ClapTrap::operator=(other); + m_is_guading = other.m_is_guading; + return (*this); +} + +void ScavTrap::attack(const std::string &target) +{ + if (m_hp == 0) + std::cout << "ScavTrap " << m_name + << " is dead, hence cannot attack.\n"; + else if (m_energy == 0) + std::cout << "ScavTrap " << m_name + << " does not have enough energy to attack.\n"; + else + { + std::cout << "ScavTrap " << m_name + << " attacks " << target << " and deals " << m_attack << " damage.\n"; + --m_energy; + } +} diff --git a/ex01/ScavTrap.h b/ex01/ScavTrap.h new file mode 100644 index 0000000..5bdd16c --- /dev/null +++ b/ex01/ScavTrap.h @@ -0,0 +1,23 @@ +#ifndef SCAVTRAP_H +# define SCAVTRAP_H + +# include "ClapTrap.h" +# include + +class ScavTrap : public ClapTrap +{ + private: + bool m_is_guading; + + public: + ScavTrap(std::string name = "DEFAULT"); + ScavTrap(const ScavTrap &other); + ~ScavTrap(); + + ScavTrap &operator=(const ScavTrap &other); + + void attack(const std::string &target); + void guardGate(); +}; + +#endif // SCAVTRAP_H diff --git a/ex01/main.cpp b/ex01/main.cpp new file mode 100644 index 0000000..b4026d4 --- /dev/null +++ b/ex01/main.cpp @@ -0,0 +1,29 @@ +#include "ClapTrap.h" +#include "ScavTrap.h" + +int main() +{ + ScavTrap a("Alen"); + ClapTrap def; + + def.attack("foo"); + def.takeDamage(9); + def.takeDamage(0); + def.beRepaired(6); + def.takeDamage(5); + def.takeDamage(1); + def.takeDamage(1); + def.takeDamage(1); + def.attack("foo"); + def.beRepaired(10); + for (int i(0); i < 10; ++i) + a.attack("bar"); + a.takeDamage(9); + a.attack("bar"); + a.beRepaired(1); + a.takeDamage(100); + a.takeDamage(1); + a.attack("bar"); + a.beRepaired(1); + return (0); +} -- 2.30.2