diff --git a/ex02/.gitignore b/ex02/.gitignore new file mode 100644 index 0000000..03169ab --- /dev/null +++ b/ex02/.gitignore @@ -0,0 +1 @@ +ex02 diff --git a/ex02/ClapTrap.cpp b/ex02/ClapTrap.cpp new file mode 100644 index 0000000..fc8ac6d --- /dev/null +++ b/ex02/ClapTrap.cpp @@ -0,0 +1,59 @@ +#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; + } +} diff --git a/ex02/ClapTrap.hpp b/ex02/ClapTrap.hpp new file mode 100644 index 0000000..1efa4d8 --- /dev/null +++ b/ex02/ClapTrap.hpp @@ -0,0 +1,24 @@ +#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); +}; + +#endif diff --git a/ex02/FragTrap.cpp b/ex02/FragTrap.cpp new file mode 100644 index 0000000..95dc231 --- /dev/null +++ b/ex02/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/ex02/FragTrap.hpp b/ex02/FragTrap.hpp new file mode 100644 index 0000000..cc2f53b --- /dev/null +++ b/ex02/FragTrap.hpp @@ -0,0 +1,16 @@ +#ifndef FRAGTRAP_HPP +#define FRAGTRAP_HPP + +#include "ClapTrap.hpp" + +class FragTrap : public ClapTrap { +public: + FragTrap(); + FragTrap(std::string name); + ~FragTrap(); + FragTrap &operator=(const FragTrap &other); + + void highFivesGuys(); +}; + +#endif diff --git a/ex02/Makefile b/ex02/Makefile new file mode 100644 index 0000000..c2202fe --- /dev/null +++ b/ex02/Makefile @@ -0,0 +1,41 @@ +NAME = ex02 +ifeq ($(CPPFLAGS),) + CPPFLAGS = -Wall -Wextra -Werror -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 \ + +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/ex02/ScavTrap.cpp b/ex02/ScavTrap.cpp new file mode 100644 index 0000000..85bd4f2 --- /dev/null +++ b/ex02/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/ex02/ScavTrap.hpp b/ex02/ScavTrap.hpp new file mode 100644 index 0000000..abbc9a7 --- /dev/null +++ b/ex02/ScavTrap.hpp @@ -0,0 +1,16 @@ +#ifndef SCAVTRAP_HPP +#define SCAVTRAP_HPP + +#include "ClapTrap.hpp" + +class ScavTrap : public ClapTrap { +public: + ScavTrap(); + ScavTrap(std::string name); + ~ScavTrap(); + ScavTrap &operator=(const ScavTrap &other); + + void guardGate(); +}; + +#endif diff --git a/ex02/main.cpp b/ex02/main.cpp new file mode 100644 index 0000000..a42930a --- /dev/null +++ b/ex02/main.cpp @@ -0,0 +1,34 @@ +#include "FragTrap.hpp" + +int main(void) { + { + FragTrap fragtrap = FragTrap("John Doe"); + fragtrap.attack("training dummy"); + fragtrap.takeDamage(3); + fragtrap.attack("training dummy"); + fragtrap.takeDamage(3); + fragtrap.takeDamage(3); + fragtrap.beRepaired(5); + fragtrap.attack("training dummy"); + fragtrap.attack("training dummy"); + fragtrap.attack("training dummy"); + fragtrap.attack("training dummy"); + fragtrap.attack("training dummy"); + fragtrap.beRepaired(5); + fragtrap.beRepaired(5); + fragtrap.beRepaired(5); + fragtrap.beRepaired(5); + fragtrap.beRepaired(5); + fragtrap.attack("training dummy"); + fragtrap.attack("training dummy"); + fragtrap.attack("training dummy"); + fragtrap.attack("training dummy"); + fragtrap.attack("training dummy"); + fragtrap.beRepaired(5); + fragtrap.beRepaired(5); + fragtrap.beRepaired(5); + fragtrap.beRepaired(5); + fragtrap.highFivesGuys(); + } + return 0; +}