From 7fb5f99a7a1f105f47581eefdd0f88f48e8f54fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kha=C3=AFs=20COLIN?= Date: Tue, 20 May 2025 11:24:16 +0200 Subject: [PATCH] feat(ex03): it works --- ex03/.gitignore | 1 + ex03/ClapTrap.cpp | 69 ++++++++++++++++++++++++++++++++++++++++++++ ex03/ClapTrap.hpp | 30 +++++++++++++++++++ ex03/DiamondTrap.cpp | 34 ++++++++++++++++++++++ ex03/DiamondTrap.hpp | 22 ++++++++++++++ ex03/FragTrap.cpp | 31 ++++++++++++++++++++ ex03/FragTrap.hpp | 16 ++++++++++ ex03/Makefile | 42 +++++++++++++++++++++++++++ ex03/ScavTrap.cpp | 32 ++++++++++++++++++++ ex03/ScavTrap.hpp | 16 ++++++++++ ex03/main.cpp | 27 +++++++++++++++++ 11 files changed, 320 insertions(+) create mode 100644 ex03/.gitignore create mode 100644 ex03/ClapTrap.cpp create mode 100644 ex03/ClapTrap.hpp create mode 100644 ex03/DiamondTrap.cpp create mode 100644 ex03/DiamondTrap.hpp create mode 100644 ex03/FragTrap.cpp create mode 100644 ex03/FragTrap.hpp create mode 100644 ex03/Makefile create mode 100644 ex03/ScavTrap.cpp create mode 100644 ex03/ScavTrap.hpp create mode 100644 ex03/main.cpp diff --git a/ex03/.gitignore b/ex03/.gitignore new file mode 100644 index 0000000..b3c7394 --- /dev/null +++ b/ex03/.gitignore @@ -0,0 +1 @@ +ex03 diff --git a/ex03/ClapTrap.cpp b/ex03/ClapTrap.cpp new file mode 100644 index 0000000..5cf3e4d --- /dev/null +++ b/ex03/ClapTrap.cpp @@ -0,0 +1,69 @@ +#include "ClapTrap.hpp" +#include + +ClapTrap::ClapTrap() + : name("[name unset]"), hit_points(10), energy_points(10), + attack_damage(0) { + std::cout << "ClapTrap::ClapTrap()" << std::endl; +} + +ClapTrap::ClapTrap(std::string name) + : name(name), hit_points(10), energy_points(10), attack_damage(0) { + std::cout << "ClapTrap::ClapTrap(" << name << ")" << std::endl; +} + +ClapTrap::~ClapTrap() { std::cout << "ClapTrap::~ClapTrap()" << std::endl; } + +ClapTrap &ClapTrap::operator=(const ClapTrap &other) { + std::cout << "ClapTrap::operator=()" << std::endl; + name = other.name; + hit_points = other.hit_points; + energy_points = other.energy_points; + attack_damage = other.attack_damage; + return *this; +} + +void ClapTrap::attack(const std::string &target) { + if (energy_points > 0) { + std::cout << "ClapTrap " << name << " attacks " << target << ", causing " + << attack_damage << " points of damage!" << std::endl; + energy_points--; + } else { + std::cout << "ClapTrap " << name << " tries to attack " << target + << ", but has no more energy! " << std::endl; + } +} + +void ClapTrap::takeDamage(unsigned int amount) { + std::cout << "ClapTrap " << name << " took " << amount << " points of damage!" + << std::endl; + if (amount > hit_points) + amount = hit_points; + hit_points -= amount; + if (hit_points == 0) + std::cout << "ClapTrap " << name << " died!" << std::endl; +} + +void ClapTrap::beRepaired(unsigned int amount) { + + if (energy_points > 0) { + std::cout << "ClapTrap " << name << " is repaired for " << amount + << " hit points!" << std::endl; + hit_points += amount; + energy_points--; + } else { + std::cout << "ClapTrap " << name + << " tries to repair itself, but has no more energy! " + << std::endl; + } +} + +unsigned int ClapTrap::get_hit_points() const { return hit_points; } +unsigned int ClapTrap::get_energy_points() const { return energy_points; } +unsigned int ClapTrap::get_attack_damage() const { return attack_damage; } + +void ClapTrap::showStats() const { + std::cout << "ClapTrap " << name << " stats: hit_points: " << hit_points + << " energy_points: " << energy_points + << " attack_damage: " << attack_damage << std::endl; +} diff --git a/ex03/ClapTrap.hpp b/ex03/ClapTrap.hpp new file mode 100644 index 0000000..37667b0 --- /dev/null +++ b/ex03/ClapTrap.hpp @@ -0,0 +1,30 @@ +#ifndef CLAPTRAP_HPP +#define CLAPTRAP_HPP + +#include + +class ClapTrap { +protected: + std::string name; + unsigned int hit_points; + unsigned int energy_points; + unsigned int attack_damage; + +public: + ClapTrap(); + ClapTrap(std::string name); + ~ClapTrap(); + ClapTrap &operator=(const ClapTrap &other); + + void attack(const std::string &target); + void takeDamage(unsigned int amount); + void beRepaired(unsigned int amount); + + unsigned int get_hit_points() const; + unsigned int get_energy_points() const; + unsigned int get_attack_damage() const; + + void showStats() const; +}; + +#endif diff --git a/ex03/DiamondTrap.cpp b/ex03/DiamondTrap.cpp new file mode 100644 index 0000000..d18d15d --- /dev/null +++ b/ex03/DiamondTrap.cpp @@ -0,0 +1,34 @@ +#include "DiamondTrap.hpp" +#include + +DiamondTrap::DiamondTrap() : FragTrap(), ScavTrap() { + const FragTrap fragtrap = FragTrap(); + + hit_points = fragtrap.get_hit_points(); + energy_points = ScavTrap::energy_points; + attack_damage = fragtrap.get_attack_damage(); + + ClapTrap::name = name + "_clap_name"; + std::cout << "DiamondTrap::DiamondTrap()" << std::endl; +} +DiamondTrap::DiamondTrap(std::string name) : name(name) { + const FragTrap fragtrap = FragTrap(name); + + hit_points = fragtrap.get_hit_points(); + energy_points = ScavTrap::energy_points; + attack_damage = fragtrap.get_attack_damage(); + + ClapTrap::name = name + "_clap_name"; + std::cout << "DiamondTrap::DiamondTrap(" << name << ")" << std::endl; +} +DiamondTrap &DiamondTrap::operator=(DiamondTrap &other) { + this->name = other.name; + ClapTrap::operator=(other); + return *this; +} +DiamondTrap::~DiamondTrap() {} + +void DiamondTrap::whoAmI() { + std::cout << "ClapName: " << ClapTrap::name << " DiamondName: " << name + << std::endl; +} diff --git a/ex03/DiamondTrap.hpp b/ex03/DiamondTrap.hpp new file mode 100644 index 0000000..f3aa71c --- /dev/null +++ b/ex03/DiamondTrap.hpp @@ -0,0 +1,22 @@ +#ifndef DIAMONDTRAP_HPP +#define DIAMONDTRAP_HPP + +#include "FragTrap.hpp" +#include "ScavTrap.hpp" + +class DiamondTrap : public FragTrap, public ScavTrap { +private: + std::string name; + +public: + DiamondTrap(); + DiamondTrap(std::string name); + DiamondTrap &operator=(DiamondTrap &other); + ~DiamondTrap(); + + using ScavTrap::attack; + + void whoAmI(); +}; + +#endif diff --git a/ex03/FragTrap.cpp b/ex03/FragTrap.cpp new file mode 100644 index 0000000..95dc231 --- /dev/null +++ b/ex03/FragTrap.cpp @@ -0,0 +1,31 @@ +#include "FragTrap.hpp" +#include + +FragTrap::FragTrap() { + std::cout << "FragTrap::FragTrap()" << std::endl; + hit_points = 100; + energy_points = 100; + attack_damage = 30; +} + +FragTrap::FragTrap(std::string name) { + std::cout << "FragTrap::FragTrap(" << name << ")" << std::endl; + hit_points = 100; + energy_points = 100; + attack_damage = 30; + this->name = name; +} + +FragTrap::~FragTrap() { std::cout << "FragTrap::~FragTrap()" << std::endl; } + +FragTrap &FragTrap::operator=(const FragTrap &other) { + this->hit_points = other.hit_points; + this->energy_points = other.energy_points; + this->attack_damage = other.attack_damage; + this->name = other.name; + return *this; +} + +void FragTrap::highFivesGuys() { + std::cout << "FragTrap " << name << ": High-Five Guys?" << std::endl; +} diff --git a/ex03/FragTrap.hpp b/ex03/FragTrap.hpp new file mode 100644 index 0000000..ebe8776 --- /dev/null +++ b/ex03/FragTrap.hpp @@ -0,0 +1,16 @@ +#ifndef FRAGTRAP_HPP +#define FRAGTRAP_HPP + +#include "ClapTrap.hpp" + +class FragTrap : public virtual ClapTrap { +public: + FragTrap(); + FragTrap(std::string name); + ~FragTrap(); + FragTrap &operator=(const FragTrap &other); + + void highFivesGuys(); +}; + +#endif diff --git a/ex03/Makefile b/ex03/Makefile new file mode 100644 index 0000000..10f3b80 --- /dev/null +++ b/ex03/Makefile @@ -0,0 +1,42 @@ +NAME = ex03 +ifeq ($(CPPFLAGS),) + CPPFLAGS = -Wall -Wextra -Werror -Wshadow -std=c++98 -g +endif +ifeq ($(CXX),) + CXX = c++ +endif +# g++ is the default on 42 computers +ifeq ($(CXX),g++) + CXX = c++ +endif +srcs = \ + ClapTrap.cpp \ + ScavTrap.cpp \ + FragTrap.cpp \ + DiamondTrap.cpp \ + +main_objs = main.o $(srcs:.cpp=.o) +all_objs = $(main_objs) +deps = $(all_objs:.o=.d) + +all: $(NAME) + +-include $(deps) + +$(NAME): $(main_objs) + $(CXX) $(CPPFLAGS) -o $@ $^ + +%.o: %.cpp + $(CXX) -c $(CPPFLAGS) -o $*.o $*.cpp + $(CXX) -MM $(CPPFLAGS) -MT $*.o $*.cpp > $*.d + +clean: + find . -name '*.o' -print -delete + find . -name '*.d' -print -delete + +fclean: clean + rm -f $(NAME) + +re: + +make fclean + +make all diff --git a/ex03/ScavTrap.cpp b/ex03/ScavTrap.cpp new file mode 100644 index 0000000..85bd4f2 --- /dev/null +++ b/ex03/ScavTrap.cpp @@ -0,0 +1,32 @@ +#include "ScavTrap.hpp" +#include + +ScavTrap::ScavTrap() { + std::cout << "ScavTrap::ScavTrap()" << std::endl; + hit_points = 100; + energy_points = 50; + attack_damage = 20; +} + +ScavTrap::ScavTrap(std::string name) { + std::cout << "ScavTrap::ScavTrap(" << name << ")" << std::endl; + hit_points = 100; + energy_points = 50; + attack_damage = 20; + this->name = name; +} + +ScavTrap::~ScavTrap() { std::cout << "ScavTrap::~ScavTrap()" << std::endl; } + +ScavTrap &ScavTrap::operator=(const ScavTrap &other) { + this->hit_points = other.hit_points; + this->energy_points = other.energy_points; + this->attack_damage = other.attack_damage; + this->name = other.name; + return *this; +} + +void ScavTrap::guardGate() { + std::cout << "ScavTrap " << name << " is now in gate-guarding mode." + << std::endl; +} diff --git a/ex03/ScavTrap.hpp b/ex03/ScavTrap.hpp new file mode 100644 index 0000000..331e89c --- /dev/null +++ b/ex03/ScavTrap.hpp @@ -0,0 +1,16 @@ +#ifndef SCAVTRAP_HPP +#define SCAVTRAP_HPP + +#include "ClapTrap.hpp" + +class ScavTrap : public virtual ClapTrap { +public: + ScavTrap(); + ScavTrap(std::string name); + ~ScavTrap(); + ScavTrap &operator=(const ScavTrap &other); + + void guardGate(); +}; + +#endif diff --git a/ex03/main.cpp b/ex03/main.cpp new file mode 100644 index 0000000..5a0711d --- /dev/null +++ b/ex03/main.cpp @@ -0,0 +1,27 @@ +#include "DiamondTrap.hpp" +#include + +int main(void) { + { + FragTrap fragtrap = FragTrap("Fragattor"); + fragtrap.showStats(); + } + std::cout << std::endl; + { + ScavTrap scavtrap = ScavTrap("Scavenger"); + scavtrap.showStats(); + } + std::cout << std::endl; + { + DiamondTrap diamondtrap = DiamondTrap("Dizzy"); + diamondtrap.showStats(); + diamondtrap.attack("training dummy"); + diamondtrap.takeDamage(3); + diamondtrap.beRepaired(5); + diamondtrap.highFivesGuys(); + diamondtrap.guardGate(); + diamondtrap.whoAmI(); + diamondtrap.showStats(); + } + return 0; +}