Vous êtes sur la page 1sur 6

Aller au contenu

Choisir la langue
Aller à la recherche

Accueil > Forum > Site Web > PHP > Jeu de combat en PHP ( Pas du tuto )
Liste des forums
Jeu de combat en PHP ( Pas du tuto )
Sujet résolu
ToinouPHP

21 novembre 2013 à 12:35:26


Bonjour, j'essaye de réaliser un jeu de combat avec dégâts dépendant de la force.

Je suis un "débutant +" alors j'essaye de trouver moi même, comment réaliser le
code, mais la j'ai un petit soucis, c'est pour la montée de niveau.

Si on perd, c'est l'adversaire qui gagne de l'expérience, et si on gagne, c'est


nous qui en gagnons. ( Logique )

J'ai donc fais :

1
2
3
4
5
6
7
8
9
10
// Si on perd
$req = $bdd->prepare("UPDATE users SET experience = :experience WHERE id = :id");
$victime_xp = $victime->experience +10;
$req->execute(array('experience' => $victime_xp, 'id' =>
$victime->id));

// Si on gagne

$req = $bdd->prepare("UPDATE users SET experience = :experience WHERE id = :id");


$attaquant_xp = $attaquant->experience +10;
$req->execute(array('experience' => $attaquant_xp, 'id' =>
$attaquant->id));
Je pensais qu'en utilisant le

1
$victime_xp = $victime->experience +10;
Cela fonctionnerais, mais non :/

Comment faire pour ajouter +10 à une valeur ?

PS : Mes erreurs sont Undefined property: stdClass::$experience in C:\wamp\www\


combat\fight.php on line 36

Et même erreur pour ligne 48, qui sont respectivement :

1
2
3
$victime_xp = $victime->experience +10;
// et
$attaquant_xp = $attaquant->experience +10;
-Edité par ToinouPHP 21 novembre 2013 à 12:37:09

Fractaliste

21 novembre 2013 à 13:01:20


Tu dois avoir une classe joueur quelque part. Et les variables $victime et
$attaquant sont des instances de cette classe.

Les bonnes pratiques :

Dans ta classe joueur les attributs doivent être en général "protected"


