JeuWeb - Crée ton jeu par navigateur
Ramasser un objet - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Ramasser un objet (/showthread.php?tid=5191)

Pages : 1 2 3


Ramasser un objet - sawk - 23-01-2011

Bonsoir,
Après quelques temps au service de php et à la création de divers sites... J'ai eu la soudaine envie de créer un petit jeu par navigateur. Ce projet n'est restreints qu'à ma famille pour le moment. Bref, le système est assez simplet : On choisis entre un dragon, un dinosaure, un troll ou un centaure. Ensuite on à plusieurs action disponible (du type acheter, fouiller, se promener, combattre...). Ces actions ne sont faisable qu'a certains lieu. Actuellement je code la partie qui permet de fouiller. Comme je l'ai dit le code est très très simpliste. Mais j'ai un petit soucis. En fait, je cherche à ajouter 1 objet quand on fouille par terre mais l'update ne fonctionne pas... J'ai essayer en ne mettant pas +1 mais genre 35, et là, il UPDATE bien...

voici le code de la page :

<?php
//haute de page
include('structure/header.php');
//menu du site
include 'structure/identifiants.php';
include('structure/menu.php');

$_GET['m'] = (int) $_GET['m'];
$nombre = "";
?>
<div id="texte"><div id="overflow">
<div class="cadre"><div class="titre"></div><div class="marge_interne">

<!-- Début de la zone de texte -->
<?php
if($_GET['m'] == 1)
{
?>
<div id="T_ADA">Ici c'est la clairière ! Tu peux y combattre des <br>monstres sauvage.</div>
<table width="700">
<tr>
<td><a href="lieu.php?m=1&amp;a=promener" class="TD">se promener</a></td>
<td><a href="lieu.php?m=1&amp;a=fouiller" class="TD">fouiller par terre</a></td>
<td><a href="lieu.php?m=1&amp;a=voir" class="TD">scruter les alentours</a></td>
</tr>
</table>
<br>
<?php
$action = (isset($_GET['a']))?htmlspecialchars($_GET['a']):'';
switch($action)
{
case "promener":

break;
case "fouiller":
//définition d'un nombre aléatoire
$min = 0;
$max = 0;
$trouve = mt_rand($min, $max);
switch($trouve)
{
case "0":

$trouve = "potion de soin";
$objet = "1";
$nombre +=1;

$query=$db->prepare('UPDATE sac SET id_objet = :objet, nombre = :nombre WHERE id_membre = :id_membre');
$query->execute(array(
'id_membre' => $id,
'objet' => $objet,
'nombre' => $nombre
))or die(print_r($db->errorInfo()));

break;
}
?>
Tu fouille par terre...<br>
En fouillant tu trouves <?php echo '<strong>'.$nombre.'</strong> '.$trouve; ?><br><br>
<?php
break;
case "voir":

break;
}
?>
<br>
<?php
}
?>
<!-- Fin de la zone de texte -->

</div></div>
</div></div>
<?php
//bas de page
include('structure/footer.php');
?>

voici les tables utiliser sur le système d'inventaire et d'objet :

--
-- Structure de la table `sac`
--

CREATE TABLE IF NOT EXISTS `sac` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`id_membre` int(11) NOT NULL,
`id_objet` int(11) NOT NULL,
`nombre` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

--
-- Contenu de la table `sac`
--

INSERT INTO `sac` (`id`, `id_membre`, `id_objet`, `nombre`) VALUES
(1, 1, 1, 1);


--
-- Structure de la table `objet`
--

