Manipulation d'objet [Résolu]

Signaler
Messages postés
41
Date d'inscription
lundi 23 décembre 2019
Statut
Membre
Dernière intervention
2 septembre 2020
-
Messages postés
41
Date d'inscription
lundi 23 décembre 2019
Statut
Membre
Dernière intervention
2 septembre 2020
-
Bonjour/Bonsoir(suivant votre heure),,je solicite votre aide;je suis entrain de faire une illustration de jeu video(backend en php),la logique serait que les degats de la personne frappé augmente suivant la force de la personne qui frappe.

Class Personnage
class Personnage
{
    private $_nom;
    private $_id;
    private $_degats;
    private $_forcePerso = 5;
    private $_niveau = 1;
    private $_experience;

    const CEST_MOI = 1;
    const PERSONNAGE_TUE = 4;
    const PERSONNAGE_FRAPPE = 2;
    public function __construct(array $data)
    {
        //constructeur charge lors de creation de l'objet
        //passera en parametre les donnees a la fonction hydrate
        $this ->hydrate($data);
    }
    public function hydrate(array $data)
    {
        foreach($data as $key => $value)
        {
            $method = 'set'.ucfirst($key);
            if(method_exists($this,$method))
            {
                $this->$method($value);
            }
            else
            {
                trigger_error('la fonction '.$method.' n\'existe pas',E_USER_ERROR);
            }
        }
    }
    public function frapper(Personnage $perso)
    {
        //verifions qu'on ne se frappe pas soit meme
        if($perso ->nom() == $this ->_nom)
        {
            return self::CEST_MOI;
        }
        else
        {
            return $perso->recevoirDegats();
        }
    }
    public function recevoirDegats()
    {
        $this->_degats += $this->_forcePerso;
        if($this ->_degats >= 30)
        {
            return self::PERSONNAGE_TUE;
        }
        else
        {
            return self::PERSONNAGE_FRAPPE;
        }
    }
    public function gagnerExperience(Personnage $perso)
    {
        $this->_experience += 1;
        if($this->_experience >= 5)
        {
            $this->_experience = 0;
            return $perso->gagnerNiveau();
        }
    }
    public function gagnerNiveau()
    {
        $this->_niveau += 1;
        return $this->recevoirForce();
    }
    public function recevoirForce()
    {
        if($this->_niveau > 1)
        {
            $this->_forcePerso += 5;
        }
    }
    //accesseur
    public function nom()
    {
        return $this->_nom;
    }
    public function id()
    {
        return $this->_id;
    }
    public function degats()
    {
        return $this->_degats;
    }
    public function forcePerso()
    {
        return $this->_forcePerso;
    }
    public function niveau()
    {
        return $this->_niveau;
    }
    public function experience()
    {
        return $this->_experience;
    }
    //mutateur
    public function setNom($nom)
    {
        if(!is_string($nom))
        {
            trigger_error('Un nom est demande(chaine de caracteres)',E_USER_ERROR);
        }
        else
        {
            $this->_nom = $nom;
        }
    }
    public function setId($id)
    {
        $id = (int)$id;
        if( $id == 0 )
        {
            trigger_error('Identifiant non reconnu , valeur == 0',E_USER_ERROR);
        }
        else
        {
            $this ->_id = $id;
        }
    }
    public function setDegats($degats)
    {
        $degats = (int)$degats;
        if( $degats >=0 && $degats <= 100)
        {
            $this->_degats = $degats;
        }
        else
        {
            trigger_error('le nombre de degats doit etre <= 100',E_USER_WARNING);
        }
    }
    public function setForcePerso($forcePerso)
    {
        $forcePerso = (int)$forcePerso;
        $this->_forcePerso = $forcePerso;
    }
    public function setNiveau($niveau)
    {
        $niveau = (int)$niveau;
        $this->_niveau = $niveau;
    }
    public function setExperience($experience)
    {
        $experience = (int)$experience;
        $this->_experience = $experience;
    }
}