(http://php.net/manual/fr/language.oop5.visibility.php)

Et pour y accéder tu le fais via des méthodes appelées les getters et setters.

Typiquement dans ton cas :

1
2
3
4
5
6
7
8
9
10
11
class joueur {
protected $experience = 0;

public getExperience(){
return $this->experience;
}

public setExperience($valeur){
$this->experience = $this->experience + $valeur;
}
}
Et donc pour donner de l'expérience à ton joueur au cours du jeu tu feras :

1
2
$victime->setExperience(-10);
$attaquant->setExperience(+10);
Après on peut faire comme tu le faisais moyennant la correction de syntaxe. Mais
faut prendre les bonnes habitudes dès maintenant. L'avantage des getters et setters
c'est que ça centralise les traitements (par exemple si ton joueur gagne 1 niveau
il suffit de le prendre en compte dans le setter plutôt qu'à chaque fois que tu
donnes de l'expérience au cours de ton jeu).

-Edité par Fractaliste 21 novembre 2013 à 13:03:40

Dans le monde il y a 10 sortes de personnes. Celles qui comprennent le binaire, et


les autres.
ToinouPHP

21 novembre 2013 à 13:50:27


Je n'utilise pas le POO...

Oui, j'ai honte de le dire, et je sais que cela ne fais pas très pro, mais
j'utilise simplement des while... ><

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<?php
session_start();
include "config.php";
$bdd = new PDO('mysql:host='.$host.';dbname='.$db, $db_user, $db_password);

if (isset($_GET['user']))
{
$req = $bdd->prepare("SELECT * FROM users WHERE username = :id");
$req->execute(array('id' => $_GET['user']));
while ($data = $req->fetch(PDO::FETCH_OBJ))
{

$req = $bdd->prepare("SELECT * FROM persos WHERE id_user = :id");


$req->execute(array('id' => $data->id));
while ($victime = $req->fetch(PDO::FETCH_OBJ))
{
$req = $bdd->prepare("SELECT * FROM persos WHERE id_user = :id");
$req->execute(array('id' => $_SESSION['id']));
while ($attaquant = $req->fetch(PDO::FETCH_OBJ))
{
$degats_a = $attaquant->foorce * rand(1,5);
$degats_v = $victime->foorce * rand(1,5);
$req = $bdd->prepare("UPDATE persos SET vie = :vie WHERE id
= :id");
$req->execute(array('vie' => -$degats_a, 'id' => $victime->id));
$req = $bdd->prepare("UPDATE persos SET vie = :vie WHERE id
= :id");
$req->execute(array('vie' => -$degats_v, 'id' => $attaquant->id));
if ($attaquant->vie < 0)
{
echo "Vous avez perdu.";
$req = $bdd->prepare("UPDATE persos SET vie = :vie WHERE id
= :id");
$req->execute(array('vie' => 200, 'id' => $attaquant->id));
$req = $bdd->prepare("UPDATE persos SET vie = :vie WHERE id
= :id");
$req->execute(array('vie' => 200, 'id' => $victime->id));
$req = $bdd->prepare("UPDATE users SET experience = :experience
WHERE id = :id");
$victime_xp = $victime->experience + 10;
$req->execute(array('experience' => $victime_xp, 'id' =>
$victime->id));
echo "<a href='profil.php?user=".
$_SESSION['pseudo']."'>Retour</a>";

}
if ($victime->vie < 0)
{
echo "Vous avez gagné.";
$req = $bdd->prepare("UPDATE persos SET vie = :vie WHERE id
= :id");
$req->execute(array('vie' => 200, 'id' => $attaquant->id));
$req = $bdd->prepare("UPDATE persos SET vie = :vie WHERE id
= :id");
$req->execute(array('vie' => 200, 'id' => $victime->id));
$req = $bdd->prepare("UPDATE users SET experience = :experience
WHERE id = :id");
$attaquant_xp = $attaquant->experience + 10;
$req->execute(array('experience' => $attaquant_xp, 'id' =>
$attaquant->id));
echo "<a href='profil.php?user=".
$_SESSION['pseudo']."'>Retour</a>";

}
}

}
}

?>

Fractaliste

21 novembre 2013 à 13:54:31


Pour un jeu de ce style tu devrais utiliser la POO.

Fait un var_dump($victime) pour voir le contenu de ton objet (parce que tu


l'utilises quand même avec tes PDO::FETCH_OBJ, alors autant l'utiliser jusqu'au
bout...)

Dans le monde il y a 10 sortes de personnes. Celles qui comprennent le binaire, et


les autres.
ToinouPHP

21 novembre 2013 à 14:17:37


Ca me donne cela :

1
2
3
4
5
6
object(stdClass)[2]
public 'id' => string '2' (length=1)
public 'id_user' => string '2' (length=1)
public 'nom' => string 'LudoNoob' (length=8)
public 'vie' => string '-60' (length=3)
public 'foorce' => string '20' (length=2)
Fractaliste

21 novembre 2013 à 14:23:42


Donc ça explique ton problème, quand tu essayes de faire :
1
$victime->experience
et bien ça te renvoi une erreur vu que l'objet $victime ne contient pas d'attribut
'experience' comme tu as pu le voir avec le var_dump.

J'ai l'impression que tu essayes de modifier un champ de ta table users alors que
tu travaillais avec un champ de la table persos.

-Edité par Fractaliste 21 novembre 2013 à 14:25:39

Dans le monde il y a 10 sortes de personnes. Celles qui comprennent le binaire, et


les autres.
Pitet

21 novembre 2013 à 14:24:27


Salut,

Le message d'erreur est claire : l'attribut experience n'est pas définie dans ton
objet.

Sinon ta syntaxe pour ajouter +10 d'expérience est correcte, dans le cas où les
variables existent évidemment.

ToinouPHP

21 novembre 2013 à 14:54:53


Fractaliste a écrit:

J'ai l'impression que tu essayes de modifier un champ de ta table users alors que
tu travaillais avec un champ de la table persos.

C'est exactement ça ! Merci ><

J'ai honte.

Jeu de combat en PHP ( Pas du tuto )

Editeur ● Markdown

OPENCLASSROOMS

Qui sommes-nous ?
Financements
Expérience de formation
Forum
Blog
Presse
OPPORTUNITÉS

AIDE

POUR LES ENTREPRISES

EN PLUS

Français

Vous aimerez peut-être aussi