JeuWeb - Crée ton jeu par navigateur
[De nouveau Regle] Petit probleme chiant - 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 : [De nouveau Regle] Petit probleme chiant (/showthread.php?tid=1422)



[De nouveau Regle] Petit probleme chiant - Istarie - 05-07-2007

Bonjour,

Je crée un script qui permet d'afficher un liste de batiment qui se trouve dans la bdd.

Citation :CREATE TABLE info_batiment (
ID_batiment int(10) unsigned NOT NULL auto_increment,
nom varchar(250) NOT NULL default '',
niveau_maxi int(10) NOT NULL default '0',
nourriture int(10) NOT NULL default '0',
pierre int(10) NOT NULL default '0',
bois int(10) NOT NULL default '0',
or int(10) NOT NULL default '0',
image varchar(250) NOT NULL default '',
KEY ID_batiment (ID_batiment)
) TYPE=MyISAM;

Et j'ai une autre table qui permet de regrouper les niveau de chaque bâtiment au joueur respectif.

Citation :CREATE TABLE batiment (
ID_membre int(10) unsigned NOT NULL auto_increment,
ID_batiment int(10) unsigned NOT NULL default '0',
niveau int(10) NOT NULL default '0',
KEY ID_batiment (ID_membre)
) TYPE=MyISAM;

Voila mon code :

Code PHP :
<?
$batiment
= mysql_query('SELECT * FROM info_batiment');
while (
$donnee = mysql_fetch_array($batiment)) {

$royaume = mysql_query('SELECT * FROM batiment WHERE ID_membre = "'.$ID_membre.'" AND ID_batiment = "'.$donnee['ID_batiment'].'"');
$nb = mysql_num_rows($royaume);
if (!
$nb) {
$niveau_actuelle = 0;
$niveau = 1;
}
else {
$niveau_actuelle = $donnee_batiment['niveau'];
$niveau = $donnee_batiment['niveau'] + 1;
}

$nourriture = $niveau * $donnee['nourriture'];
$pierre = $niveau * $donnee['pierre'];
$or = $niveau * $donnee['or'];
$bois = $niveau * $donnee['bois'];

echo
'<tr><td>'.$donnee['nom'].'<br>';
echo
'<img src="images/'.$donnee['image'].'" width="50" height="50"></td>';
echo
'<td>'.$donnee['nourriture'].' Nourriture '.$donnee['pierre'].' Pierre '.$donnee['or'].' Or '.$donnee['bois'].' Bois</td>';
echo
'<td>';

if (
$donnees['nourriture'] > $donnee['nourriture'] && $donnees['bois'] > $donnee['bois'] && $donnees['or'] > $donnee['or'] && $donnees['pierre'] > $donnee['pierre'] ) {

$donnee_batiment = mysql_fetch_array($royaume);
if (
$niveau >= $donnee['niveau_maxi']) {
echo
'';
}
else {
echo
'<form method="post" action="verif_batiment.php?id='.$donnee['ID_batiment'].'"><input type="submit" value="Evoluer niveau '.$niveau.'"></form>';
echo
$donnee['ID_batiment'];
}
}
else {
echo
'Pas assez de ressources';
}
echo
'</td>';
echo
'</tr>';
}
?>

[EDIT]
Ce que je devrais avoir
ID_batiment 1 --> Ferme Niveau 3
ID_batiment 2 --> Carrière de Pierre Niveau 4
Ce que j'ai
ID_batiment 1 --> Ferme Niveau 1
ID_batiment 2 --> Carrière de Pierre Niveau 3


RE: Petit probleme chiant - Roworll - 05-07-2007

[Message édité plusieurs fois mais je suis trèèèèès fatigué...]
Le test
Code PHP :
<?php 
if (!$nb) {
$niveau_actuelle = 0;
$niveau = 1;
} else {
$niveau_actuelle = $donnee_batiment['niveau'];
$niveau = $donnee_batiment['niveau'] + 1;
}
est en dehors de la boucle d'affectation du recordset $donnee_batiment.
Du coup, tu as un décalage entre le niveau du batiment et ce que tu affiches.

De plus, tu fais trop de requêtes sur la BDD.
1 requête pour avoir les batiments + une requtete pour chaque batiment dans la liste.
Le mieux à mon avis est faire une seule requête avec une jointure.

