add: ex01

This commit is contained in:
Camille Chauvet 2023-08-07 20:12:51 +00:00
parent 4f3824ac2a
commit 1f7dc85823
6 changed files with 251 additions and 0 deletions

25
ex01/Makefile Normal file
View File

@ -0,0 +1,25 @@
CXX = c++
CPPFLAGS = -std=c++98 -Wall -Wextra -Werror -g
SRCDIR = src
OBJDIR = obj
NAME = ex01
SRCS = $(wildcard $(SRCDIR)/*.cpp)
OBJS = $(patsubst $(SRCDIR)/%.cpp,$(OBJDIR)/%.o,$(SRCS))
all: $(NAME)
$(OBJDIR)/%.o: $(SRCDIR)/%.cpp
mkdir -p obj
$(CXX) $(CPPFLAGS) -c $< -o $@
$(NAME): $(OBJS)
$(CXX) $(CPPFLAGS) $^ -o $@
clean:
rm -rf $(OBJDIR)/*.o
fclean: clean
rm -fr $(NAME)
re: fclean all

96
ex01/src/ClapTrap.cpp Normal file
View File

@ -0,0 +1,96 @@
#include "ClapTrap.hpp"
#include <iostream>
ClapTrap::ClapTrap():
_name(""),
_life(10),
_energy(10),
_damage(0)
{
std::cout << "ClapTrap()" << std::endl;
}
ClapTrap::ClapTrap(const std::string& name):
_name(name),
_life(10),
_energy(10),
_damage(0)
{
std::cout << "ClapTrap(" << name << ")" << std::endl;
}
ClapTrap::ClapTrap(const ClapTrap& src)
{
std::cout << "ClapTrap(ClapTrap)" << std::endl;
*this = src;
}
ClapTrap::~ClapTrap()
{
std::cout << "~ClapTrap()" << std::endl;
}
ClapTrap& ClapTrap::operator=(const ClapTrap& src)
{
this->_name = src._name;
this->_life = src._life;
this->_energy = src._energy;
this->_damage = src._damage;
return *this;
}
void ClapTrap::beRepaired(unsigned int amount)
{
if (this->_life == 0 || this->_energy == 0)
{
std::cerr << "error: ClapTrap " << this->_name << " dead" << std::endl;
return;
}
this->_life += amount;
this->_energy--;
std::cerr << "ClapTrap " << this->_name << " beRepaired causing life is now " << this->_life << std::endl;
}
void ClapTrap::takeDamage(unsigned int amount)
{
if (this->_life == 0 || this->_energy == 0)
{
std::cerr << "error: ClapTrap " << this->_name << " dead" << std::endl;
return;
}
this->_life -= amount;
std::cout << "ClapTrap " << this->_name << " be attacked causing " << amount << " points of damage!" << std::endl;
}
void ClapTrap::attack(const std::string &target)
{
if (this->_life == 0 || this->_energy == 0)
{
std::cerr << "error: ClapTrap " << this->_name << " dead" << std::endl;
return;
}
this->_energy--;
std::cerr << "ClapTrap " << this->_name << " attacks " << target << ", causing " << this->_damage << " points of damage" << std::endl;
}
const std::string& ClapTrap::getName() const
{
return this->_name;
}
int ClapTrap::getLife() const
{
return this->_life;
}
int ClapTrap::getEnergy() const
{
return this->_energy;
}
int ClapTrap::getDamage() const
{
return this->_damage;
}

29
ex01/src/ClapTrap.hpp Normal file
View File

@ -0,0 +1,29 @@
#pragma once
#include <string>
class ClapTrap
{
protected:
std::string _name;
int _life;
int _energy;
int _damage;
public:
ClapTrap();
ClapTrap(const ClapTrap& src);
ClapTrap(const std::string& name);
virtual ~ClapTrap();
ClapTrap &operator=(const ClapTrap& src);
virtual void attack(const std::string& target);
void takeDamage(unsigned int amount);
void beRepaired(unsigned int amount);
const std::string& getName() const;
int getLife() const;
int getEnergy() const;
int getDamage() const;
};

60
ex01/src/ScavTrap.cpp Normal file
View File

@ -0,0 +1,60 @@
#include "ScavTrap.hpp"
#include "ClapTrap.hpp"
#include <iostream>
#include <string>
ScavTrap::ScavTrap()
{
this->_name = "";
this->_life = 100;
this->_energy = 50;
this->_damage = 20;
std::cout << "ScavTrap()" << std::endl;
}
ScavTrap::ScavTrap(const std::string& name)
{
this->_name = name;
this->_life = 100;
this->_energy = 50;
this->_damage = 20;
std::cout << "ScavTrap(" << name << ")" << std::endl;
}
ScavTrap::ScavTrap(const ScavTrap& src): ClapTrap(src)
{
*this = src;
std::cout << "ScavTrap(ScavTrap)" << std::endl;
}
ScavTrap::~ScavTrap()
{
std::cout << "~ScavTrap()" << std::endl;
}
ScavTrap& ScavTrap::operator=(const ScavTrap &src)
{
this->_life = src._life;
this->_name = src._name;
this->_energy = src._energy;
this->_damage = src._damage;
return *this;
}
void ScavTrap::guardGate()
{
std::cout << "ScavTrap " << this->_name << " turn in Gate keeper mode" << std::endl;
}
void ScavTrap::attack(const std::string& target)
{
if (this->_life == 0 || this->_energy == 0)
{
std::cerr << "error: ScavTrap " << this->_name << " dead" << std::endl;
return;
}
this->_energy--;
std::cerr << "ScavTrap " << this->_name << " attacks " << target << ", causing " << this->_damage << " points of damage" << std::endl;
}

20
ex01/src/ScavTrap.hpp Normal file
View File

@ -0,0 +1,20 @@
#pragma once
#include "ClapTrap.hpp"
#include <string>
class ScavTrap: public ClapTrap
{
public:
ScavTrap();
ScavTrap(const std::string& name);
ScavTrap(const ScavTrap& src);
~ScavTrap();
ScavTrap& operator=(const ScavTrap& src);
void guardGate();
void attack(const std::string& target);
};

21
ex01/src/main.cpp Normal file
View File

@ -0,0 +1,21 @@
#include "ScavTrap.hpp"
int main()
{
ClapTrap dead;
ScavTrap active ("Warrior");
ScavTrap copy (active);
active = copy;
dead.attack(active.getName());
active.attack(dead.getName());
dead.takeDamage(active.getDamage());
active.attack(dead.getName());
dead.takeDamage(active.getDamage());
active.attack(dead.getName());
dead.takeDamage(active.getDamage());
active.attack(dead.getName());
dead.takeDamage(active.getDamage());
active.attack(dead.getName());
active.takeDamage(3);
dead.beRepaired(42);
}