TourDeJeu, le réseau des jeux en ligne alternatifs : jeux web multijoueurs, jeux par forum. En savoir +

Flux RSS des discussions du forum : pour les joueurs, et pour les créateurs et MJ
  Reply to this topicStart new topicStart Poll

> Array() En Fonction D'une Distance
Hyoga kun
  Ecrit le : Lundi 18 Octobre 2004 à 07h25
Quote Post


Kid
*

Groupe : Membre
Messages : 10


salut,

J'ai une table de 8 champs avec plusieurs enregistrements là je ne vais mettre que les données d'un enregistrement car si ça marche avec 1 ça va marcher en auto_increment.

QUOTE

Login : contient -> Squall
Pass : contient -> iuao65
Pseudo : contient -> Squall
Niveau : contient -> 90
Categorie : contient -> Brave
Grade : contient -> Samourai
pos_h : contient -> 10 // correspond a la position horizontale dans un  tableau html
pos_v : contient -> 20 // correspond à la position verticale dans un tableau html


Bon vous remarquerez que je n'utilise pas de champ pour stocker la distance car il y a beaucoup de joueurs et pas tous les joueurs voient Squall a la meme distance.

Ce que je veux obtenir ? L'affichage de toutes les données citées plus haut en fonction(ou pas en fonction si possible) de la distance vous séparant des personnages affichées par la requete c'est pour ça que je met
CODE
WHERE login!='".$_SESSION["login"]."'
. L'affichage des données doit se faire du personnage le plus proche au personnage le plus éloigné.


CODE

$tableau = array();

$sql = mysql_query("SELECT login,pos_h,pos_v,pseudo,niveau,categorie,grade FROM jeu_membres WHERE login!='".$_SESSION["login"]."' ");

while ($return1 = mysql_fetch_array ($sql))
{
$depart1=abs( $data['pos_h'] - $return1['pos_h'] );
$depart2=abs( $data['pos_v'] - $return1['pos_v'] );
$cal1=max( $depart1, $depart2 );
// petit calcul simple pour trouver la distance séparant de tous les personnages retournés par la requete par rapport a vous, je prend la valeur la plus grande pour etre plus précis.
$distances[$return1['pseudo']] = $cal1;  
}

asort($tableau);
$key = key($tableau);
$val = current($tableau);
reset($tableau);

while(list ($key,$val) = each ($tableau))
{
echo' pseudo : '.$key.' distance : '.$val.'';
}


moi j'aimerais arriver au résultat suivant

CODE

echo'Login :  Squall<br />
Pseudo : Squall<br />
Niveau :  90<br />
Categorie :  Brave
Grade :  Samourai <br />
Distance : 7<br />'; // par exemple ça doit dépendre de votre position dans le tableau car soyons bien d'accord squall est un adversaire et non vous


il m'a été aussi proposé de faire directement ceci

CODE

$vue=99;
$test = mysql_query("select login,pos_h,pos_v,pseudo,niveau,categorie,grade, max(abs($position_h-pos_h),abs($position_v-pos_v)) AS distance, FROM jeu_membres WHERE distance < '$vue'")
or die (mysql_error());


apres j'ai comme mess d'erreur

QUOTE
Something is wrong in your syntax près de 'abs(6-pos_v)) AS distance, FROM jeu_membres WHERE distance < '99' à la ligne 1


de plus je crois bien que max() ne peux pas prendre deux arguments.

merci de maider sad.gif
PMEmail Poster
Top
Hayk
Ecrit le : Lundi 18 Octobre 2004 à 08h31
Quote Post


Pro
*

Groupe : Membre
Messages : 70


Je dirais que la fonction abs ne peut recevoir comme argument qu'un seul nombre.

Je serais d'aviser de valoriser ton opération mathématique $position_v-pos_v avant de l'utiliser avec la fonction abs.

Attention aussi au type de nombre qui est retourné par la fonction. En cas de comparaison ultérieure si les types ne sont pas identiques ça peut provoquer des erreurs.
PMEmail Poster
Top
Guest_askywhale
Ecrit le : Mercredi 03 Novembre 2004 à 17h41
Quote Post


Unregistered






Les ' ' sont en trop à la fin autour de $vue
Top
Dimitri Mouche
Ecrit le : Vendredi 05 Novembre 2004 à 11h15
Quote Post


Kid
*

Groupe : Membre
Messages : 21


J'ai, en vain, cherché une requette sql qui me permettrait de ramener toutes les lignes des personnages qui sont dans ma vue, classés par distance ! Si quelqu'un a la solution je suis également preneur...

Par contre, pour contourner le pb, et qui, si j'ai bien tout compris, solutionnera ton pb, le tableau que tu utilises peut contenir tous les autres champs dont tu as besoins !

