JeuWeb - Crée ton jeu par navigateur
[Résolu] Conditions complexe - 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 : [Résolu] Conditions complexe (/showthread.php?tid=229)



[Résolu] Conditions complexe - Single Dark - 09-04-2008

Voilà, je suis en train de coder mon système pour afficher les batiments. Jusqu'a là c'est facile.

Je peut afficher un batiments si les conditions de constructions sont correctes.

Mais j'ai un souci. Pour que mon système fonctionne il faut que TOUS les batiments soient entrés dans la base de donnée, or c'est hyper lourd comme truc.

Le code est plus parlant que des mots, voilà mon 'tit système, qui n'est pas optimisé :

Le contenu simplifier de la base de donnée des batiments du jeu :

sc_table_info_bat a écrit :|..ID..|..nom_bdd..|..nom...........|..condition_1..|..condition_2..|
|...1..|..mine_fer...|.Mine de Fer..|...................|....................|
|...2..|..mine_or....|.Mine d'or......|......1, 5........|....................|
|...3..|..mine_res....|.Mine..........|......1, 10.......|.........2, 5.....|

Donc la pour que la mine d'or puisse s'afficher il faut que la mine de fer soit au niveau 5.
Pour l'autre c'est le même principe, mine de fer niveau 10 et mine d'or niveau 5.

Le contenu de la table qui liste les batiments présants sur la planète du joueur :

sc_table_planete_bat a écrit :|..id_planete..|..id_batiments..|..niveau..|
|........1........|.........1..........|......10.....|
|........1........|.........2..........|......5.....|
|........2........|.........1..........|......5.....|

Içi la planète 1, dispose d'une mine de fer de niveau 10 et d'une mine d'or niveau 5.

Les requetes sql:
Code PHP :
<?php 
//
$requete_info_joueur = mysql_query('SELECT * FROM sc_table_comptes WHERE id="' . $_SESSION['id_joueur'] . '"') or die (mysql_error());
$sql_info_joueur = mysql_fetch_assoc($requete_info_joueur);
//
$requete_planete_joueur = mysql_query('SELECT * FROM sc_table_planete WHERE id_planete="'.$_SESSION['id_planete'].'" ') or die (mysql_error());
$sql_planete_joueur = mysql_fetch_assoc($requete_planete_joueur);
//
$requete_data_bat = mysql_query('SELECT * FROM sc_table_info_bat INNER JOIN sc_table_planete_bat
ON sc_table_info_bat.id = sc_table_planete_bat.id_batiments
WHERE sc_table_planete_bat.id_planete="'
.$_SESSION['id_planete'].'" ') or die(mysql_error());
//

Jusqu'à la rien de bien compliquer.

Ensuite la page qui affiche les batiments :
Code PHP :
<?php 
while ($sql_data_bat = mysql_fetch_assoc($requete_data_bat) )
{

// On creer des variables unique pour chaque batiments
${'sql_data_bat_' . $sql_data_bat['id']} = $sql_data_bat;
// Fait resortir une variable du type $sql_data_bat_2

// On listes les conditions pour chaque batiments
${'array_condi_1_' . $sql_data_bat['id']} = explode(', ', $sql_data_bat['condition_1']);
${
'array_condi_2_' . $sql_data_bat['id']} = explode(', ', $sql_data_bat['condition_2']);
// Fait resortir un array ou l'on trouve les conditions pour le batiment
// La cle ['0'] donne l'id du batiments, la cle ['1'] donne le niveau du batiments
// Fait resortir une variable du type $array_condi_1_2

//
${'condition_1_' . $sql_data_bat['id'] . '_' . ${'array_condi_1_' . $sql_data_bat['id']}['0']} = ${'array_condi_1_' . $sql_data_bat['id']}['1'];
${
'condition_2_' . $sql_data_bat['id'] . '_' . ${'array_condi_2_' . $sql_data_bat['id']}['0']} = ${'array_condi_2_' . $sql_data_bat['id']}['1'];
// Fait resortir une variable du type $condition_1_2['0']=1


if ( ${'sql_data_bat_' . ${'array_condi_1_' . $sql_data_bat['id']}['0']}['niveau'] >= ${'condition_1_' . $sql_data_bat['id'] . '_' . ${'array_condi_1_' . $sql_data_bat['id']}['0']}
&& ${
'sql_data_bat_' . ${'array_condi_2_' . $sql_data_bat['id']}['0']}['niveau'] >= ${'condition_2_' . $sql_data_bat['id'] . '_' . ${'array_condi_2_' . $sql_data_bat['id']}['0']} )
{
?>

<form action="fonctions/batiments.php?valeur=valide" method="POST">
<div id="cellule_batiments">
<p class="titre_batiments">
<span class="nom_batiments"><?php echo $sql_data_bat['nom'];?> (</span><span class="level_batiments"><?php echo $sql_data_bat['niveau']?></span><span class="nom_batiments">)</span>
</p>
<p>
<img src="<?php echo $sql_data_bat['image'] ?>" class="image_batiments"><br />
<span class="info_batiments">
Fer : <?php echo number_format(($sql_data_bat['niveau']*$sql_data_bat['prix_fer']), 0, ',', ' ');?><br />
Or : <?php echo number_format(($sql_data_bat['niveau']*$sql_data_bat['prix_or']), 0, ',', ' '); ?><br />

</span>
<input type="hidden" name="nom_bdd" value="<?php echo $sql_data_bat['nom_bdd']; ?>" />
<input type="hidden" name="niveau" value="<?php echo $sql_data_bat['niveau']; ?>" />
<input type="hidden" name="id_batiments" value="<?php echo $sql_data_bat['id_batiments']; ?>" />
<span class="action_batiments">
<input name="construire" type="submit" value="Construire niveau <?php echo $sql_data_bat['niveau']+1;?>" />
<input name="detruire" type="submit" value="Détruire niveau <?php echo $sql_data_bat['niveau'];?>" />
</form>
<form method="POST">
<input type="submit" value="Paramétrer" />
</span>
<div class="description_batiments"><?php echo $sql_data_bat['description'];?></div>
</p>
</div>
</form>

<?php

}
}
?>

