Bonjour,

Voilà je rencontre un petit problème, je travaille sur un jeu navigateur de conquête spatiale où les joueurs s'affrontent par des combats, un joueur décidé d'en attaquer un autre, il sélectionne sa flotte et cible la planète puis il valide l'envoi de sa flotte.

Le vaisseau parcourt un temps indiqué puis une fois arrivé à son terme le combat se lance. (Le système de combat fonctionne sans problème)

Mon souci vient du fait que si l'on fait la même opération, mais qu'au moment du combat les deux joueurs ne sont pas connectés le combat ne s'exécute pas. Il s'exécutera uniquement à la connexion d'un des deux joueurs, et le combat n'est affiché que pour celui qui s'est connecté.

Comment je peux procéder pour que l'action s'effectue même si les joueurs ne sont pas connectés?

merci

18 réponses


Bonjour.
Ce n'est pas logique ce que tu demandes, un joueur est réel comparé à ce que l'on appelle des NPC et le but d'un jeu, c'est que les joueurs contrôlent leur personnage, comment comptes-tu prévoir leurs mouvements/attaques ?
Pour faire simple, ce que tu demandes, c'est ce que tout développeur de jeux et administrateur de serveurs de jeux évitent par tous les moyens, les BOT.

Sinon, juste pour répondre à ta question, ce n'est pas via PHP que tu pourras le faire, il te faudra par exemple le faire via NodeJs et SocketIO.

Ty Malib
Auteur

Merci de ta réponse,

Je n'ai pas compris ta première parti de réponse à vrai dire. Je crois que tu images que je parle d'un jeu 3D, il s'agit d'un jeu navigateur ;) pour attaquer il faut entrer la position de l'ennemi.

Que ce soit pour un jeu 3D ou autre ça revient au même à partir du moment ou le jeu implique une intéractivité entre minimum deux joueurs.
Comme tu dis :

pour attaquer il faut entrer la position de l'ennemi

Et après, il part en voyage IRL le joueur et quand il reviendra il apprendra s'il a gagné ou non ?

Ty Malib
Auteur

Justement, l'intéractivité des joueurs n'est pas forcément à prendre en compte, on peut attaquer des gens absent, non connecté ou en ligne. Rien n'indique sa présence au joueur.

Et après, il part en voyage IRL le joueur et quand il reviendra il apprendra s'il a gagné ou non ?

Oui, si tu te trouves pas loin par exemple tu lances ton attaques et il se déroule un chrono de deux heures. Je pense d'ailleurs que mon probème vient de la puisque je compare le temps actuel et le temps de voyage pour definir si le temps est arrivé à terme et lance le combat. Il faut une "action humaine", d'ou la précense du joueur qui est nécéssaire.

Je sais pas si j'ai bien éclairé le sujet ;) sinon hesite pas.

Je ne parlais pas de voyage dans le jeux, mais IRL soit In Real Life.
Sinon PHP et JavaScript dans leur utilisation basique nécessite une intéraction utilisateur.
Pour qu'une action soit effectuée en continu, il te faut utiliser un langage de programmation qui est conçu pour, tel que par exemple NodeJS et SocketIO.
Par contre, pour PHP, tu peux très bien utiliser par exemple les cron job pour exécuter un script PHP avec un délai défini, tu pourrais donc par exemple définir un cron job qui fera appel à un script PHP qui pourrait par exemple faire une requête SQL pour voir si un combat à lieu actuellement et effectuer les modifications en base de données si c'est le cas.

Ty Malib
Auteur

D'accord, et il faudrait une tache Cron chaque secondes?

D'accord, et il faudrait une tache Cron chaque secondes

Si tu veux overkill ton serveur ...

Ty Malib
Auteur

Donc???? Chaque secondes c'est trop? je fais toute les minutes?

Si tu réfléchis un peu :

il se déroule un chrono de deux heures

Si un combat dure deux heures, qu'elle serait l'utilité de vouloir questionner le serveur toutes les minutes ?
Penses de manière à ce que le serveur subisse le moins possible de surcharge et que ça n'impacte pas trop ce que tu veux faire, ce n'est pas à moi de le faire.

Ty Malib
Auteur

Alors pour commencer je déteste qu'on me dise réfléchi, sans soit même avoir réfléchi....

Donc ce n'est pas un combat qui dure 2 Heures, c'est un chrono qui s'écoule, le combat est instantané à la fin du dit chrono. Ensuite pourquoi? Parcequ'il s'agit d'un jeu multi joueur et des centaines de joueurs s'affrontent dans des milliers de batailles. Donc si c'est une actualisation qui n'est pas faites de façon récurrente cela occasionnera des bugs.

