JeuWeb - Crée ton jeu par navigateur
resolution de ma liste d'action - 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 : resolution de ma liste d'action (/showthread.php?tid=4548)

Pages : 1 2 3


resolution de ma liste d'action - php_addict - 19-01-2010

bonjour

J'ai un peu peur de vous posez cette question: :$

J'ai une liste globale d'action a resoudre, et en voici la TABLE et sa structure:

Code :
id              autoincremente
joueur_actif    le joueur actif (attaquant par exemple)
joueur_pasif    le joueur passif (attaqué par expl)
time            le time() au quel l'action doit etre resolue
pointeur        un pointeur vers une autre table (table liste_attaques par exemple)

exemple chronologique d'action:

joueur 1 attaque joueur 2
joueur 2 attaque joueur 3
joueur 3 attaque joueur 4
joueur 4 attaque joueur 1

et voici les parametres de ma fonction resolution_action:
autrement dit l'on veut resoudre toutes les actions concernant le joueur $id_joueur à l'instant $time

Code :
resolution_action($id_joueur, $time)

on m'a donc conseillé d'utiliser une fonction recursive, mais une fonction recursive avec des SELECT sur une base de donnée me semble la pire des solutions en terme de temps d'execution du code, et ma fonction resolution_action() doit etre ultra rapide car appelée tres frequement....

d'où ma demande d'aide:

qu'elle methode et quels conseils preconisez vous à ce probleme de resolution d'action svp?

merci de m'avoir lu jusque ici :respect:


RE: resolution de ma liste d'action - Unkof - 19-01-2010

Je comprends pourquoi tu as peur ... ^^

Désolé de te dire ca comme ca, mais pour m'être penché sur ce problème il y a maintenant 3 ans, je peux te dire que ca ne peut pas fonctionner comme ca.

Je suppose que t'es sur un jeu de stratégie, ou dans le style, et que ton joueur peut interagir avec n'importe quel autre, et que comme tu l'as présenté, les autres joueurs peuvent avoir aussi des interactions entre eux qui apportent donc forcément des éléments nouveaux dans ta gestion des évènements. La seule chose qui te permet de gérer tes actions, c'est tout simplement l'heure à laquelle elles doivent s'effectuer.

Moi j'ai simplement enregistré les évènements dans une table qui gère TOUS les évènements de tous les joueurs, ensuite, ils sont exécutés par chaque joueur (à la connexion, au changement de page ou au rafraichissement), indépendament de leur id dans l'ordre chronologique, en clair, chaque joueur valide toutes les actions échues (les siennes ou ceux des autres), à partir du moment où l'heure est "passée". Ca fonctionne nickel, quelque soit le nombre de joueurs.

C'est la seule possibilité, c'est ingérable avec une fonction récursive, celui qui t'as conseillé la fonction récursive ne s'est pas penché sur le problème.

Désolé pour toi, mais tu vas pouvoir revoir tout le fonctionnement de tous tes évènements.


RE: resolution de ma liste d'action - Ter Rowan - 19-01-2010

je pense qu'il y a moyen mais c'est effectivement plus compliqué et le plus simple me semble être de rester focaliser sur le time, tous joueurs confondus

en effet si je me base sur tes données, joueur 4 va attaquer joueur 1... sauf si joueur 3 rend joueur 4 incampacitant, sauf si joueur 2 etc....

conclusion la résolution d'un joueur correspond à la résolution de plusieurs joueurs, autant le faire pour tous. Ainsi, une seule requête, et une suite d'action à réaliser dans l'ordre chronologique


RE: resolution de ma liste d'action - php_addict - 19-01-2010

salut

merci de ta reponse

(19-01-2010, 01:52 PM)Unkof a écrit : Je suppose que t'es sur un jeu de stratégie, ou dans le style, et que ton joueur peut interagir avec n'importe quel autre, et que comme tu l'as présenté, les autres joueurs peuvent avoir aussi des interactions entre eux qui apportent donc forcément des éléments nouveaux dans ta gestion des évènements.

oui effectivement c'est un jeu de strategie...

j'avais éventuellement penser a faire ceci:

faire la liste des interaction, exemple:

le joueur 1 est concerné dans la liste des interactions entre les joueurs 2,3,4,5

et apres je resoud ma liste...

je sais pas si c'est tres clair...


donc pour toi le seul moyen est de resoudre les actions revolues et peut importe si cela concerne le joueur connecté ?

c'est ca j'ai bien compris?

merci de ta reponse ;-)

une derniere petite question pour la route:

- imaginons que mon script ai 100 actions a resoudre
- apres chaque resolution d'action, on l'efface de la table

