Affichage de pièces sur un échiquier

Résolu
Andjety Messages postés 9 Date d'inscription vendredi 15 septembre 2006 Statut Membre Dernière intervention 29 septembre 2006 - 27 sept. 2006 à 14:50
Andjety Messages postés 9 Date d'inscription vendredi 15 septembre 2006 Statut Membre Dernière intervention 29 septembre 2006 - 29 sept. 2006 à 22:00
Bonjour,
on m'a bien aidé la dernière fois alors je reviens vers vous pour mon projet de jeu de bataille (échiquier en quelque sorte) et mes difficultés à afficher ce que je veux au bon endroit

voici le code où j'étais arrivé grace à un coup de main ici même

<?php
//connexion base de données
require "inc_connect.php";

// requête SQL pour sélectionner battle_unit
$sql = 'SELECT id_unit,name_unit,x_unit,y_unit,type_unit,nation FROM battle_units';

// envoi la requête
$req = mysql_query($sql) or die('Erreur SQL !
'.$sql.'
'.mysql_error());

//  boucle pour chaque enregistrement
while($data = mysql_fetch_assoc($req))
    {
    // on crée le tableau des coordonnées des unités
    $tableau[$data['id_unit']] =  $data['x_unit'] . ',' . $data['y_unit'] ;
    // extraction des données
    extract($data);
    }

// ferme la connexion à mysql
mysql_close();
echo '
',"\n";
echo '',\"\n\";
echo '----
',\"\n\";
echo ' &nbsp; |',\"\n\";
for($y =1;$y<= 12;$y++)
    {
    echo ' '.$y.' |',\"\n\";
    }
echo '',\"\n\";
   for($x =1;$x<= 12;$x++)
      {
      echo '----
',\"\n\";
      echo ' '.$x.' |',\"\n\";
         for($y =1;$y<=12;$y++)
            {
            echo '';
                if (in_array($x.",".$y, $tableau))
                echo $y_unit . ',' .$x_unit,"\n";
                else echo '&nbsp;';
            echo ', ',\"\n\";
            }
      echo '',\"\n\";
      }
echo '
',"\n";
echo '
',"\n";
?>

mon souci vient je pense de la partie en gras et de la fonction in_array qui était pourtant ma solution la dernière fois lol

le principe est donc d'afficher quelque chose dans une case si le x y de la case correspond au x y d'une unité du jeu

avec in_array ce but là est atteint

mais le hic c'est que je voudrais afficher un truc qui correspond bien à l'unité qui occupe la case, or là ça affcihe uniquement les valeurs de la dernière unité trouvée dans la table

une idée pour m'aider ?

10 réponses

franco_se Messages postés 151 Date d'inscription samedi 1 novembre 2003 Statut Membre Dernière intervention 30 juillet 2018 2
29 sept. 2006 à 13:41
personnellement, pour ce genre d'affichage, j'utilise une infobulle généré par overlib
( presentation FR ICI ). cette librerie permet l'affichage d'une infobulle au passage de la souris, ou en cliquant sur un lien, et autorise ol'utilisation de html ds la bulle.

j'ai aussi travaillé sur un jeu, ou il fallait explorer des lieux ( a la facon d'Amerzone ou Myst) et j'utilisé la bulle pour afficher les infos, et proposer des actions, en cliquant simplement sur un objet.
3
franco_se Messages postés 151 Date d'inscription samedi 1 novembre 2003 Statut Membre Dernière intervention 30 juillet 2018 2
27 sept. 2006 à 15:25
salut

je t'avais pourtant aussi expliqué comment recuperer l'id d'une piece, toujours avec ce tableau; non ? ;)

le tableau généré a toutes les données de toutes les pieces.
pour avoir l'id d'une piece, tu fait
$id =  array_search(
$x.",".$y, $tableau);

par ailleurs, tu ne dois  pas ecrire
echo  $y_unit . ',' .$x_unit,"\n";
mais
echo  $y . ',' .$x,"\n";