J'ai plusieurs solutions hypotéthique trouvé mais celon moi elles ne sont pas bonne, d'ou le fait que j'en cherche ici d'autre.

Ma solution première était la tache Cron, mais sur le serveur je la vois disponible toute les 5 minutes, je me dis que c'est probablement trop peu. ( Je n'ai jamais utilisé CRON)

J'ai une autre solution, qui est d'incrémenter le calcul du temps dans la page principale du jeu, ce qui fait que dès qu'on joueur est connecté il rafraichi les temps du serveur s'il y a.

Donc j'ai réfléchi... vois tu. Je viens ici pour trouver des solutions que je n'ai pas, qu'on me propose quelque chose que j'ignorais (comme tu l'as fait au début du sujet bien entendu) Je ne suis pas dev pro, je ne connais pas toute les possibilités qui m'entoure. Donc je ne sais pas si rafraichir un serveur fréquemment est une bonne chose ou non. D'ou ma question d'il y a 2 réponses.

Merci

Alors pour commencer je déteste qu'on me dise réfléchi, sans soit même avoir réfléchi....

Ce n'est pas une manière de parler à quelqu'un qui prend la peine de t'aider, car là tu ne fais que m'insulter.

Donc ce n'est pas un combat qui dure 2 Heures, c'est un chrono qui s'écoule, le combat est instantané à la fin du dit chrono.

Comment suis-je censé le deviner, tu as parlé du joueur qui lance son attaque et ensuite deux heures ...
De plus que le fait que le joueur doivent attendre deux heures pour connaître l'issue du combat et donc de son attaque, c'est beaucoup trop à mon avis, tu as déja vu une attaque qui à un délai de deux heures toi ?
Jamais pour ma part.

Je clique pour lancer mon attaque, bon maintenant je vais attendre deux heures pour savoir si je l'ai touché ...

À principe quand tu lances une attaque c'est pendant un combat, donc ton déroulement n'est pas très logique.

je la vois disponible toute les 5 minutes, je me dis que c'est probablement trop peu.

En quoi ce serait trop peu un script qui s'effectue toutes les 5 minutes, soit environ 288 fois par jour ?

il s'agit d'un jeu multi joueur et des centaines de joueurs s'affrontent dans des milliers de batailles. Donc si c'est une actualisation qui n'est pas faites de façon récurrente cela occasionnera des bugs.

Totalement incorrect, tu n'est pas obligé de demander à ton serveur de faire une requête SQL qui ne récupérerais qu'un enregistrement en base de données, il peut en récupérer plusieurs et faire le nécessaire, donc qu'il n'y ai qu'un joueur ou plusieurs ne change absolument rien.

Ty Malib
Auteur

Donc ce n'est pas un combat qui dure 2 Heures, c'est un chrono qui s'écoule, le combat est instantané à la fin du dit chrono.

Comment suis-je censé le deviner, tu as parlé du joueur qui lance son attaque et ensuite deux heures ...
De plus que le fait que le joueur doivent attendre deux heures pour connaître l'issue du combat et donc de son attaque, c'est beaucoup trop à mon avis, tu as déja vu une attaque qui à un délai de deux heures toi ?
Jamais pour ma part.

C'est un jeu de conquête spatiale... Tu peux mettre 10 minutes comme une semaine, l'espace c'est grand.

Ce n'est pas une manière de parler à quelqu'un qui prend la peine de t'aider, car là tu ne fais que m'insulter.

Certes, et dire réfléchi à quelqu'un qui pose des questions qui semble loin d'être stupide.

Bref, je viens d'essayer une méthode, celle qui consiste à actualiser les temps etc... Mais ce n'est pas bon, le script de combat bug. Donc la tache Cron rendra le même résultat. Pour le moment je coince. Je dois penser autrement.

Pour information: il existe des dixaines de jeu utilisant le meme principe. Terre Noire, Travian, Ogame, SG return etc etc etc...
Donc c'est faisable, maintenant je dois trouver comment.
;)

Certes, et dire réfléchi à quelqu'un qui pose des questions qui semble loin d'être stupide.

Si je t'ai parlé de réfléchir, c'est parce que tu avais créé un post pour me poser la question pour une seconde, et ensuite tu crées un autre post pour me demander pour une minute.
Alors qu'avec ma réponse à la première question, il aurait fallu que tu analyses la situation avec ton système, ce n'est pas aux autres de le faire à ta place, poser des questions n'est pas un problème, mais être assisté en est un.
Si je t'avais répondu à la deuxième question par non, tu aurais sans doute continuer à me poser la question pour 5 minutes, 10 minutes ...
On en finirait jamais.

C'est un jeu de conquête spatiale... Tu peux mettre 10 minutes comme une semaine, l'espace c'est grand.

