From 817fac957bf91027432fd682ba69fddf3e5c278d Mon Sep 17 00:00:00 2001 From: Hugo LAMY Date: Sat, 19 Feb 2022 10:03:39 +0100 Subject: [PATCH] d03 ex03 introduction template pour main --- d03/ex03/ClapTrap.cpp | 170 ++++++++++++++++++++++++++++++++++++++++++ d03/ex03/ClapTrap.hpp | 49 ++++++++++++ d03/ex03/FragTrap.cpp | 30 ++++++++ d03/ex03/FragTrap.hpp | 19 +++++ d03/ex03/Makefile | 66 ++++++++++++++++ d03/ex03/ScavTrap.cpp | 30 ++++++++ d03/ex03/ScavTrap.hpp | 20 +++++ d03/ex03/color.h | 24 ++++++ d03/ex03/main.cpp | 68 +++++++++++++++++ d03/ex03/robots | Bin 0 -> 38472 bytes 10 files changed, 476 insertions(+) create mode 100644 d03/ex03/ClapTrap.cpp create mode 100644 d03/ex03/ClapTrap.hpp create mode 100644 d03/ex03/FragTrap.cpp create mode 100644 d03/ex03/FragTrap.hpp create mode 100644 d03/ex03/Makefile create mode 100644 d03/ex03/ScavTrap.cpp create mode 100644 d03/ex03/ScavTrap.hpp create mode 100644 d03/ex03/color.h create mode 100644 d03/ex03/main.cpp create mode 100755 d03/ex03/robots diff --git a/d03/ex03/ClapTrap.cpp b/d03/ex03/ClapTrap.cpp new file mode 100644 index 0000000..5c7246d --- /dev/null +++ b/d03/ex03/ClapTrap.cpp @@ -0,0 +1,170 @@ +#include "ClapTrap.hpp" + +/* + * statics + */ + +int ClapTrap::_totalNumber = 0; + +/* + * default/parametric constructor + */ + +ClapTrap::ClapTrap( void ) { + + std::cout << "claptrap created without name\n"; + return; +} + +/* + * destructor + */ + +ClapTrap::~ClapTrap( void ) { + std::cout << _class << " " << _name << " destructed\n"; + return; +} + +/* + * copy constructor + */ + +ClapTrap::ClapTrap( ClapTrap const & src ) { + std::cout << _class << " " << _name << " copied\n"; + *this = src; + return; +} + +/* + * assignement operator + */ + +ClapTrap & ClapTrap::operator=( ClapTrap const & rhs ) { + + if ( this != &rhs ) + { + this->_hit = rhs.getHit(); + this->_energy = rhs.getEnergy(); + this->_attack = rhs.getAttack(); + } + + std::cout << _class << " " << _name << " assigned\n"; + return *this; + +} + +/* + * constructor + */ + +ClapTrap::ClapTrap( std::string name ) : _name(name) { + + ClapTrap::_increaseNumber(); + + _class = "ClapTrap"; + _hit = 10; + _energy = 10; + _attack = 1; + _number = _getNumber(); + + std::cout << _class << " " << _name << " created with number " << _number << "\n"; + return; +} + +/* + * getters + */ + +std::string ClapTrap::getName() const {return _name;} +int ClapTrap::getHit() const {return _hit;} +int ClapTrap::getEnergy() const {return _energy;} +int ClapTrap::getAttack() const {return _attack;} +int ClapTrap::_getNumber() {return ClapTrap::_totalNumber;} +void ClapTrap::_increaseNumber() {ClapTrap::_totalNumber++;} + +/* + * robots + */ + +void ClapTrap::attack(const std::string & target) { + + std::ostringstream action; + std::ostringstream state; + + state << B_CYAN "[" B_GREEN << _class[0] << _number << B_PURPLE "h,e,a" B_CYAN ":" B_BLUE << _hit << "," << _energy << "," << _attack << B_CYAN "->"; + action << _class << " " << _name; + + if (_energy > 0 && _hit > 0) + { + _energy--; + if (_energy < 0) + _energy = 0; + action << " attacked " << target << ", causing " B_YELLOW << _attack << RESET << " points of damage" << '\n'; + } + else + { + _attack = 0; + if (_energy <= 0) + action << " cannot attack because " B_RED " is out of energy" RESET"\n"; + else if (_hit <= 0) + action << " cannot attack because " B_RED " is out of hit" RESET "\n"; + } + + state << B_BLUE << _hit << "," << _energy << "," << _attack << B_CYAN "]" RESET; + std::cout << state.str() << action.str(); +} + +void ClapTrap::takeDamage(unsigned int amount) { + + std::ostringstream action; + std::ostringstream state; + + state << B_CYAN "[" B_GREEN << _class[0] << _number << B_PURPLE "h,e,a" B_CYAN ":" B_BLUE << _hit << "," << _energy << "," << _attack << B_CYAN "->"; + action << _class << " " << _name; + + if (_energy > 0 && _hit > 0) + { + _hit -= amount; + if (_hit < 0) + _hit = 0; + action << " looses " B_YELLOW << amount << RESET << " hit points" << '\n'; + } + else + { + if (_energy <= 0) + action << " cannot take damage because " B_RED " is out of energy" RESET "\n"; + else if (_hit <= 0) + action << " cannot take damage because " B_RED " is out of hit" RESET "\n"; + } + + state << B_BLUE << _hit << "," << _energy << "," << _attack << B_CYAN "]" RESET; + std::cout << state.str() << action.str(); +} + +void ClapTrap::beRepaired(unsigned int amount) { + + std::ostringstream action; + std::ostringstream state; + + state << B_CYAN "[" B_GREEN << _class[0] << _number << B_PURPLE "h,e,a" B_CYAN ":" B_BLUE << _hit << "," << _energy << "," << _attack << B_CYAN "->"; + action << _class << " " << _name; + + if (_energy > 0 && _hit > 0) + { + _energy--; + if (_energy < 0) + _energy = 0; + _hit += amount; + action << " repaired itself and gained " B_YELLOW << amount << RESET << " points of life" << '\n'; + } + else + { + if (_energy <= 0) + action << " cannot repair itself because " B_RED " is out of energy" RESET "\n"; + else if (_hit <= 0) + action << " cannot repair itself because " B_RED " is out of hit" RESET "\n"; + } + + state << B_BLUE << _hit << "," << _energy << "," << _attack << B_CYAN "]" RESET; + std::cout << state.str() << action.str(); +} diff --git a/d03/ex03/ClapTrap.hpp b/d03/ex03/ClapTrap.hpp new file mode 100644 index 0000000..d1d3259 --- /dev/null +++ b/d03/ex03/ClapTrap.hpp @@ -0,0 +1,49 @@ +#ifndef CLAPTRAP_HPP +# define CLAPTRAP_HPP + +#include +#include +#include +#include + +class ClapTrap { + +public: + + ClapTrap( std::string name ); // default/parametric constructor + ClapTrap( ClapTrap const & src ); // copy constructor + ~ClapTrap( void ); // destructor + + ClapTrap & operator=( ClapTrap const & rhs ); // assignement operator + + void attack(const std::string & target); + void takeDamage(unsigned int amount); + void beRepaired(unsigned int amount); + + std::string getName() const; + int getHit() const; + int getEnergy() const; + int getAttack() const; + +protected: + + std::string const _name; + std::string _class; + int _hit; + int _energy; + int _attack; + int _number; + + int _getNumber(); + void _increaseNumber(); + +private: + + ClapTrap( void ); // default/parametric constructor + + static int _totalNumber; + +}; + +#endif + diff --git a/d03/ex03/FragTrap.cpp b/d03/ex03/FragTrap.cpp new file mode 100644 index 0000000..51f1d09 --- /dev/null +++ b/d03/ex03/FragTrap.cpp @@ -0,0 +1,30 @@ +#include "FragTrap.hpp" + +FragTrap::FragTrap( std::string name ) : ClapTrap(name) { + + _class = "FragTrap"; + _hit = 100; + _energy = 100; + _attack = 30; + + std::cout << _class << " " << FragTrap::_name << " created with number " << _number << "\n"; + + return; +} + +/* + * destructor + */ + +FragTrap::~FragTrap( void ) { + std::cout << _class << " " << FragTrap::_name << " destructed\n"; + return; +} + +/* + * special capacity + */ + +void FragTrap::highFivesGuys() { + std::cout << _class << " " << FragTrap::_name << " wait for a high fives, common guys\n"; +} diff --git a/d03/ex03/FragTrap.hpp b/d03/ex03/FragTrap.hpp new file mode 100644 index 0000000..bc3c68d --- /dev/null +++ b/d03/ex03/FragTrap.hpp @@ -0,0 +1,19 @@ +#ifndef FRAGTRAP_HPP +# define FRAGTRAP_HPP + +#include +#include +#include "ClapTrap.hpp" + +class FragTrap : public ClapTrap { + +public: + + FragTrap(std::string name); + ~FragTrap( void ); + + void highFivesGuys(); + +}; + +#endif diff --git a/d03/ex03/Makefile b/d03/ex03/Makefile new file mode 100644 index 0000000..f4fc536 --- /dev/null +++ b/d03/ex03/Makefile @@ -0,0 +1,66 @@ +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # +# . name = value . name is case sensitive # +# VARIABLES . or name = value \ . use VPATH only for .c # +# . value . or .cpp # +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # + +NAME = robots + +CC = c++ +CFLAGS = -Wall -Wextra -Werror $(INCLUDES) -std=c++98 + +VPATH = $(D_SRCS) + +LIBS = + +INCLUDES = -I$(D_HEADERS) + +D_SRCS = . +SRCS = main.cpp \ + ClapTrap.cpp \ + ScavTrap.cpp \ + FragTrap.cpp + +D_HEADERS = . +HEADERS = ClapTrap.hpp \ + ScavTrap.hpp \ + FragTrap.hpp + +D_OBJS = builds +OBJS = $(SRCS:%.cpp=$(D_OBJS)/%.o) + +RM_D_OBJS = rm -rf $(D_OBJS) +ifeq "$(D_OBJS)" "." +RM_D_OBJS = +endif + + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # +# . target: prerequisites . $@ : target # +# RULES . recipe . $< : 1st prerequisite # +# . recipe . $^ : all prerequisites # +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # + +all: $(NAME) + +$(D_OBJS)/%.o: %.cpp | $(D_OBJS) + $(CC) $(CFLAGS) -c $< -o $@ + +$(D_OBJS): + mkdir $@ + +$(OBJS): $(HEADERS:%=$(D_HEADERS)/%) + +$(NAME): $(OBJS) + $(CC) $(OBJS) -o $@ $(LIBS) + +clean: + rm -f $(OBJS) + +fclean: clean + rm -f $(NAME) + $(RM_D_OBJS) + +re: fclean all + +.PHONY : all clean fclean re bonus run valgrind diff --git a/d03/ex03/ScavTrap.cpp b/d03/ex03/ScavTrap.cpp new file mode 100644 index 0000000..df8bc14 --- /dev/null +++ b/d03/ex03/ScavTrap.cpp @@ -0,0 +1,30 @@ +#include "ScavTrap.hpp" + +ScavTrap::ScavTrap( std::string name ) : ClapTrap(name) { + + _class = "ScavTrap"; + _hit = 100; + _energy = 50; + _attack = 20; + + std::cout << _class << " " << ScavTrap::_name << " created with number " << _number << "\n"; + + return; +} + +/* + * destructor + */ + +ScavTrap::~ScavTrap( void ) { + std::cout << _class << " " << ScavTrap::_name << " destructed\n"; + return; +} + +/* + * special capacity + */ + +void ScavTrap::guardGate() { + std::cout << _class << " " << ScavTrap::_name << " entered special mode Gate Keeper\n"; +} diff --git a/d03/ex03/ScavTrap.hpp b/d03/ex03/ScavTrap.hpp new file mode 100644 index 0000000..9618d2b --- /dev/null +++ b/d03/ex03/ScavTrap.hpp @@ -0,0 +1,20 @@ +#ifndef SCAVTRAP_HPP +# define SCAVTRAP_HPP + +#include +#include +#include "ClapTrap.hpp" + +class ScavTrap : public ClapTrap { + +public: + + ScavTrap(std::string name); + ~ScavTrap(); + + void guardGate(); + +}; + +#endif + diff --git a/d03/ex03/color.h b/d03/ex03/color.h new file mode 100644 index 0000000..e313f5f --- /dev/null +++ b/d03/ex03/color.h @@ -0,0 +1,24 @@ +#ifndef COLOR_H +# define COLOR_H + +# define GRAY "\e[0;30m" +# define RED "\e[0;31m" +# define GREEN "\e[0;32m" +# define YELLOW "\e[0;33m" +# define BLUE "\e[0;34m" +# define PURPLE "\e[0;35m" +# define CYAN "\e[0;36m" +# define WHITE "\e[0;37m" + +# define B_GRAY "\e[1;30m" +# define B_RED "\e[1;31m" +# define B_GREEN "\e[1;32m" +# define B_YELLOW "\e[1;33m" +# define B_BLUE "\e[1;34m" +# define B_PURPLE "\e[1;35m" +# define B_CYAN "\e[1;36m" +# define B_WHITE "\e[1;37m" + +# define RESET "\e[0m" + +#endif diff --git a/d03/ex03/main.cpp b/d03/ex03/main.cpp new file mode 100644 index 0000000..6689f6e --- /dev/null +++ b/d03/ex03/main.cpp @@ -0,0 +1,68 @@ +#include "ScavTrap.hpp" +#include "FragTrap.hpp" +#include + +template < typename U, typename V > +void goAttack(U & robot1, V & robot2) { + + std::cout << "."; + robot1.attack(robot2.getName()); + std::cout << " "; + robot2.takeDamage(robot1.getAttack()); + std::cout << " "; + robot2.beRepaired(robot1.getAttack()); + +} + +int main() { + + FragTrap robot1("robot1"); + ClapTrap robot2("robot2"); + ScavTrap robot3("robot3"); + ScavTrap robot4("robot4"); + ClapTrap robot5("robot5"); + ScavTrap robot6("robot6"); + FragTrap robot7("robot7"); + FragTrap robot8("robot8"); + ClapTrap robot9("robot9"); + + goAttack(robot1, robot2); + goAttack(robot6, robot3); + goAttack(robot6, robot7); + goAttack(robot8, robot1); + goAttack(robot1, robot3); +robot4.guardGate(); + goAttack(robot1, robot4); + goAttack(robot9, robot2); + goAttack(robot1, robot5); + goAttack(robot3, robot2); + goAttack(robot4, robot8); +robot8.highFivesGuys(); + goAttack(robot2, robot7); + goAttack(robot3, robot2); + goAttack(robot1, robot2); + goAttack(robot8, robot4); + goAttack(robot2, robot4); +robot3.guardGate(); + goAttack(robot3, robot1); + goAttack(robot5, robot7); + goAttack(robot1, robot9); + goAttack(robot9, robot6); + goAttack(robot9, robot2); +robot4.guardGate(); +robot1.highFivesGuys(); +robot7.highFivesGuys(); + goAttack(robot3, robot4); + goAttack(robot5, robot2); + goAttack(robot7, robot6); + goAttack(robot2, robot1); +robot7.highFivesGuys(); + goAttack(robot2, robot4); + goAttack(robot9, robot6); + goAttack(robot3, robot2); + goAttack(robot6, robot5); + goAttack(robot4, robot9); + goAttack(robot7, robot6); + + return 0; +} diff --git a/d03/ex03/robots b/d03/ex03/robots new file mode 100755 index 0000000000000000000000000000000000000000..0f19ff67a6b5ab90a1e8892c6135a88b040ddd2b GIT binary patch literal 38472 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