ainsi, tu peux ecrire:
                if (in_array($x.",".$y, $tableau))  {
         $id = array_search (
$x.",".$y, $tableau);
                echo  $y . ',' . $x  . "id =" . $id ;
0
Andjety Messages postés 9 Date d'inscription vendredi 15 septembre 2006 Statut Membre Dernière intervention 29 septembre 2006
27 sept. 2006 à 17:26
ok j'avais pas saisi la dernière fois milles excuses, je crois avoir (enfin) compris

en fait mon code pour pas être trop long était partiel et je comprends donc qu'il manque des variables en plus de $id

en effet ce que je veux afficher ce sont des infos figurant dans d'autres champs de la même table, en bref :

j'ai dans cette table : id_unit, name_unit, x_unit, y_unit, type_unit, nation

j'ai besoin de ceux en gras pour les afficher, puisque mon image de pièces est

et dans un calque voisin, je voudrai afficher l'image mais aussi $name_unit

bref si cette fois j'ai bien compris, il faudrait que je modifie $tableau ?
ainsi : $tableau[$data['id_unit']] =  $data['x_unit'] . ',' . $data['y_unit']. ',' . $data['name_unit']. ',' . $data['type_unit']. ',' . $data['nation'] ;

j'ai bon ?

et après je mets derrière mon if :
$name_unit = array_search(
$x.",".$y, $tableau);
$type_unit =
array_search(
$x.",".$y, $tableau);
$nation =
array_search(
$x.",".$y, $tableau);

hum je sens que là j'ai pas bon ?

merci en tout cas encore une fois (c'est dingue comment un truc qui semblait simple à la conception s'avère plus compliqué que le reste)
0
franco_se Messages postés 151 Date d'inscription samedi 1 novembre 2003 Statut Membre Dernière intervention 30 juillet 2018 2
27 sept. 2006 à 18:07
en effet, tu n'a pas bon lol
vu qu'il y a bien plus de données, cette forme de tableau n'est pas adaptée. il faut donc réadapter le code:

pour le tableau, tu dois faire :

$tableau[$data['id_unit']] =  array(
"coordonnées" => $data['x_unit'] . ',' . $data['y_unit'] ,
"x" =>$data['x_unit'] ,
"y" => $data['y_unit'],
"name" => $data['name_unit'],
"type" => $data['type_unit'],
"nation" => $data['nation'] ) ;

(si, tu a les keys "x" et "y", elles le serviront pas ds ce code, ms on sais jamais, peut etre ds une autre version, elles serait utiles )

Ainsi, pour connaitre la variable ' name' de la piece d'id=5, tu fais $tableau['5']['name']. C'est comme ça que seront appellées les variables dans la partie   if (in_array($x.",".$y, $tableau)){ ...... }

tu ecris donc :

// on verifie l'existance d'une piece a ces coordonées:
 if (in_array($x.",".$y, $tableau)){

// on cherche l'id de la piece sur ces coordonnées:
$id_piece = array_search($x.",".$y, $tableau);

//affichage de sa coordonnée X
echo "Coordonnée X = " . $tableau[$id_piece]['x'] . "
";


//affichage de sa coordonnée Y
echo "Coordonnée Y = " . $tableau[$id_piece]['y']. "
";

//affichage de son nom
echo "nom = " . $tableau[$id_piece]['name']. "
";


//affichage de son type
echo "Type = " . $tableau[$id_piece]['type']. "
";


//affichage de la nation
echo "Nation= " . $tableau[$id_piece]['nation']. "
";
}

en prioncipe ça marche
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Andjety Messages postés 9 Date d'inscription vendredi 15 septembre 2006 Statut Membre Dernière intervention 29 septembre 2006
28 sept. 2006 à 13:31
ok si je saisis (enfin je crois),  l'idée n'est pas de récupérer une table de la bdd sous forme de tableau directement, mais de créer un autre tableau en récupérant les données ?

bref ça ne fonctionne plus, c'est à dire que avant il détectait bien une pièce présente aux bonnes coordonnées mais là avec le code que tu me proposes il ne détecte plus ces pièces

j'ai regarde le code source html généré et il traduit bien la création du tableau mais rien au sujet des données/variables récupérées ou créees...

je pense que le souci est là ?
$tableau[$data['id_unit']] =  array(
"coordonnées" => $data['x_unit'] . ',' . $data['y_unit'] ,
"x" =>$data['x_unit'] ,
"y" => $data['y_unit'],
"name" => $data['name_unit'],
"type" => $data['type_unit'],
"nation" => $data['nation'] ) ;

topic d'avant tu m'avais proposé ça :

while($data = mysql_fetch_array($req))
{
 $tableau[$data['id_unit']] =  $data['x_unit'] . ',' . $data['y_unit'] ;
}

j'ai placé la nouvelle définition de $tableau dans ma boucle while à la place de ce qui est en gras, c'est là que je me plante ?

je suis désolé je dois être un vrai boulet, n'est-ce pas, heureusement que je poste dans débutant

c'est pourtant pas si exotique que ça ce que je veux faire, lol
0
franco_se Messages postés 151 Date d'inscription samedi 1 novembre 2003 Statut Membre Dernière intervention 30 juillet 2018 2
29 sept. 2006 à 01:30
salut

oui, je viens de me rendre comte que je me suis trompé.
essaye avec ce code.
il y a 2 tableaux générés, regrouppand en fait les 2 methodes: un tableau $tableau_coordonnées qui contient les coordonnées de toutes les piecs, et un $tableau qui contion toutes les données des pieces. le code teste les coordonnées, verifie l'existance d'une piece a ces coordonnées, et recupere ces données.

<?php
//connexion base de données
require "inc_connect.php";

// requête SQL pour sélectionner battle_unit
$sql = 'SELECT id_unit, name_unit, x_unit, y_unit, type_unit, nation FROM battle_units';

// envoi la requête
$req = mysql_query($sql) or die('Erreur SQL !
'.$sql.'
'.mysql_error());

//  boucle pour chaque enregistrement
while($data = mysql_fetch_assoc($req))
    {
    // on crée le tableau des coordonnées des unités
$tableau_coordonnées[$data['id_unit']] =  $data['x_unit'] . ',' . $data['y_unit'] ;
$tableau[] =  array(  "x" =>$data['x_unit'] , "y" => $data['y_unit'],  "name" => $data['name_unit'], "type" => $data['type_unit'], "nation" => $data['nation'] ) ;

    // extraction des données
    extract($data);
    }

// ferme la connexion à mysql
mysql_close();

echo '
',"\n";
echo
'',\"\n\";
echo '----
',\"\n\";
echo ' &nbsp; |',\"\n\";
for($y =1;$y<= 12;$y++)
    {
    echo ' '.$y.' |',\"\n\";
    }
echo '',\"\n\";
   for($x =1;$x<= 12;$x++)
      {
      echo '----
',\"\n\";
      echo ' '.$x.' |',\"\n\";
         for($y =1;$y<=12;$y++)
            {
            echo '';

// on verifie l'existance d'une piece a ces coordonées:
 if (in_array($x.",".$y, $tableau_coordonnées)){

// on cherche l'id de la piece sur ces coordonnées:
$id_piece = array_search($x.",".$y, $tableau_coordonnées);

//affichage de sa coordonnée X
echo "Coordonnée X = " . $tableau[$id_piece]['x'] . "
";

//affichage de sa coordonnée Y
echo "Coordonnée Y = " . $tableau[$id_piece]['y']. "
";

//affichage de son nom
echo "nom = " . $tableau[$id_piece]['name']. "
";

//affichage de son type
echo "Type = " . $tableau[$id_piece]['type']. "
";

//affichage de la nation
echo "Nation= " . $tableau[$id_piece]['nation']. "
";
}

                else echo '&nbsp;';
            echo ', ',\"\n\";
            }
      echo '',\"\n\";
      }
echo '
',"\n";
echo '
',"\n";
?>

je n'ai pas testé le code
0
Andjety Messages postés 9 Date d'inscription vendredi 15 septembre 2006 Statut Membre Dernière intervention 29 septembre 2006
29 sept. 2006 à 11:01
ça marche mieux mais y a une coquille quelque part, voici le résultat sur mon serveur de test :

http://battleegyptis.free.fr/view_battlefield.php

or dans ma table battle_units, j'ai les valeurs suivantes :

1      Seth      1      5      LCh      egyptis
2     Ptah     1     6     Bd     egyptis
3     Thot     1     7     Sp     egyptis
4     Re     1     8     Bw     egyptis
5     Test     1     9     Ps     egyptis

comme on peut le voir sur la page test, le script a semble t'il zappé id_unit= 1 pour passer à
2 direct pour le contenu mais en l'affichant dans la case de id_unit=1

et du coup dans la case 1/9 il ne sait pas quoi afficher

si j'ai bien suivi il prend donc bien id_unit=1 pour savoir que en 1/5 il y a quelque chose à affciher

mais ensuite il saute id_unit pour passer à 2 pour ce qu'il y a à afficher

donc quand on déclare $tableau[] cad le deuxième contenant les données, il commence à la deuxième ligne de la table

sauf que je vois pas pourquoi ???

voici le code exact de la page générée à l'url ci-dessus (au cas où)

<?php
//connexion base de données
require "inc_connect.php";

// requête SQL pour sélectionner battle_unit
$sql = 'SELECT id_unit,name_unit,x_unit,y_unit,type_unit,nation FROM battle_units';

// envoi la requête
$req = mysql_query($sql) or die('Erreur SQL !
'.$sql.'
'.mysql_error());

//  boucle pour chaque enregistrement
while($data = mysql_fetch_assoc($req))
    {
    // on crée le tableau des coordonnées des unités
$tableau_coordonnées[$data['id_unit']] =  $data['x_unit'] . ',' . $data['y_unit'] ;
$tableau[] =  array(  "x" =>$data['x_unit'] , "y" => $data['y_unit'],  "name" => $data['name_unit'], "type" => $data['type_unit'], "nation" => $data['nation'] ) ;
    }

// ferme la connexion à mysql
mysql_close();

echo '
',"\n";
echo '',\"\n\";
echo '----
',\"\n\";
echo ' &nbsp; |',\"\n\";
for($y =1;$y<= 12;$y++)
    {
    echo ' '.$y.' |',\"\n\";
    }
echo '',\"\n\";
   for($x =1;$x<= 12;$x++)
      {
      echo '----
',\"\n\";
      echo ' '.$x.' |',\"\n\";
         for($y =1;$y<=12;$y++)
            {
            echo '';
                // on verifie l'existance d'une piece a ces coordonées:
                if (in_array($x.",".$y, $tableau_coordonnées))
                    {
                    // on cherche l'id de la piece sur ces coordonnées:
                    $id_piece = array_search($x.",".$y, $tableau_coordonnées);
                   
                    //affichage de sa coordonnée X
                    echo "Coordonnée X = " . $tableau[$id_piece]['x'] . "
";

                    //affichage de sa coordonnée Y
                    echo "Coordonnée Y = " . $tableau[$id_piece]['y']. "
";

                    //affichage de son nom
                    echo "nom = " . $tableau[$id_piece]['name']. "
";

                    //affichage de son type
                    echo "Type = " . $tableau[$id_piece]['type']. "
";

                    //affichage de la nation
                    echo "Nation= " . $tableau[$id_piece]['nation']. "
";
                    }
                else echo '&nbsp;';
            echo ', ',\"\n\";
            }
      echo '',\"\n\";
      }
echo '
',"\n";
echo '
',"\n";
?>

(merci encore de ta patience à m'aider)
0
franco_se Messages postés 151 Date d'inscription samedi 1 novembre 2003 Statut Membre Dernière intervention 30 juillet 2018 2
29 sept. 2006 à 11:32
je viens de voir pourquoi:
remplace

$tableau_coordonnées[$data['id_unit']] =  $data['x_unit'] . ',' . $data['y_unit'] ;
$tableau[]
  array(  "x" >$data['x_unit'] , "y" => $data['y_unit'], 
"name" => $data['name_unit'], "type" => $data['type_unit'],
"nation" => $data['nation'] ) ;

par

$tableau_coordonnées[$data['id_unit']] =  $data['x_unit'] . ',' . $data['y_unit'] ;

$tableau[$data['id_unit']]
  array(  "x" >$data['x_unit'] , "y" => $data['y_unit'], 
"name" => $data['name_unit'], "type" => $data['type_unit'],
"nation" => $data['nation'] ) ;
0
Andjety Messages postés 9 Date d'inscription vendredi 15 septembre 2006 Statut Membre Dernière intervention 29 septembre 2006
29 sept. 2006 à 13:14
c'était bien ça merci ;-)

j'ai une nouvelle galère quand je veux rendre ça plus graphique et passée à l'étape suivante, bouger les pièces...

je voulais que à droite de mon tableau où s'affiche les pièces, je puisse afficher deux calques, l'un pour "décrire l'unité" ciblée et l'autre pour proposer l'interface pour bouger "l'unité ciblée"

j'ai tenter le coup avec du javascript onmouseover, onmouseclick, etc.

mais le résultat c'est pas ça : http://battleegyptis.free.fr/view_battlefield.php

est-ce que je peux rebondir en php ?

(en plus mon javascript marche pas sous IE lol de lol)

et moi qui pensais que l'affichage serait le plus simple

voici la page complète qui génère l'url ci-dessus

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns= "http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Bataille pour le Nil - le champ de bataille</title>
<link href="battleegyptis.css" rel="stylesheet" type="text/css" />
<script type="text/JavaScript">
<!--
function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_showHideLayers() { //v6.0
  var i,p,v,obj,args=MM_showHideLayers.arguments;
  for (i=0; i<(args.length-2); i+=3) if ((obj=MM_findObj(args[i]))!=null) { v=args[i+2];
    if (obj.style) { obj=obj.style; v=(v=='show')?'visible':(v=='hide')?'hidden':v; }
    obj.visibility=v; }
}
//-->
</script>
</head>

<?php
//connexion base de données
require "inc_connect.php";

// requête SQL pour sélectionner battle_unit
$sql = 'SELECT id_unit,name_unit,x_unit,y_unit,type_unit,nation FROM battle_units';

// envoi la requête
$req = mysql_query($sql) or die('Erreur SQL !
'.$sql.'
'.mysql_error());

//  boucle pour chaque enregistrement
while($data = mysql_fetch_assoc($req))
    {
    // on crée le tableau des coordonnées des unités
    $tableau_coordonnées[$data['id_unit']] =  $data['x_unit'] . ',' . $data['y_unit'] ;
    $tableau[$data['id_unit']] =  array(  "x" =>$data['x_unit'] , "y" => $data['y_unit'], 
    "name" => $data['name_unit'], "type" => $data['type_unit'], "nation" => $data['nation'] ) ;   
    }

// ferme la connexion à mysql
mysql_close();

echo '
',"\n";
echo '',\"\n\";
echo '----
',\"\n\";
echo ' &nbsp; |',\"\n\";
for($y =1;$y<= 12;$y++)
    {
    echo ' '.$y.' |',\"\n\";
    }
echo '',\"\n\";
   for($x =1;$x<= 12;$x++)
      {
      echo '----
',\"\n\";
      echo ' '.$x.' |',\"\n\";
         for($y =1;$y<=12;$y++)
            {
            echo '';
                // on verifie l'existance d'une piece a ces coordonées:
                if (in_array($x.",".$y, $tableau_coordonnées))
                    {
                    // on cherche l'id de la piece sur ces coordonnées:
                    $id_piece = array_search($x.",".$y, $tableau_coordonnées);
                   
                    //on affiche les images et infos qui correspondent à l'unité occupant la case
                    echo '',"\n";
                    echo '
'. $tableau[$id_piece]['name'].'

                        '. $tableau[$id_piece]['nation'].'/'. $tableau[$id_piece]['type'].'
',"\n";
                    echo '

                        <table style="width: 180px; height: 180px; text-align: left; margin-left: auto; margin-right: auto;" border="1" cellpadding="2" cellspacing="3">
                            <caption>Vous pouvez ci-dessous bouger l\'unité '. $tableau[$id_piece]['name'].'</caption>
                           
                                ----

                                   , NO</td>
                                    N,
                                    NE,
                               
                                ----

                                    O,
                                                                           
                                   ,
                                    E,
                               
                                ----

                                    SO,
                                    S,
                                    SE,
                               
                           
                       

                       
',"\n";
                    }
                else echo '&nbsp;';
            echo '</td>',"\n";
            }
      echo '</tr>',"\n";
      }
echo '</table>',"\n";
echo '
',"\n";
?>

</html>
0
Andjety Messages postés 9 Date d'inscription vendredi 15 septembre 2006 Statut Membre Dernière intervention 29 septembre 2006
29 sept. 2006 à 22:00
Merci beaucoup cette dernière astuce m'ouvre bien des possibilités et pas que pour le projet que j'ai en cours

tu es vraiment mon sauveur, merci, merci.
0
Rejoignez-nous