Sauf que c'est un jeu et je ne vois pas le rapport, le temps pour arriver à un endroit peut être long, sauf que là tu dis qu'un joueur lance une attaque, qu'un chrono se lance avec une durée de deux heures, et que le combat ne s'effectue qu'après la fin du chrono, ce qui comme je l'ai dit est très peu logique, tu ne lances une attaque que pendant un combat et non deux heures avant.

je viens d'essayer une méthode, celle qui consiste à actualiser les temps etc... Mais ce n'est pas bon

Bien sur que non, puisque avec ce système l'utilisateur doit être sur le jeu et c'est pour ce problème que tu as posté ton sujet.

Donc la tache Cron rendra le même résultat.

Totalement inexact, ce sont deux choses différentes, une tâche CRON n'a pas besoin d'intéraction avec un utilisateur, contrairement à ton système de rafraichissement qui nécessite qu'un utilisateur soit sur le site.

Sinon, pourquoi je t'aurais parlé des tâches CRON si elle ne pouvait pas au minimum solutionner ton problème ?

Pour être hônnete Lartak tu aide pas du tout en fait, certe il pourrait faire qqch avec les webscokets mais c'est clairement pas ça le problème, son jeu n'a pas besoin d'être HYPER dynamique, puis comme il dit y a pleins d'autre jeu web comme ça qui existe.
De plus tu peux très bien faire des websockets en PHP avec ReactPHP ou des libs qui se base sur celle-ci.

Donc juste pour être clair le problème c'est que si UN des joueurs n'est pas connecté lors du combat il peut pas savoir le résultat c'est bien ça @Ty Malib ?

il pourrait faire qqch avec les webscokets mais c'est clairement pas ça le problème

Je n'ai jamais dit qu'il n'y avait que les websockets comme solution, je lui ai certes dit que c'était la méthode la plus adaptée, mais certainement pas qu'il ne pourrait pas faire sans et je lui ai d'ailleurs proposé une solution parallèle.

Ty Malib
Auteur

Totalement inexact, ce sont deux choses différentes, une tâche CRON n'a pas besoin d'intéraction avec un utilisateur, contrairement à ton système de rafraichissement qui nécessite qu'un utilisateur soit sur le site.

Sinon, pourquoi je t'aurais parlé des tâches CRON si elle ne pouvait pas au minimum solutionner ton problème ?

En faite la le soucis quand je donnais cette exemple venais de ma façon de coder, si le joueur est pas connecté il y avait un probleme de variable, je l'aurais avec le Cron, mais à la rigueur ca je peux probablement trouver une solution. ;)
GOrgio: Oui, en faite comme le jeu n'est pas dynamique c'est en actualisant quand on est la qu'il considère le chrono atteint. COmme l'actualisation se fait sans que le joueur le sache (header) tant que l'un des deux partis est connecté sa fonctionne, si le temps est dépassé à la connexion on à du 1 sur deux et un combat completement faussé par la meme ocasion, limite 2 ou 3 pourraient se dérouler en meme temps.

Websockets en PHP je ne connais pas.

Et lartak, okay pour le réfléchi je t'avais mal compris sorry ;)

À la rigeur pour avoir des combats identiques et reprocutible mais qui reste random tu as qu'as générer un seed par combat que tu passe à une fonction pseudo-random que tu seed et donc tu auras forcément les mêmes nombres à chaque utilisation de cette fonction random.
Et en quoi le combat et complètement faussé car les combats sont pas les mêmes ou ?

Ty Malib
Auteur

Seed ca veut dire quoi?

Ils sont faussé, car voici un exemple, je vais shématisé au maximum.

Je t'espionne je vois que tu as pas de défense, je decide de t'attaque il est midi, ma flotte met 3h pour se rendre sur ta planète. Ma flotte de 2 vaisseaux devrait donc arriver à 15h00.
Dans le même temps, l'autre personne est rentré chez elle, il est 12h02 quand je vois l'attaque. Mince,vite je construit des défenses, selon mes calculs et connaissances, 2 défenses sont suffisante pour détruire le joueur A qui m'attaque. Par précaution je vais en mettre 3. Elles ont un temps de construction de 1h30, je lance quand même 3 constructions.

Ce qui veut donc dire qu'à 15h quand le joueur A attaque le joueur B on devrait avoir 2 vaisseaux contre 1 défense. Mais comme les deux joueurs sont reparti au boulot, ils vont se connecter en rentrant le soir. On dira 18h par exemple.

Le joueur A se connecte, sachant qu'il devait avoir gagné, et la surprise il se connecte (le jeu actualise le combat), son vaisseau à rencontré 3 défenses et a perdu, car le combat aura eu lieu à 18h et non à 15h.

Donc le combat est faussé.