Voilà, donc mon problème c'est que je voudrai lister les batiments qui repondent aux conditions de construction et qui ne sont PAS dans la table 'sc_table_planete_bat'.

Donc en gros je voudrai faire une jointure SQL qui me liste les batiments qui ne sont pas dans la table 'sc_table_planete_bat'. Pour le reste je sais faire.

Biensur j'aurai pus le faire tous seul, mais j'aurai fait une dizaine de requete, fais un demi douzaine de boucle, alors que je pense qu'il exise un moyen pour le faire. Mais là je seche.

Merci, à ceux qui jeteront un coup d'oeil.

[EDIT] Crotte, je me suis trompe de place, si un modo pouvait le mettre dans la section 'Debug' ?!? merci


RE: Conditions complexe - Mysterarts - 09-04-2008

Déplacé Smile


RE: Conditions complexe - Eluox - 10-04-2008

Salut,

J'ai pas vraiment le temps de t'aider, mais je voulais te demander, pourquoi stocker les infos de batiments dans un table, c'est pour moi, des ressources inutiles utilisés


RE: Conditions complexe - keke - 10-04-2008

Coucou,

Tout d'abord, les conditions je les mettrais sur une table à part, avec une valeur de condition par champs.

Ensuite, ce que j'ai compris, c'est faire la liste des batiments constructibles mais qui n'ont pas déjà été construit

Select * from table where (condition de batiment à construire ) and id_bat not in ( select * from table where (batiment déjà construit) )

Si ce type de construction ne marche pas, je t'encourage à faire 2 requêtes et à invalider les résultats de l'un avec les résultats de l'autre.

Bon courage !
Kéké.


RE: Conditions complexe - Argorate - 10-04-2008

Essaye dans ta requete SQL d'utiliser une sous requete avec NOT IN...


RE: Conditions complexe - Single Dark - 10-04-2008

Mysterarts a écrit :Déplacé Smile

Merci, je savais bien que je l'avais mal placé, je ferai plus attention a l'avenir.


el[u a écrit :ox]
J'ai pas vraiment le temps de t'aider, mais je voulais te demander, pourquoi stocker les infos de batiments dans un table, c'est pour moi, des ressources inutiles utilisés

A vrai dire je ne sais pas trop pourquoi.
Peut-être cela me laisse la possibiliter de changer facilement chaque données des batiments, et aussi pour pouvoir en creer d'autre aussi facilement.

Mais tu soulève une bonne interrogation, es-ce que cela pourrai faire ralentir le serveur ?

Si oui, bah je les sockeraient allieurs.
XD


kéké a écrit :Coucou,

Coucou a toi aussi.

kéké a écrit :Tout d'abord, les conditions je les mettrais sur une table à part, avec une valeur de condition par champs.

Là je me posser une question,
En quoi cela changera quelque chose ?
Certe je n'aurai pas a faire un p*t*in de systeme pour lister les conditions ?
Là mon systeme fonctionne correctement, donc si je vois que ta methode est plus rapide niveau serveur, je l'utiliserai.

kéké a écrit :Ensuite, ce que j'ai compris, c'est faire la liste des batiments constructibles mais qui n'ont pas déjà été construit

Select * from table where (condition de batiment à construire ) and id_bat not in ( select * from table where (batiment déjà construit) )

Tu as tous a fait compris, et celà prouve que je parle bien le francais.
Je teste sa et j'edit.

kéké a écrit :Si ce type de construction ne marche pas, je t'encourage à faire 2 requêtes et à invalider les résultats de l'un avec les résultats de l'autre.

Je test ta premier méthode et si elle ne marche pas alors je testerai celle là.

kéké a écrit :Bon courage !

Merci bicoup

kéké a écrit :Kéké.

Enchanté moi c'est Single Dark

XD


Argorate a écrit :Essaye dans ta requete SQL d'utiliser une sous requete avec NOT IN...

A vrai dire je ne connaisais pas cette conditions, donc maintenant on va bien voir.


RE: Conditions complexe - denisc - 10-04-2008

Quitte à rallonger la sauce... Rajoute une table : prerequis

|id_batiment_a_contruire | id_batiment_requis | niveau |
|............2...................|...........1...............|.....5....|
|............3...................|...........1...............|...10....|
|............3...................|...........2...............|.....5....|


RE: Conditions complexe - Single Dark - 10-04-2008

J'ai résolu le problème grace a la conditions NOT IN.

La requete donne sa :

Code PHP :
<?php 
$requete_test_bat
= mysql_query ('SELECT * FROM sc_table_info_bat WHERE sc_table_info_bat.id NOT IN (SELECT id_batiments FROM sc_table_planete_bat WHERE id_planete="' . $_SESSION['id_planete'] . '")') or die('ERREUR SQL <br />'.mysql_error());

Et voilà je vous remerci


RE: [RESOLU] Conditions complexe - Argorate - 11-04-2008

pour info, cela marche évidament aussi avec "IN"... content de t'avoir aidé Wink