Petit squelette rapide :
Code PHP :
<?php 
$sql
='SELECT * FROM info_batiment as i LEFT JOIN batiment as b ON b.ID_batiment = i.ID_Batiment WHERE ID_membre = "'.$ID_membre.'"';
$rsB=mysql_query($sql) or die(mysql_error());
while(
$donnee=mysql_fetch_assoc($rsB)){
if(
intVal($donnee['niveau']==0){
// Batiment non construit
$niveau_actuel = 0;
$niveau = 1;
} else {
// Batiment déjà construit auparavant
$niveau_actuel = $donnee['niveau'];
$niveau = $niveau_actuel + 1;
}
// Calcul des valeurs pour l'upgrade
$nourriture = $niveau * $donnee['nourriture'];
$pierre = $niveau * $donnee['pierre'];
$or = $niveau * $donnee['or'];
$bois = $niveau * $donnee['bois'];

echo
'<tr><td>'.$donnee['nom'].'<br>';
echo
'<img src="images/'.$donnee['image'].'" width="50" height="50"></td>';
echo
'<td>'.$donnee['nourriture'].' Nourriture '.$donnee['pierre'].' Pierre '.$donnee['or'].' Or '.$donnee['bois'].' Bois</td>';
echo
'<td>';

if (
$donnees['nourriture'] > $donnee['nourriture'] && $donnees['bois'] > $donnee['bois'] && $donnees['or'] > $donnee['or'] && $donnees['pierre'] > $donnee['pierre'] ) {
if (
$niveau >= $donnee['niveau_maxi']) {
echo
'';
} else {
echo
'<form method="post" action="verif_batiment.php?id='.$donnee['ID_batiment'].'"><input type="submit" value="Evoluer niveau '.$niveau.'"></form>';
echo
$donnee['ID_batiment'];
}
} else {
echo
'Pas assez de ressources';
}
echo
'</td>';
echo
'</tr>';
}

Je ne garantis pas le résultat.. je dors debout...


RE: Petit probleme chiant - Istarie - 05-07-2007

Il y avais un petit oublie de parenthèse ici
Code PHP :
<?php 
if (intVal($donnee['niveau']==0)) {
Mais sinon sa marche très bien merci. Grâce a toi je vais apprendre comment sa marche les jointure.


RE: [Plus Regle] Petit probleme chiant - Istarie - 06-07-2007

Désolée du double post.

J'ai encore un petit problème avec se script c'est que la table 'batiment' s'ajoute que quand il a évoluer une fois le bâtiment. Donc au départ tout les bâtiment sont a 0 Niveau donc la table bâtiment reste vide tant que le joueur n'évolue pas le bâtiment. Avec ce script les bâtiments ne s'affiche pas tous : il affiche que les bâtiment déjà évoluer mais quelqu'un aurait une idée pour débloquer sa sans refaire le script


RE: [Plus Regle] Petit probleme chiant - Roworll - 06-07-2007

Option 1
Je pense qu'en transformant la requête avec un truc du style
'SELECT * FROM info_batiment as i LEFT JOIN batiment as b ON b.ID_batiment = i.ID_Batiment AND ID_membre = "'.$ID_membre.'"'
ça devrait aller mieux.

Option 2 (si l'option 1 ne fonctionne pas)
'SELECT * FROM info_batiment as i LEFT JOIN batiment as b ON b.ID_batiment = i.ID_Batiment WHERE (ID_membre = "'.$ID_membre.'" OR ID_membre is NULL)'

Explications :
La première partie de la requête
SELECT * FROM info_batiment as i LEFT JOIN batiment as b ON b.ID_batiment = i.ID_Batiment
renvoie bien tous les batiments même si le joueur n'en possède pas (l'utilité du left join)
Manque de pot, le WHERE vient filtrer le résultat sur les lignes ayant un ID_membre renseigné.
Si un joueur n'a pas le batiment, la zone ID_Membre sera égale à NULL et la ligne sera exclue par le where

Pour corriger ce problème, il y a deux approches.
La première (l'option 1) intègre l'ID_Membre dans la jointure. Le Where ne joue donc plus le rôle de filtre mais c'est la jointure qui fait maintenant le lien sur ID_Membre.
La 2e (option 2) étend la portée du Where en disant au moteur SQL de récupérer non seulement les lignes avec un ID_Membre correspondant mais aussi celles avec un ID_Membre à NULL. De cette manière, tu recevras ce que tu veux.


RE: [Plus Regle] Petit probleme chiant - Istarie - 06-07-2007

Merci c'est bon sa marche maintenant j'ai fait tout les test normalement j'en est fini avec cette partie. Merci.