JeuWeb - Crée ton jeu par navigateur
Sélection monstre/joueur - 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 : Sélection monstre/joueur (/showthread.php?tid=2552)

Pages : 1 2


Sélection monstre/joueur - phenix - 10-03-2008

Bonjour à tous,

Voila, j'ai un petit problème de requête:

Code :
SELECT
                    monstre.id AS id_monstre,
                    monstre.id_type,
                    listemonstre.nom AS nom_monstre,
                    listemonstre.niveau AS niveau_monstre,
                    monstre.lieu AS lieu_monstre,
                    monstre.quartier AS quartier_monstre,
                    listemonstre.forceu AS for_monstre,
                    listemonstre.dexterite AS dex_monstre,
                    listemonstre.endurance AS end_monstre,
                    listemonstre.pouvoir AS pouv_monstre,
                    monstre.PV AS PV_monstre,
                    monstre.PA AS PA_monstre,
                    monstre.PM AS PM_monstre,
                    monstre.time_PA,
                    monstre.time_PM,
                    monstre.save_PA,
                    monstre.save_PM,
                    listemonstre.armure AS armure_monstre,
                    listemonstre.degat_min AS degat_min_monstre,
                    listemonstre.degat_max AS degat_max_monstre,
                    monstre.position AS position_monstre,
                    
                    users.id AS id_users,
                    users.pseudo AS pseudo_users,
                    users.lieu AS lieu_users,
                    users.quartier AS quartier_users,
                    users.pseudo AS pseudo_users,
                    users.niv AS niveau_users,
                    users.exp AS exp_users,
                    users.forceu AS for_users,
                    users.dexterite AS dex_users,
                    users.endurance AS end_users,
                    users.pouvoir AS pouv_users,
                    users.PV AS PV_users,
                    users.PO AS PO_users,
                    users.arme AS arme_users,
                    users.armure AS armure_users,
                    users.tete AS tete_users,
                    users.jambe AS jambe_users,
                    users.bouclier AS bouclier_users,
                    users.gant AS gant_users,
                    users.orientation AS orientation_users,
                    users.position AS position_users

                    FROM monstre

                    INNER JOIN users ON monstre.lieu = users.lieu AND monstre.quartier = users.quartier
                    INNER JOIN listemonstre ON monstre.id_type = listemonstre.id                    

                    WHERE users.statut = 1

C'est beau non ? Comment sa non ? :respect:

Hm, bon peu importe Wink, cette requête récupère les monstres et associe les joueurs qui ce trouvent dans la même ville (lieu) et le même quartier. Ensuite, je lance une sorte d'IA (pas vraiment un IA mais bon on va dire que oui :p) qui attaque. Seulement, je viens de me rendre compte que quand plusieurs joueurs étais "attaquable", ben ils étaient tous attaqué.

Quand on regarde la requête, c'est logique, puisque qu'un même monstre est associer a plusieurs joueurs. C'est pas paratique.

Comment faire pour que le monstre ne soit associer qu'au joueur le plus proche ??

Les coordonnée du joueur ce trouve mathématiquement via position:

le x = position%24
le y = position/24

Voila, je sais pas trop comment mit prendre, si quelqu'un a une idée, je lui serais reconnaissant de m'aider.

Merci d'avance,

Phenix


RE: Selection monstre/joueur - Ren Nelos - 10-03-2008

Bonjour Phenix.

Je pense pourtant que la solution est simple.
Il te faut trouver un moyen d'ordonner ta liste en fonction de la distance du joueur par rapport à celle du monstre, et de ne sélectionner que la première sortie de la requête.

RN


RE: Selection monstre/joueur - phenix - 11-03-2008

Citation :Il te faut trouver un moyen d'ordonner ta liste en fonction de la distance du joueur par rapport à celle du monstre, et de ne sélectionner que la première sortie de la requête.

Heu, certes, je me permet donc de poser une autres question:

Comment puis-je ordonné la liste ?

Amicalement,

phenix


RE: Selection monstre/joueur - Ren Nelos - 11-03-2008

Je dirais que l'utilisation de LIMIT est inutile en fait. Si tu fais un calcul de la distance dans ta clause WHERE et l'utilisation de la fonction SQL MIN(), tu peux arriver à tes fins.

