From 8c9d50dd6812fba1d8dfee52ece2be0939432a89 Mon Sep 17 00:00:00 2001 From: Hugo LAMY Date: Tue, 22 Feb 2022 19:05:24 +0100 Subject: [PATCH] d03 code refonte ex00 01 et 02 --- d03/ex00/ClapTrap.cpp | 167 ++++++++++++++++++++++++------------------ d03/ex00/ClapTrap.hpp | 33 +++++++-- d03/ex00/color.h | 24 ------ d03/ex02/ClapTrap.cpp | 138 +++++++++++++++++----------------- d03/ex02/ClapTrap.hpp | 30 +++++--- d03/ex02/FragTrap.cpp | 57 ++++++++++---- d03/ex02/FragTrap.hpp | 15 +++- d03/ex02/ScavTrap.cpp | 61 +++++++++++---- d03/ex02/ScavTrap.hpp | 16 +++- d03/ex02/color.h | 24 ------ d03/ex02/main.cpp | 114 ++++++---------------------- d03/ex02/robots | Bin 38400 -> 53144 bytes 12 files changed, 349 insertions(+), 330 deletions(-) delete mode 100644 d03/ex00/color.h delete mode 100644 d03/ex02/color.h diff --git a/d03/ex00/ClapTrap.cpp b/d03/ex00/ClapTrap.cpp index ba90105..54a4994 100644 --- a/d03/ex00/ClapTrap.cpp +++ b/d03/ex00/ClapTrap.cpp @@ -1,96 +1,109 @@ #include "ClapTrap.hpp" -/* - * default/parametric constructor - */ +# 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" -ClapTrap::ClapTrap( void ) { - std::cout << "claptrap created without name\n"; +# define RESET "\e[0m" + +/********************************************* + * CONSTRUCTORS + *********************************************/ + +ClapTrap::ClapTrap( std::string name ) { + ClapTrap::_increaseNumber(); + _class = _dClass; + _name = name; + _hit = _dHit; + _energy = _dEnergy; + _attack = _dAttack; + _number = getTotalNumber(); + std::cout << _class << " " << _name << "-" << _number << " created\n"; return; } -/* - * destructor - */ - -ClapTrap::~ClapTrap( void ) { - std::cout << "claptrap " << _name << " destructed\n"; - return; -} - -/* - * copy constructor - */ - ClapTrap::ClapTrap( ClapTrap const & src ) { - std::cout << "claptrap " << _name << " copied\n"; + ClapTrap::_increaseNumber(); + _class = _dClass; *this = src; + _number = getTotalNumber(); + std::cout << _class << " " << _name << "-" << _number << " copied from " << src._class << " " << src._name << "-" << src._number << "\n"; return; } -/* - * assignement operator - */ +/********************************************* + * DESTRUCTORS + *********************************************/ + +ClapTrap::~ClapTrap( void ) { + std::cout << _class << " " << _name << "-" << _number << " destructed\n"; + return; +} + +/********************************************* + * OPERATORS + *********************************************/ ClapTrap & ClapTrap::operator=( ClapTrap const & rhs ) { - std::cout << "claptrap " << _name << " assigned\n"; if ( this != &rhs ) { - this->_hit = rhs.getHit(); - this->_energy = rhs.getEnergy(); - this->_attack = rhs.getAttack(); + _name = rhs.getName(); + _hit = rhs.getHit(); + _energy = rhs.getEnergy(); + _attack = rhs.getAttack(); + _number = rhs.getNumber(); } + std::cout << _class << " " << _name << "-" << _number << " assigned\n"; return *this; } -/* - * constructor - */ - -ClapTrap::ClapTrap( std::string name ) : _name(name) { - std::cout << "claptrap " << _name << " created\n"; - _hit = 10; - _energy = 10; - _attack = 1; - return; -} - -/* - * getters - */ +/********************************************* + * ACCESSORS + *********************************************/ std::string ClapTrap::getName() const {return _name;} +std::string ClapTrap::getClass() const {return _class;} int ClapTrap::getHit() const {return _hit;} int ClapTrap::getEnergy() const {return _energy;} int ClapTrap::getAttack() const {return _attack;} +int ClapTrap::getNumber() const {return _number;} +int ClapTrap::getTotalNumber() const {return _totalNumber;} +void ClapTrap::_increaseNumber() {ClapTrap::_totalNumber++;} -/* - * robots - */ +/********************************************* + * PUBLIC MEMBER FUNCTIONS + *********************************************/ void ClapTrap::attack(const std::string & target) { std::ostringstream action; std::ostringstream state; - state << B_CYAN "[" B_PURPLE "h,e,a" B_CYAN ":" B_BLUE << _hit << "," << _energy << "," << _attack << B_CYAN "->"; - action << " ClapTrap " << _name; + 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 << "-" << _number; - if (_energy && _hit) + if (_energy > 0 && _hit > 0) { _energy--; - action << " attacked " << target << ", causing " B_YELLOW << _attack << RESET << " points of damage!" << '\n'; + if (_energy < 0) + _energy = 0; + action << " attacked " << target << ", causing " B_YELLOW << _attack << RESET << " points of damage" << '\n'; } else { _attack = 0; - if (!_energy) - action << "cannot attack because " B_RED " is out of energy\n" RESET; - else if (!_hit) - action << "cannot attack because " B_RED " is out of hit\n" RESET; + 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; @@ -102,21 +115,18 @@ void ClapTrap::takeDamage(unsigned int amount) { std::ostringstream action; std::ostringstream state; - state << B_CYAN "[" B_PURPLE "h,e,a" B_CYAN ":" B_BLUE << _hit << "," << _energy << "," << _attack << B_CYAN "->"; - action << " ClapTrap " << _name; + 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 << "-" << _number; - if (_energy && _hit) + if (_hit > 0) { _hit -= amount; - action << " looses " B_YELLOW << amount << RESET << " points of damage :/" << '\n'; - } - else - { - if (!_energy) - action << "cannot take damage because " B_RED " is out of energy\n" RESET; - else if (!_hit) - action << "cannot take damage because " B_RED " is out of hit\n" RESET; + if (_hit < 0) + _hit = 0; + action << " looses " B_YELLOW << amount << RESET << " hit points" << '\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(); @@ -127,23 +137,38 @@ void ClapTrap::beRepaired(unsigned int amount) { std::ostringstream action; std::ostringstream state; - state << B_CYAN "[" B_PURPLE "h,e,a" B_CYAN ":" B_BLUE << _hit << "," << _energy << "," << _attack << B_CYAN "->"; - action << " ClapTrap " << _name; + 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 << "-" << _number; - if (_energy && _hit) + 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'; + action << " repaired itself and gained " B_YELLOW << amount << RESET << " points of life" << '\n'; } else { - if (!_energy) - action << "cannot repair itself because " B_RED " is out of energy\n" RESET; - else if (!_hit) - action << "cannot repair itself because " B_RED " is out of hit\n" RESET; + 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(); } + +/********************************************* + * STATICS + *********************************************/ + +int ClapTrap::_totalNumber = 0; + +std::string const ClapTrap::_dName = "robot"; +std::string const ClapTrap::_dClass = "ClapTrap"; +int const ClapTrap::_dHit = 10; +int const ClapTrap::_dEnergy = 10; +int const ClapTrap::_dAttack = 0; + diff --git a/d03/ex00/ClapTrap.hpp b/d03/ex00/ClapTrap.hpp index 615c26f..a0beeca 100644 --- a/d03/ex00/ClapTrap.hpp +++ b/d03/ex00/ClapTrap.hpp @@ -4,14 +4,13 @@ #include #include #include -#include class ClapTrap { public: - ClapTrap( std::string name ); // default/parametric constructor - ClapTrap( ClapTrap const & src ); // copy constructor + ClapTrap( std::string name = ClapTrap::_dName ); + ClapTrap( ClapTrap const & src ); // copy constructor ~ClapTrap( void ); // destructor ClapTrap & operator=( ClapTrap const & rhs ); // assignement operator @@ -21,18 +20,36 @@ public: void beRepaired(unsigned int amount); std::string getName() const; + std::string getClass() const; int getHit() const; int getEnergy() const; int getAttack() const; + int getNumber() const; + +protected: + + int getTotalNumber() const; + + std::string _name; + std::string _class; + int _hit; + int _energy; + int _attack; + int _number; + + void _increaseNumber(); private: - ClapTrap( void ); // default/parametric constructor + void assignValues(ClapTrap & src); + static int _totalNumber; - std::string const _name; - int _hit; - int _energy; - int _attack; + static const std::string _dName; + static const std::string _dClass; + static const int _dHit; + static const int _dEnergy; + static const int _dAttack; + static const int _dNumber; }; diff --git a/d03/ex00/color.h b/d03/ex00/color.h deleted file mode 100644 index e313f5f..0000000 --- a/d03/ex00/color.h +++ /dev/null @@ -1,24 +0,0 @@ -#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/ex02/ClapTrap.cpp b/d03/ex02/ClapTrap.cpp index 5c7246d..54a4994 100644 --- a/d03/ex02/ClapTrap.cpp +++ b/d03/ex02/ClapTrap.cpp @@ -1,90 +1,86 @@ #include "ClapTrap.hpp" -/* - * statics - */ +# 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" -int ClapTrap::_totalNumber = 0; +# define RESET "\e[0m" -/* - * default/parametric constructor - */ +/********************************************* + * CONSTRUCTORS + *********************************************/ -ClapTrap::ClapTrap( void ) { - - std::cout << "claptrap created without name\n"; +ClapTrap::ClapTrap( std::string name ) { + ClapTrap::_increaseNumber(); + _class = _dClass; + _name = name; + _hit = _dHit; + _energy = _dEnergy; + _attack = _dAttack; + _number = getTotalNumber(); + std::cout << _class << " " << _name << "-" << _number << " created\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"; + ClapTrap::_increaseNumber(); + _class = _dClass; *this = src; + _number = getTotalNumber(); + std::cout << _class << " " << _name << "-" << _number << " copied from " << src._class << " " << src._name << "-" << src._number << "\n"; return; } -/* - * assignement operator - */ +/********************************************* + * DESTRUCTORS + *********************************************/ + +ClapTrap::~ClapTrap( void ) { + std::cout << _class << " " << _name << "-" << _number << " destructed\n"; + return; +} + +/********************************************* + * OPERATORS + *********************************************/ ClapTrap & ClapTrap::operator=( ClapTrap const & rhs ) { if ( this != &rhs ) { - this->_hit = rhs.getHit(); - this->_energy = rhs.getEnergy(); - this->_attack = rhs.getAttack(); + _name = rhs.getName(); + _hit = rhs.getHit(); + _energy = rhs.getEnergy(); + _attack = rhs.getAttack(); + _number = rhs.getNumber(); } - std::cout << _class << " " << _name << " assigned\n"; + std::cout << _class << " " << _name << "-" << _number << " 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 - */ +/********************************************* + * ACCESSORS + *********************************************/ std::string ClapTrap::getName() const {return _name;} +std::string ClapTrap::getClass() const {return _class;} int ClapTrap::getHit() const {return _hit;} int ClapTrap::getEnergy() const {return _energy;} int ClapTrap::getAttack() const {return _attack;} -int ClapTrap::_getNumber() {return ClapTrap::_totalNumber;} +int ClapTrap::getNumber() const {return _number;} +int ClapTrap::getTotalNumber() const {return _totalNumber;} void ClapTrap::_increaseNumber() {ClapTrap::_totalNumber++;} -/* - * robots - */ +/********************************************* + * PUBLIC MEMBER FUNCTIONS + *********************************************/ void ClapTrap::attack(const std::string & target) { @@ -92,7 +88,7 @@ void ClapTrap::attack(const std::string & target) { 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; + action << _class << " " << _name << "-" << _number; if (_energy > 0 && _hit > 0) { @@ -120,22 +116,17 @@ void ClapTrap::takeDamage(unsigned int amount) { 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; + action << _class << " " << _name << "-" << _number; - if (_energy > 0 && _hit > 0) + if (_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"; - } + 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(); @@ -147,7 +138,7 @@ void ClapTrap::beRepaired(unsigned int amount) { 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; + action << _class << " " << _name << "-" << _number; if (_energy > 0 && _hit > 0) { @@ -168,3 +159,16 @@ void ClapTrap::beRepaired(unsigned int amount) { state << B_BLUE << _hit << "," << _energy << "," << _attack << B_CYAN "]" RESET; std::cout << state.str() << action.str(); } + +/********************************************* + * STATICS + *********************************************/ + +int ClapTrap::_totalNumber = 0; + +std::string const ClapTrap::_dName = "robot"; +std::string const ClapTrap::_dClass = "ClapTrap"; +int const ClapTrap::_dHit = 10; +int const ClapTrap::_dEnergy = 10; +int const ClapTrap::_dAttack = 0; + diff --git a/d03/ex02/ClapTrap.hpp b/d03/ex02/ClapTrap.hpp index d1d3259..a0beeca 100644 --- a/d03/ex02/ClapTrap.hpp +++ b/d03/ex02/ClapTrap.hpp @@ -4,13 +4,12 @@ #include #include #include -#include class ClapTrap { public: - ClapTrap( std::string name ); // default/parametric constructor + ClapTrap( std::string name = ClapTrap::_dName ); ClapTrap( ClapTrap const & src ); // copy constructor ~ClapTrap( void ); // destructor @@ -21,28 +20,37 @@ public: void beRepaired(unsigned int amount); std::string getName() const; + std::string getClass() const; int getHit() const; int getEnergy() const; int getAttack() const; + int getNumber() const; protected: - std::string const _name; - std::string _class; - int _hit; - int _energy; - int _attack; - int _number; + int getTotalNumber() const; + + std::string _name; + std::string _class; + int _hit; + int _energy; + int _attack; + int _number; - int _getNumber(); void _increaseNumber(); private: - ClapTrap( void ); // default/parametric constructor - + void assignValues(ClapTrap & src); static int _totalNumber; + static const std::string _dName; + static const std::string _dClass; + static const int _dHit; + static const int _dEnergy; + static const int _dAttack; + static const int _dNumber; + }; #endif diff --git a/d03/ex02/FragTrap.cpp b/d03/ex02/FragTrap.cpp index 51f1d09..c8b4285 100644 --- a/d03/ex02/FragTrap.cpp +++ b/d03/ex02/FragTrap.cpp @@ -1,30 +1,59 @@ #include "FragTrap.hpp" +/********************************************* + * CONSTRUCTORS + *********************************************/ + 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"; - + _class = _dClass; + _hit = _dHit; + _energy = _dEnergy; + _attack = _dAttack; + std::cout << _class << " " << _name << "-" << _number << " created\n"; return; } -/* - * destructor - */ +FragTrap::FragTrap( FragTrap const & src ) { + _class = _dClass; + *this = src; + _number = getTotalNumber(); + std::cout << _class << " " << _name << "-" << _number << " copied from " << src._class << "-" << src._name << "-" << src._number << "\n"; + return; +} + +/********************************************* + * DESTRUCTORS + *********************************************/ FragTrap::~FragTrap( void ) { std::cout << _class << " " << FragTrap::_name << " destructed\n"; return; } -/* - * special capacity - */ +/********************************************* + * OPERATORS + *********************************************/ + +FragTrap & FragTrap::operator=( FragTrap const & rhs ) { + ClapTrap::operator=(rhs); + return *this; +} + +/********************************************* + * PUBLIC MEMBER FUNCTIONS + *********************************************/ void FragTrap::highFivesGuys() { std::cout << _class << " " << FragTrap::_name << " wait for a high fives, common guys\n"; } + +/********************************************* + * STATICS + *********************************************/ + +std::string const FragTrap::_dName = "robot"; +std::string const FragTrap::_dClass = "FragTrap"; +int const FragTrap::_dHit = 100; +int const FragTrap::_dEnergy = 100; +int const FragTrap::_dAttack = 50; + diff --git a/d03/ex02/FragTrap.hpp b/d03/ex02/FragTrap.hpp index bc3c68d..4e0a953 100644 --- a/d03/ex02/FragTrap.hpp +++ b/d03/ex02/FragTrap.hpp @@ -8,12 +8,23 @@ class FragTrap : public ClapTrap { public: + FragTrap( std::string name = FragTrap::_dName ); + FragTrap( FragTrap const & src ); // copy constructor + ~FragTrap(); // destructor - FragTrap(std::string name); - ~FragTrap( void ); + FragTrap & operator=( FragTrap const & rhs ); // assignement operator void highFivesGuys(); +private: + + static const std::string _dName; + static const std::string _dClass; + static const int _dHit; + static const int _dEnergy; + static const int _dAttack; + static const int _dNumber; + }; #endif diff --git a/d03/ex02/ScavTrap.cpp b/d03/ex02/ScavTrap.cpp index df8bc14..fa611e7 100644 --- a/d03/ex02/ScavTrap.cpp +++ b/d03/ex02/ScavTrap.cpp @@ -1,30 +1,59 @@ #include "ScavTrap.hpp" +/********************************************* + * CONSTRUCTORS + *********************************************/ + 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"; - + _class = _dClass; + _hit = _dHit; + _energy = _dEnergy; + _attack = _dAttack; + std::cout << _class << " " << _name << "-" << _number << " created\n"; return; } -/* - * destructor - */ +ScavTrap::ScavTrap( ScavTrap const & src ) { + _class = _dClass; + *this = src; + _number = getTotalNumber(); + std::cout << _class << " " << _name << "-" << _number << " copied from " << src._class << "-" << src._name << "-" << src._number << "\n"; + return; +} + +/********************************************* + * DESTRUCTORS + *********************************************/ ScavTrap::~ScavTrap( void ) { - std::cout << _class << " " << ScavTrap::_name << " destructed\n"; + std::cout << _class << " " << _name << "-" << _number << " destructed\n"; return; } -/* - * special capacity - */ +/********************************************* + * OPERATORS + *********************************************/ + +ScavTrap & ScavTrap::operator=( ScavTrap const & rhs ) { + ClapTrap::operator=(rhs); + return *this; +} + +/********************************************* + * PUBLIC MEMBER FUNCTIONS + *********************************************/ void ScavTrap::guardGate() { - std::cout << _class << " " << ScavTrap::_name << " entered special mode Gate Keeper\n"; + std::cout << _class << " " << _name << "-" << _number << " entered special mode Gate Keeper\n"; } + +/********************************************* + * STATICS + *********************************************/ + +std::string const ScavTrap::_dName = "robot"; +std::string const ScavTrap::_dClass = "ScavTrap"; +int const ScavTrap::_dHit = 100; +int const ScavTrap::_dEnergy = 50; +int const ScavTrap::_dAttack = 20; + diff --git a/d03/ex02/ScavTrap.hpp b/d03/ex02/ScavTrap.hpp index 9618d2b..7a627fc 100644 --- a/d03/ex02/ScavTrap.hpp +++ b/d03/ex02/ScavTrap.hpp @@ -9,11 +9,23 @@ class ScavTrap : public ClapTrap { public: - ScavTrap(std::string name); - ~ScavTrap(); + ScavTrap( std::string name = ScavTrap::_dName ); + ScavTrap( ScavTrap const & src ); // copy constructor + ~ScavTrap(); // destructor + + ScavTrap & operator=( ScavTrap const & rhs ); // assignement operator void guardGate(); +private: + + static const std::string _dName; + static const std::string _dClass; + static const int _dHit; + static const int _dEnergy; + static const int _dAttack; + static const int _dNumber; + }; #endif diff --git a/d03/ex02/color.h b/d03/ex02/color.h deleted file mode 100644 index e313f5f..0000000 --- a/d03/ex02/color.h +++ /dev/null @@ -1,24 +0,0 @@ -#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/ex02/main.cpp b/d03/ex02/main.cpp index fc40e66..3989712 100644 --- a/d03/ex02/main.cpp +++ b/d03/ex02/main.cpp @@ -1,103 +1,35 @@ +#include "ClapTrap.hpp" #include "ScavTrap.hpp" #include "FragTrap.hpp" -void goAttack(ClapTrap & robot1, ClapTrap & robot2) { +#include +#include +# 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" + +# define COLOR1 B_YELLOW + +template < typename U, typename V > +void goAttack(U & robot1, V & robot2) { + std::stringstream ss; + std::string num; + ss << robot2.getNumber(); + ss >> num; std::cout << "."; - robot1.attack(robot2.getName()); + robot1.attack(robot2.getName() + "-" + num); std::cout << " "; robot2.takeDamage(robot1.getAttack()); std::cout << " "; robot2.beRepaired(robot1.getAttack()); - -} - -void goAttack(ClapTrap & robot1, ScavTrap & robot2) { - - std::cout << "."; - robot1.attack(robot2.getName()); - std::cout << " "; - robot2.takeDamage(robot1.getAttack()); - std::cout << " "; - robot2.beRepaired(robot1.getAttack()); - -} - -void goAttack(ClapTrap & robot1, FragTrap & robot2) { - - std::cout << "."; - robot1.attack(robot2.getName()); - std::cout << " "; - robot2.takeDamage(robot1.getAttack()); - std::cout << " "; - robot2.beRepaired(robot1.getAttack()); - -} - -void goAttack(ScavTrap & robot1, ScavTrap & robot2) { - - std::cout << "."; - robot1.attack(robot2.getName()); - std::cout << " "; - robot2.takeDamage(robot1.getAttack()); - std::cout << " "; - robot2.beRepaired(robot1.getAttack()); - -} - -void goAttack(ScavTrap & robot1, ClapTrap & robot2) { - - std::cout << "."; - robot1.attack(robot2.getName()); - std::cout << " "; - robot2.takeDamage(robot1.getAttack()); - std::cout << " "; - robot2.beRepaired(robot1.getAttack()); - -} - -void goAttack(ScavTrap & robot1, FragTrap & robot2) { - - std::cout << "."; - robot1.attack(robot2.getName()); - std::cout << " "; - robot2.takeDamage(robot1.getAttack()); - std::cout << " "; - robot2.beRepaired(robot1.getAttack()); - -} - -void goAttack(FragTrap & robot1, FragTrap & robot2) { - - std::cout << "."; - robot1.attack(robot2.getName()); - std::cout << " "; - robot2.takeDamage(robot1.getAttack()); - std::cout << " "; - robot2.beRepaired(robot1.getAttack()); - -} - -void goAttack(FragTrap & robot1, ClapTrap & robot2) { - - std::cout << "."; - robot1.attack(robot2.getName()); - std::cout << " "; - robot2.takeDamage(robot1.getAttack()); - std::cout << " "; - robot2.beRepaired(robot1.getAttack()); - -} - -void goAttack(FragTrap & robot1, ScavTrap & robot2) { - - std::cout << "."; - robot1.attack(robot2.getName()); - std::cout << " "; - robot2.takeDamage(robot1.getAttack()); - std::cout << " "; - robot2.beRepaired(robot1.getAttack()); - } int main() { diff --git a/d03/ex02/robots b/d03/ex02/robots index 7eb0deda65de2df29a6d997ede33a39c7212e2a4..5dbb391516a40051e5fb7b5e039f90b17ae3452f 100755 GIT binary patch literal 53144 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 literal 38400 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 YwX5i8nrqt?5P4OnsLXLOxT@^G0gI@ukpKVy