From a2bd7db6a94d4acdcf3a73a03c4657dc26f2b4b5 Mon Sep 17 00:00:00 2001 From: Hugo LAMY Date: Fri, 18 Feb 2022 19:10:18 +0100 Subject: [PATCH] d03 ex02 fragtrap ok --- d03/ex02/ClapTrap.cpp | 170 ++++++++++++++++++++++++++++++++++++++++++ d03/ex02/ClapTrap.hpp | 49 ++++++++++++ d03/ex02/FragTrap.cpp | 30 ++++++++ d03/ex02/FragTrap.hpp | 19 +++++ d03/ex02/Makefile | 66 ++++++++++++++++ d03/ex02/ScavTrap.cpp | 30 ++++++++ d03/ex02/ScavTrap.hpp | 20 +++++ d03/ex02/color.h | 24 ++++++ d03/ex02/main.cpp | 154 ++++++++++++++++++++++++++++++++++++++ d03/ex02/robots | Bin 0 -> 38400 bytes 10 files changed, 562 insertions(+) create mode 100644 d03/ex02/ClapTrap.cpp create mode 100644 d03/ex02/ClapTrap.hpp create mode 100644 d03/ex02/FragTrap.cpp create mode 100644 d03/ex02/FragTrap.hpp create mode 100644 d03/ex02/Makefile create mode 100644 d03/ex02/ScavTrap.cpp create mode 100644 d03/ex02/ScavTrap.hpp create mode 100644 d03/ex02/color.h create mode 100644 d03/ex02/main.cpp create mode 100755 d03/ex02/robots diff --git a/d03/ex02/ClapTrap.cpp b/d03/ex02/ClapTrap.cpp new file mode 100644 index 0000000..5c7246d --- /dev/null +++ b/d03/ex02/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/ex02/ClapTrap.hpp b/d03/ex02/ClapTrap.hpp new file mode 100644 index 0000000..d1d3259 --- /dev/null +++ b/d03/ex02/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/ex02/FragTrap.cpp b/d03/ex02/FragTrap.cpp new file mode 100644 index 0000000..51f1d09 --- /dev/null +++ b/d03/ex02/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/ex02/FragTrap.hpp b/d03/ex02/FragTrap.hpp new file mode 100644 index 0000000..bc3c68d --- /dev/null +++ b/d03/ex02/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/ex02/Makefile b/d03/ex02/Makefile new file mode 100644 index 0000000..f4fc536 --- /dev/null +++ b/d03/ex02/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/ex02/ScavTrap.cpp b/d03/ex02/ScavTrap.cpp new file mode 100644 index 0000000..df8bc14 --- /dev/null +++ b/d03/ex02/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/ex02/ScavTrap.hpp b/d03/ex02/ScavTrap.hpp new file mode 100644 index 0000000..9618d2b --- /dev/null +++ b/d03/ex02/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/ex02/color.h b/d03/ex02/color.h new file mode 100644 index 0000000..e313f5f --- /dev/null +++ b/d03/ex02/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/ex02/main.cpp b/d03/ex02/main.cpp new file mode 100644 index 0000000..fc40e66 --- /dev/null +++ b/d03/ex02/main.cpp @@ -0,0 +1,154 @@ +#include "ScavTrap.hpp" +#include "FragTrap.hpp" + +void goAttack(ClapTrap & robot1, ClapTrap & robot2) { + + std::cout << "."; + robot1.attack(robot2.getName()); + 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() { + + 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/ex02/robots b/d03/ex02/robots new file mode 100755 index 0000000000000000000000000000000000000000..7eb0deda65de2df29a6d997ede33a39c7212e2a4 GIT binary patch literal 38400 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 YwX5i8nrqt?5P4OnsLXLOxT@^G0gI@ukpKVy literal 0 HcmV?d00001