Tu as là les éléments nécessaires. Après, je me trompe peut être.


RE: Selection monstre/joueur - joshua - 11-03-2008

sinon dans ta requete tu fais une clause whetre avec un bete pythagore. Et tu garde le min.
Tu te rappelles pythagore? racine (x²+y²) = la distance Big Grin


RE: Selection monstre/joueur - phenix - 11-03-2008

Citation :sinon dans ta requete tu fais une clause whetre avec un bete pythagore. Et tu garde le min.
Tu te rappelles pythagore? racine (x²+y²) = la distance 1

:heuuu: concrètement ? Je vois pas trop comment faire sa dans la requête :pleure2: ? Déjà on peux faire des modulo et des racines dans un requête mysql ?


RE: Selection monstre/joueur - Ren Nelos - 11-03-2008

Bonjour phenix.

Voilà la liste des opérateurs qui existent pour MySQL :
Code :
:=
||, OR, XOR
&&, AND
BETWEEN, CASE, WHEN, THEN, ELSE
=, <=>, >=, >, <=, <, <>, !=, IS, LIKE, REGEXP, IN
|
&
<<, >>
-, +
*, /, DIV, %, MOD
^
- (unary minus), ~ (unary bit inversion)
NOT, !
BINARY, COLLATE

Voir aussi :
Ren.


RE: Selection monstre/joueur - joshua - 11-03-2008

concretement?
la distance tu t'en fous; tu veux juste le min de (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)


RE: Selection monstre/joueur - phenix - 11-03-2008

J'ai pas tout comprit, alors j'ai tenté sa:

Code :
SELECT
                    monstre.id AS id_monstre,
                    monstre.id_type,
                    listemonstre.nom AS nom_monstre,
                    listemonstre.niveau AS niveau_monstre,
                    monstre.lieu AS lieu_monstre,
                    monstre.quartier AS quartier_monstre,
                    listemonstre.forceu AS for_monstre,
                    listemonstre.dexterite AS dex_monstre,
                    listemonstre.endurance AS end_monstre,
                    listemonstre.pouvoir AS pouv_monstre,
                    monstre.PV AS PV_monstre,
                    monstre.PA AS PA_monstre,
                    monstre.PM AS PM_monstre,
                    monstre.time_PA,
                    monstre.time_PM,
                    monstre.save_PA,
                    monstre.save_PM,
                    listemonstre.armure AS armure_monstre,
                    listemonstre.degat_min AS degat_min_monstre,
                    listemonstre.degat_max AS degat_max_monstre,
                    monstre.position AS position_monstre,
                    
                    users.id AS id_users,
                    users.pseudo AS pseudo_users,
                    users.lieu AS lieu_users,
                    users.quartier AS quartier_users,
                    users.pseudo AS pseudo_users,
                    users.niv AS niveau_users,
                    users.exp AS exp_users,
                    users.forceu AS for_users,
                    users.dexterite AS dex_users,
                    users.endurance AS end_users,
                    users.pouvoir AS pouv_users,
                    users.PV AS PV_users,
                    users.PO AS PO_users,
                    users.arme AS arme_users,
                    users.armure AS armure_users,
                    users.tete AS tete_users,
                    users.jambe AS jambe_users,
                    users.bouclier AS bouclier_users,
                    users.gant AS gant_users,
                    users.orientation AS orientation_users,
                    users.position AS position_users


                    
FROM monstre

                    INNER JOIN users ON monstre.lieu = users.lieu AND monstre.quartier = users.quartier                     INNER JOIN listemonstre ON monstre.id_type = listemonstre.id                    

                    WHERE users.statut = 1 AND users.position = MIN(
(monstre.position%24)-(users.position%24)*(monstre.position%24)-(users.position%24)+(monstre.position/24)-(users.position/24)*(monstre.position/24)-(users.position/24)

)

Bien sur sa marche pas. J'ai tenter d'autre bidouille sans plus de succès.

Merci pour votre aide (joli le tableau avec les opérateurs je vais le garder sous la main (h) ),

phenix


RE: Selection monstre/joueur - Ren Nelos - 12-03-2008

Bonjour phenix.

J'suis à peu près convaincu que tu t'es trompé dans tes parenthèses.

Ren.