Lorsque tu fais
QUOTE
while ($return1 = mysql_fetch_array ($sql))
{
$depart1=abs( $data['pos_h'] - $return1['pos_h'] );
$depart2=abs( $data['pos_v'] - $return1['pos_v'] );
$cal1=max( $depart1, $depart2 );
// petit calcul simple pour trouver la distance séparant de tous les personnages retournés par la requete par rapport a vous, je prend la valeur la plus grande pour etre plus précis.
$distances[$return1['pseudo']] = $cal1; 
}


Il suffit de prendre avant la boucle $i=0; Ce compteur sera implémenté dans ton while. Ensuite, tu inseres dans ton tableau tout ce dont tu as besoin :
CODE
$tab[$i]["distance"] = $distance;
$tab[$i]["pseudo"] = $return1 ["login"]
$tab[$i]["pos_h"] = $return1 ["pos_h"]
$tab[$i]["pos_v"] = $return1 ["pos_v"]

etc...


Ensuite, tu n'as plus qu'a trier le tableau avec sort (qui triera automatiquement sur la premiere colonne !)

CODE
sort ($tab);


Puis tu affiches :
CODE
foreach ($tab as $ligne)
{
   echo "distance : ".$ligne["distance"]."<br>";
   echo "pseudo: ".$ligne["pseudo"]."<br>";
   echo "position horizontale: ".$ligne["pos_h"]."<br>";
   echo "position verticale: ".$ligne["pos_v"]."<br>";

}


Voila, j'espere que je réponds a la question !


--------------------
Viendez visiter un petit jeu sans prétention : Donjons & Parpaings
PMEmail Poster
Top
Grouik
Ecrit le : Vendredi 05 Novembre 2004 à 13h44
Quote Post


Unregistered






A vue de nez et à l'arrache (pas testé donc gaffe) :

CODE
$vue = 99;
$test = mysql_query("
 SELECT login, pos_h, pos_v, pseudo, niveau, categorie, grade, GREATEST(ABS(pos_h - $position_h), ABS(pos_v - $position_v)) AS distance
 FROM jeu_membres
 WHERE GREATEST(ABS(pos_h - $position_h), ABS(pos_v - $position_v)) <= $vue
 ORDER BY GREATEST(ABS(pos_h - $position_h), ABS(pos_v - $position_v))
") or die (mysql_error());
Top
askywhale
Ecrit le : Jeudi 11 Novembre 2004 à 13h26
Quote Post


Pro
*

Groupe : Membre
Messages : 170


Que je siplifierais en

CODE

SELECT login, pos_h, pos_v, pseudo, niveau, categorie, grade, GREATEST(ABS(pos_h - $position_h), ABS(pos_v - $position_v)) AS distance
FROM jeu_membres
WHERE distance <= $vue ORDER BY distance


--------------------
PMEmail Poster
Top
Grouik
Ecrit le : Jeudi 11 Novembre 2004 à 19h12
Quote Post


Unregistered






QUOTE (askywhale @ 11 Nov 2004, 13:26 )
Que je siplifierais en

CODE

SELECT login, pos_h, pos_v, pseudo, niveau, categorie, grade, GREATEST(ABS(pos_h - $position_h), ABS(pos_v - $position_v)) AS distance
FROM jeu_membres
WHERE distance <= $vue ORDER BY distance

A tester car l'attribution de l'alias ne se fait normalement pas avant l'interprétation des clauses WHERE et du tri via ORDER BY (en tout cas avec certaines bases de données). Mais peut-être que MySQL est tolérant là dessus.
Top
askywhale
Ecrit le : Jeudi 11 Novembre 2004 à 20h00
Quote Post


Pro
*

Groupe : Membre
Messages : 170


A mon avis on le saura jamais il en a eu marre et fait tout en php après une requete complete tongue.gif


--------------------
PMEmail Poster
Top
Dimitri Mouche
Ecrit le : Vendredi 12 Novembre 2004 à 12h05
Quote Post


Kid
*

Groupe : Membre
Messages : 21


Perso, j'ai testé la premiere forme, et ça fonctionne tres bien.

Par contre, je ne suis pas arrivé a utiliser la meme chose, facilement, avec 3 dimensions.

Apparemment, Mysql ne prend pas un GREATEST (GREATEST(x, y), z)

Pour moi, c'est toujours l'impasse meme si j'avoue ne pas passer mon temps la dessus en ce moment.

Mais merci, ça m'a montré que c'était certainement possible, et je ferai sans doute le tour de la question un jour où j'aurai le temps (qui a dit doux reve ?)


--------------------
Viendez visiter un petit jeu sans prétention : Donjons & Parpaings
PMEmail Poster
Top
« Sujets + anciens | Programmer | Sujets + récents »

Reply to this topicStart new topicStart Poll