Class PersonnagesManager
class PersonnagesManager
{
    private $_db;//objet stockant l'objet representant la connexion a la base de donnees
    //constructeur
    public function __construct($bdd)
    {
        $this -> setDb($bdd);
    }
    public function add(Personnage $perso)
    {
        //Insertion des donnees en base de donnees
        $q = $this->_db->prepare('INSERT INTO personnage(nom,forcePerso,niveau) VALUES(:name,:strength,:level)');
        $q->bindValue(':name',$perso->nom());
        $q->bindValue(':strength',$perso->forcePerso(),PDO::PARAM_INT);
        $q->bindValue(':level',$perso->niveau(),PDO::PARAM_INT);
        $q->execute();
        $perso->hydrate([
            'id'=>$this->_db->lastInsertId(),
            'degats'=>0,
            'experience'=>0
        ]);
    }
    public function update(Personnage $perso)
    {
        //modification des donnees en base avec une clause where
        $q = $this->_db->prepare('UPDATE personnage SET degats = :degats,forcePerso = :force,niveau = :niveau,experience = :experience WHERE id = :id_user');
        $q ->bindValue(':degats',$perso->degats(),PDO::PARAM_INT);
        $q ->bindValue(':force',$perso->forcePerso(),PDO::PARAM_INT);
        $q ->bindValue(':niveau',$perso->niveau(),PDO::PARAM_INT);
        $q ->bindValue(':experience',$perso->experience(),PDO::PARAM_INT);
        $q ->bindValue(':id_user',$perso->id(),PDO::PARAM_INT);
        $q ->execute();
        
    }
    public function delete(Personnage $perso)
    {
        //suppression des donnees en base avec une clause where
        $this->_db->exec('DELETE FROM personnage WHERE id='.$perso->id());
    }
    public function number()
    {
        return $this->_db->query('SELECT COUNT(*) FROM personnage')->fetchColumn(); 
    }
    public function exists($info)
    {
        //verifier si l'utilisateur existe
        if(is_int($info))
        {
            return(bool) $this->_db->query('SELECT COUNT(*) FROM personnage WHERE id='.$info)->fetchColumn();
        }
        else
        {
            $q = $this->_db->prepare('SELECT COUNT(*) FROM personnage WHERE nom=:name_verify');
            $q->execute([':name_verify'=>$info]);
            return(bool) $q->fetchColumn();
        }
    }
    public function get($info)
    {
        //retour des information d'un personnage
        //retour d'un objet
        if(is_string($info))
        {
            $q =$this->_db->prepare('SELECT * FROM personnage WHERE nom=:name_verify');
            $q->execute([':name_verify'=>$info]);
            $data_query = $q ->fetch(PDO::FETCH_ASSOC);
            return new Personnage($data_query);
        }
        else
        {
            $q = $this->_db->query('SELECT * FROM personnage WHERE id='.$info);
            $data_query = $q ->fetch(PDO::FETCH_ASSOC);
            return new Personnage($data_query);
        }
        
    }
    public function getList()
    {
        //retour des informations des personnages en base
        //retour d'un objet
        $persos=[];
        $q = $this->_db->query('SELECT * FROM personnage');
        while($data_query = $q->fetch(PDO::FETCH_ASSOC))
        {
            $persos[]= new Personnage($data_query);
        }
        return $persos;
    }
    public function setDb($bdd)
    {
        //creation de la variable _db
        $this->_db = $bdd;
    }
}

Controller frontale
if($manager ->exists((int)$_GET['attack']))
        {
            $persoAFrapper = $manager ->get((int)$_GET['attack']);
            $retour = $perso->frapper($persoAFrapper);
        
            switch($retour)
            {
                case Personnage::CEST_MOI :
                    echo 'Impossible de vous frapper';
                    break;
                case Personnage::PERSONNAGE_FRAPPE :
                    echo 'Le personnage est FRAPPE';
                    $manager ->update($perso);
                    $manager ->update($persoAFrapper);
                    break;
                case Personnage::PERSONNAGE_TUE :
                    echo 'Le personnage est tue (Niveau Actuel :',$perso->niveau(),')';
                    $perso->gagnerExperience($perso);
                    $manager ->update($perso);
                    $manager ->delete($persoAFrapper);
                    break;
                
            }
        }

Quand le joueur atteint un niveau superieur comme vous pouvez le voir sa force devrait augmenté de 5(c'est fait),le probleme c'est que quand je frappe avec une force de 10 les degats se font toujours avec 5de valeurs(la valeur de la force initiale),je n'arrive pas avoir ou j'ai fais l'erreur.
La partie du code qui devrait vous interesser
public function recevoirDegats()
    {
        $this->_degats += $this->_forcePerso;
        if($this ->_degats >= 30)
        {
            return self::PERSONNAGE_TUE;
        }
        else
        {
            return self::PERSONNAGE_FRAPPE;
        }
    }

Merçi de m'aider,cordialement Bill-Billion ;

2 réponses

Messages postés
49
Date d'inscription
samedi 2 juin 2018
Statut
Membre
Dernière intervention
10 août 2020
12
Salut,

c'est parce que celui qui reçoit les dégâts, à des dégâts en fonction de sa force et non de celui le force de l'attaquant.

public function recevoirDegats(Personnage $attaquant)
    {
        $this->_degats += $attaquant->forcePerso();

        if($this ->_degats >= 30)
        {
            return self::PERSONNAGE_TUE;
        }
        else
        {
            return self::PERSONNAGE_FRAPPE;
        }
    }



Bonne soirée
Messages postés
41
Date d'inscription
lundi 23 décembre 2019
Statut
Membre
Dernière intervention
2 septembre 2020

Merçi je viens de le voir,je vais essayer de le corriger
Messages postés
41
Date d'inscription
lundi 23 décembre 2019
Statut
Membre
Dernière intervention
2 septembre 2020

Bonsoir,desolé j'avais pas assez de temps pour poster la réponse (merçi à toi Kernel)

$persoAFrapper->recevoirDegats($perso);

posté au cas où une personne aura ce même problème