JeuWeb - Crée ton jeu par navigateur
Attaque en cas d'absence - 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 : Attaque en cas d'absence (/showthread.php?tid=3808)

Pages : 1 2


Attaque en cas d'absence - Morkibut - 15-03-2009

Bonjour a tous,
Moi et un ami somme en train de créer un jeu en php pouvant s'apparenter à Ikariam ou à travian mais dans un univers post-apo.

le problème que l'on se pose est le suivant:

Comment gérer les attaques en cas d'absences, je m'explique avec un exemple:

Il est 20h j'envoi mon armée attaquer Mr. X le retour de mon armée est prévu dans 1 heure, mais moi je me déconnecte avant.
A 22h Mr. Y m'attaque, mais moi qui ne me suis toujours pas connecté me retrouve sans armée dans ma ville vu que je n'ai pas actualisé mon attaque.

c'est la que je me pose la question comment gérer cela.

On peut s'imaginer qu'il est simple de faire actualiser mes données quand Mr.Y m'attaque mais cela nécessiterais d'actualiser Mr. X pour pouvoir calculer se qui reste de mon armée. Mais si Mr. Y lui aussi s'est déconnecté et c'est fait attaquer un peu aprés il faudrait donc actualiser les données de 3 personnes....
Donc j'en déduit qu'il faut actualiser tout quand un joueur attaque un autre joueur ?
Cela me paraît très lourd d'autant que s'il y a beaucoup de joueur cela ve ralentir le jeu.....


Avez-vous trouvé une solution ?


RE: Attaque en cas d'absence - wild-D - 16-03-2009

ça dépend en fait d'un point important: est-ce que tu peux avoir des interactions qui viennent s'intercaler ? (c'est à dire qu'un second joueur peut lancer une action après le premier joueur, et que son action se déroulera avant)