il se peut alors qu'entre temps un autre joueur connecté tente de faire la meme chose et de part ce fait de resoudre une action qui n'existe plus ?

je veux dire, si le script de resolution d'attaque est lancé au meme moment par 2 joueurs, comment eviter les bugs ?


RE: resolution de ma liste d'action - Zamentur - 19-01-2010

Code PHP :
<?php 
SELECT
* FROM `action` WHERE (`joueur_actif`=%d OR `joueur_passif`=%d) AND `time`<%d
Et ensuite une boucle pour résoudre les actions

Mais il y a un hic...
Car quand tu mets à jour un joueur il faut que les joueurs avec qui il interagit soit aussi mis à jour...

En fait ce problème revient à déterminer tous les points d'un graphe qui sont reliés directement ou indirectement à un point et de les ordonner.

Et ce problème me semble plutôt complexe à résoudre en sql.

Donc je pense que résoudre toutes les actions qui sont passées est la solution la plus simple et peut être la plus efficace.

Sinon il faut récupérer les actions qui ont eu lieu
Code PHP :
<?php 
SELECT
* FROM `action` WHERE `time`<%d
Et déterminer les dépendances grâce à un algorithme en O(N²)
Edit:dsl j'ai posté un peu tard (j'ai mangé entre la réponse et l'envoie du message...)

(19-01-2010, 02:37 PM)php_addict a écrit : une derniere petite question pour la route:

- imaginons que mon script ai 100 actions a resoudre
- apres chaque resolution d'action, on l'efface de la table

il se peut alors qu'entre temps un autre joueur connecté tente de faire la meme chose et de part ce fait de resoudre une action qui n'existe plus ?

je veux dire, si le script de resolution d'attaque est lancé au meme moment par 2 joueurs, comment eviter les bugs ?
Ben il y a ce qu'on appelle les transactions, si le moteur sql que tu utilises n'en dispose pas tu peux aussi éviter le problème en utilisant un système de marquage:
- si l'entrée n'est pas en cours de résolution
-- on marque l'entrée comme en cours de résolution
-- on résout l'entrée
-- on supprime l'entrée


RE: resolution de ma liste d'action - Unkof - 19-01-2010

Oublis la liste des interactions entre joueur.

Dans ton exemple, le joueur est effectivement concerné par les joueurs 2,3,4,5. Le seul problème, c'est que ces joueurs (2,3,4,5) ont aussi leurs propres interactions qui sont exécutées elles aussi dans un ordre chronologique, indépendament du joueur 1 ... ^^, donc en même temps que tu traiterais ta liste, tu devrais aussi traiter la liste relative à chaque joueur concerné, et chaque joueur de chaque joueur, etc etc ... boucle sans fin, ou presque.

php_addict a écrit :donc pour toi le seul moyen est de resoudre les actions revolues et peut importe si cela concerne le joueur connecté ?

Oui .. Smile

Concernant les modifs de tables, il faut gérer le transactionnel, moi je l'ai fait avec des tables InnoDB, plus d'infos ici :

http://dev.mysql.com/doc/refman/5.0/fr/innodb-transaction-model.html

Comme ca, pas de risque qu'un autre joueur exécute les mêmes évènements en même temps.

Je l'ai appris à mes dépends .... lol .... ^^ ... mais après, ca fonctionne très très bien.


RE: resolution de ma liste d'action - php_addict - 19-01-2010

beaucoup d'avoir pris le temps de repondre

je vais donc suivre tes conseils et ton experience sur le sujet

plus j'avance sur mon projet plus j'en apprends, je ne savais meme pas ce qu'etait le mode transactionnel...
je suis tombé sur le tuto http://www.siteduzero.com/tutoriel-3-166641-les-transactions-avec-mysql-et-pdo.html et je vais potasser...

encore merci...


RE: resolution de ma liste d'action - Unkof - 19-01-2010

Oui, c'est effectivement un très bon exemple qui plus est simple à comprendre ... ^^

T'as plus qu'à modifier ton code initial .. Wink ...


RE: resolution de ma liste d'action - php_addict - 19-01-2010

heureusement que j'ai passé tout mon code en PDO

me reste à faire des try et des catch un peu partout
et me reste aussi à faire toutes les transactions...

ca va quand meme vachement alourdir le code...mais bon c'est comme ca...


RE: resolution de ma liste d'action - Unkof - 20-01-2010

Bah, ca fait que quelques lignes à ajouter pour les requêtes, mais uniquement pour la gestion des évènements.

Tu n'as pas besoin d'utiliser le transactionnel partout non plus .. Wink