CREATE TABLE IF NOT EXISTS `objet` (
`id` int(11) NOT NULL,
`objet` varchar(100) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
-- Contenu de la table `objet`
--

INSERT INTO `objet` (`id`, `objet`) VALUES
(1, 'Potion de soin');

Si ce système n'est pas très bien, vous pouvez m'orienté sur une meilleur façon ?


RE: Ramasser un objet - niahoo - 23-01-2011

hello,

ça vient peut-être pas de là mais fais gaffe à tes variables.

$nombre contient un entier, tu l'initialises avec $nombre="" au lieu de $nombre=0

mt_rand($min, $max) renvoie un entier, donc ton case "0" n'est pas correct

En php, hormis quelques surprises, ça fonctionne quand même généralement, mais relis bien ton code et tu trouveras peut-être ton bug


RE: Ramasser un objet - sawk - 23-01-2011

Je suis complètement paumé... Je penser pas que j'allais ramer autant ! Le système fonctionne maintenant (merci niahoo)... Mais le truc c'est que c'est mal organiser... Je sais pas trop comment faire, si vous pouviez m'eclairé sur un système inventaire+objet se serait cool. C'est surtout au niveau des requête. Car côté code, je répète, ça marche.


RE: Ramasser un objet - Colmea - 24-01-2011

Je pense que tu es dans le bon pour ton système d'inventaire (je parle de la structure de la DB).
Maintenant il faudrait créer des relations entre le champ objet_id et le champ id de ta table objet Smile .

Tu pourrais aussi rajouter un champ dans la table objet qui donnerait un pourcentage de chance de ramasser l'objet. Ainsi, au lieu de faire un "bête" rand sur deux nombres identiques à chaque fois, tu remplaces le $max par la valeur de ton champ. Plus cette valeur est haute, plus l'objet est difficile à ramasser, et inversement.

Rajouter aussi plusieurs champs dans la table objet serait un plus.
Notamment remplacer le champ 'objet' par 'nom' serait plus explicite.
Ajouter un champ description, image, effet, etc ...


RE: Ramasser un objet - niahoo - 24-01-2011

La première chose à faire je pense ce serait de créer plein de fonctions qui contiennent chaque requête,

une qui te renvoie l'inventaire à partir d'un id de joueur, une qui ajoute un objet à un joueur, une qui renvoie le nombre d'objets possédés par un joueur en fonction d'un id joueur et d'un id item, une qui vérifie qu'un joueur à bien un objet, etc..

C'est tout bête, mais ensuite, dans ton code, au lieu d'avoir toutes les requêtes qui se baladent, tu auras de simple appels à des fonction, donc un code plus clair et plus facile à structurer.

Un autre truc, la deuxième personne du singulier prends un s à la fin, donc "tu fouilles par terre ..."


RE: Ramasser un objet - sawk - 24-01-2011

Oui les erreurs d'otrho... ^^"

Pour clarifier tout ça, les fonctions je n'en fais presque jamais... Alors bon, autant dire que faut que je me penche dessus pour faire tout ça.

Ensuite, le problème est presque résolu (pressque ?) oui car le soucis c'est que je fait un INSERT ou UN DUPLICATE KEY UPDATE selon si l'objet existe déjà dans le sac...
Le problème c'est que j'ai l'erreur suivante :
Array ( [0] => 00000 [1] => [2] => ) 1

(je ne sais pas ce qu'elle représente pour PDO)


RE: Ramasser un objet - christouphe - 24-01-2011

Pour ton objet dupliqué, il faut que tu te poses la question: "Un joueur a-t-il le droit de posséder plusieurs objet de même type ?"

Si oui => insert avec un autre ID (auto), sinon une fonction parcourant l'inventaire à la recherche de l'objet "clone" (PHP) AVANT de taper dans la base.

Solution numéro 3: faire un index UNIQUE(id_membre,id_objet)...mais c'est à voir et pas des plus simple ensuite pour la maintenance.


RE: Ramasser un objet - sawk - 24-01-2011

Wow je me rend compte que c'est pas si simple de faire un jeu >< Je suis pas décourager juste bouche bée... Plus logique que faire un espace membre ou encore un forum...

Existe-il une documentation ou des tutoriaux sur les fonctions de bases (inventaire, combats... etc) parce que je sens que je suis pas sortis de l'auberge !


RE: Ramasser un objet - christouphe - 24-01-2011

j'aurais tendance à dire "NON, juste une feuille et un crayon, un peu de réflexion et BEAUCOUP de café" Wink

Mais bon là c'est l'inventaire, moi ce que j'ai fait, c'est un modèle de la réalité dans un premier temps:

Un sac, des objets, un propriétaire du sac / des objets comme toi. Ensuite, je me suis posé la question, un seul exemplaire ou plusieurs ?? etc...Comme dans la vrai vie Wink


RE: Ramasser un objet - sawk - 24-01-2011

Bon en me basant sur un index UNIQUE
J'ai ma table qui ressemble à ça :

[Image: 001.png]

Il faudrait donc que j'ai un truc qui ressemble à ça (en me basant sur le fait que je doit mettre ç chaque fois l'id du membre pour tel id_objet

[Image: 002.png]

C'est bien ça ?