à chaque fois que t'as une interaction tu dois t'assurer que ton "resolver" il te fourni des données cohérentes.
(après à savoir si tu fais la mise à jour directement ou si tu reportes; c'est toi qui vois comment tu monte ton resolver; mais à mon avis faire autre chose que post-résoudre si t'as des interactions qui peuvent s'intercaler, c'est franchement galère; car ça nécessite que tu garde les états précédents pour assurer les rollbacks en cas d'interactions nouvelle qui viendrait s'intercaler avant Oo' -bref le bordel-)

dans le cas précité, si tu veux pré-résoudre (on imagine que toute attaque prends exactement le même temps 1h aller, 1hcombat, 1h retour... enfin pour ce qui reste de l'armée le retour ):
si je me trompe pas tu vérif si l'armée elle est pas là, tu vérifs qu'elle est pas rentrée; si elle rentre pas à temps; ben y a pas de lézard. Si elle rentre à temps, ben tu sais normalement quelle armée sera rentrée; puisque cette attaque aussi tu l'auras pré-résolue^^
c'est la seule info dont tu as besoin; pour la présenter au nouvel attaquant... en gros tes résultats sont en "tampon".

si tu post-résouds c'est un peu le même schéma; sauf que c'est tes actions qui sont stockée en "tampon". Et donc tu te tape les calculs complets à chaque vérifs -pour connaitre l'état "au moment M"- jusqu'à la résolution "effective".


RE: Attaque en cas d'absence - Zamentur - 16-03-2009

Pour moi la solution c'est d'actualisé les combat au fur et à mesure:

Tu stockes dans une table les horaires de résolution.
Quand quelqu'un demande une page, tu demandes à ta table si il n'y a pas des horaire de résolution qui sont passé (ou présente) si c'est le cas tu résous les combat qui y sont affilié.

Puis tu fournis la page à ton utilisateur.

Ainsi tu seras toujours à jour pour tes combats sans avoir à faire des trucs compliqué de mise à jour selon l'attaque du joueur.


RE: Attaque en cas d'absence - Morkibut - 16-03-2009

oui cette solution c'est celle qui parait le mieux, le problème c'est que sa entraine l'actualisation de plusieurs table, dans mon cas:
-table_joueur (avec les ressources les hommes etc...)
-table_mouvement (ou il y a les mouvement d'attaque/défenses...)
-table_niveau (ou il y a les niveau des bâtiments du joueur qu'il faut actualiser pour conaitre l'armée du joueur)
-table_rapport (ou sont stocké les rapport de batailles...)

et surement d'autre que j'oublie sur le moment... donc en gros sa fait quand même une grosse actualisation au niveau de la base de données avec beaucoup de requêtes si il y a plusieurs attaque a résoudre, et la j'ai peur que sa ralentisse vraiment beaucoup le serveur...
Il va surement falloir optimisé au maximum...

je sens que sa va pas être de la tarte tout sa.... bon he bien a moins que quelqu'un est trouvé une solutions autre que celle-la je pense qu'il n'y a pas d'autre choix !!

Merci Zamentur en tout cas!!

a bientôt!! j'attends quand même vos solutions si d'autre n'ont pas le même systèmes.


RE: Attaque en cas d'absence - Morkibut - 16-03-2009

Salut wild-D, est désolé javais pas vu ta réponse.

Mais comment peut tu pré-résoudre une attaque ? imagine que X m'attaque a 20h et avant qu'il arrive j'ai fini mon méga bastos qui déchire de la mort pour défendre !! si je pré-résoud le combat je me fait exploser alors que je pouvais le poutrer !!

J'insiste sur se point car dans le jeu que je créer le joueur peut perdre la partie si toutes sa population est tuée (je vous rassure c'est pas facile de perdre ^^)

Quelqu'un sait-il comment est géré cette situation sur Ikariam ou Ogame ou travian? ou même sur son propre jeu ?


RE: Attaque en cas d'absence - Anthor - 16-03-2009

En passant par la présentation ? Smile


RE: Attaque en cas d'absence - wild-D - 17-03-2009

mdr anthor Big Grin

---

pr un ogame-like hors connec du joueur:
les ressources sont auto-gérées dans leur table, donc màj c'est en cas d'interaction avec la planète.
pour les flottes une table d'ordre et pareil màj en cas d'interaction avec la planète d'origine ou cible

y a p-e quelque subtilités supplémentaires.

----

et sinon quand on pré-résout on le fait pour tout sois logique et tu utilise une table temporelle des modificateurs d'état. Tu vas pas utiliser l'état courant pour pré-résoudre une attaque qui aura lieu dans 2h; tu utilise l'état dans 2h. Si tu veux éviter que ta table ne devienne trop grosse tu peux faire du nettoyage, quand le joueur se connecte tu effaces les états antérieurs (J'ai déjà dis que fallait remplir une condition particulière pour pouvoir utiliser ça sans prise de tete; pas besoin donc de prendre un exemple qui respecterait pas cette condition pour dire que ça marche pas... C'est le défaut de ce système c'est qu'il est contraignant).

Ce système n'est pas automatiquement le plus économique. Mais il est très pratique au niveau des calculs; pas de prise de tête avec différents ordres de différente provenance pour obtenir l'état au moment de la résolution. Là l'état au moment de résolution tu l'as direct. Smile

a priori vu que ça te semble pas naturel; évite la prérésolution; et prends un système comme celui que je viens de présenter pour les ogame-like; ou bien la solution à zamentur; tu t'éviteras surement l'apparition de plein de bug. Parce que si tu utilise pas scrupuleusement les contrainte pour pouvoir utiliser ce système; ça va partir en couille monumentale.


RE: Attaque en cas d'absence - Argorate - 17-03-2009

Si cela peut t'aider, je vais te dire comment je fonctionne pour mon jeu:

Pour ma part la contre attaque automatique est possible, autrement dit même si tu n'es pas connecté, ton perso se défend (si il a des points d'action). Et vu que j'ai un système d'initiative, ton perso peux même attaquer avant le joueur qui vient d'appuyer sur le bouton "attaquer", donc il ne faut pas croire qu'attaquer le perso de quelqu'un n’étant pas connecté sera plus aisé !

Pour ton pb de gestion de la bdd, dans mon système, il faut effectivement vérifier, et le cas échéant passer le tour du joueur qu'on attaque et qui n’est pas connecter, pour garder l'équité...
Mais faire passer le tour d'un gars avant de lancer le moteur de combat, tu ne t'en aperçois même pas je pense... Wink

Bon courage.


RE: Attaque en cas d'absence - Morkibut - 20-03-2009

Bonjour et merci a tous pour ces différentes solutions. La pré-résolution me semble vraiment bien mais assez dure a concevoir, il y a beaucoup de détails a prendre en compte.
je ne suis pas encore fixées sur la méthode qu'on utilisera.
En tous cas je vous remercie de ses réponse. je vais allez me présenter. a bientôt


RE: Attaque en cas d'absence - Morkibut - 29-03-2009

Salut tout le monde j'écris pour donner la solution qu'on va employer finalement pour résoudre se problème :

un cron tout simplement! il suffit de mettre un cron avec une valeur de temps égale à la plus petites des attaques envisageable et qui lanceras une pages de résolutions des attaques terminées.

voila le problème et pour moi résolu grâce au cron.

a bientôt