JeuWeb - Crée ton jeu par navigateur
Système de clic en direct - 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 : Système de clic en direct (/showthread.php?tid=6921)



Système de clic en direct - Konroy - 20-09-2013

Yop ,
voilà j'ai une petite question pour un script que je fais pour mon jeu. En gros je veux que une image d'une arme s'affiche aléatoirement sur une page précise de mon jeu, à une heure x, et que le premier joueur qui clique sur cette arme l'obtient.
Pas très difficile en php, on renvoi sur une page qui enlève l'objet en jeu et l'ajoute au joueur ( je pense ? )
Mais :
- Si le joueur ne rafraichit pas la page, il ne verra pas l'arme apparaitre.
- Si plusieurs joueurs clic en meme temps, php sera gérer tout ca ?

Je m'y connais pas, mais est ce que l'ajax est recommandé ici? Puis je faire bcp plus simple ?
Merci Smile


RE: Système de clic en direct - Th3conc3pt3ur - 20-09-2013

"Si plusieurs joueurs clic en meme temps, php sera gérer tout ca ?"
ça c'est "impossible" avec un timestamp coté serveur t'aurai toujours des microsecondes de différences.
Pour ce qui est de l'heure il suffit de faire une Date() comparaison entre la date actuelle et la date ou tu veux que ca apparaisse. En suite au chargement de la page du envoie une req qui dit que la page à été afficher, tu vire un flag dans ta base de données et paf la page n'est plus accessible ou du moins y aura plus rien à gagner.

Exemple :
Code :
<?php

$date_en_cours = date("Y-m-d h:i:s");
$madate = date("2013-09-20 13:00:00");

if( $date_en_cours >= $madate)
{
    $req_update_joueur = "XXX" // requete pour ajouter au joueur son arme
    mysql_query($req_update_joueur);

    $req = "UPDATE matable set MonFlagQuiDitSiCestDonnerOuPas = 1"; // = 1 pour oui c'est donnée
    mysql_query($req);
    echo "Félicitation vous avez acquérie l'arme X";
}
else
{
    echo "Arme deja donnée désoler";
}

?>



RE: Système de clic en direct - Konroy - 20-09-2013

Dac mais si le joueur ne raffraichit pas la page , il n'aura pas l'affichage de l'arme ?


RE: Système de clic en direct - Th3conc3pt3ur - 20-09-2013

Avec ce code à partir du moment ou la page à été afficher une fois elle ne peu plus s'afficher Smile , vu que tu as passer le flag à 1
Bien sur le code que je t'ai donné est très loin d'être complet mais tu as le cheminement de comment je le vois Wink


RE: Système de clic en direct - Xenos - 20-09-2013

Citation :le premier joueur qui clique sur cette arme l'obtient.

Avec le code ci-dessus, y'a un problème...
Si deux joueurs cliquent en même temps ou presque, alors l'arme sera donnée aux deux... Voire même, si un joueur clic deux fois, il prendra deux armes...

Code PHP :
<?php 
$req
= "UPDATE `armes` SET `given`=1 WHERE `idArme`=$idArme AND `given`=0 LIMIT 1"; // = 1 pour oui c'est donnée
$mysqli->query($req);
if (
$mysqli->affected_rows != 1)
{
throw new
Exception('arme déjà donnée');
}
else
{
// Donner l'arme au joueur
$mysqli->query("INSERT INTO `armesJoueurs` (`idJoueur`, `idArme`) VALUES ($idJoueur, $idArme);");
// Bien s'assurer de la validité des variables $idArme et $idJoueur, histoire de ne pas se faire de belles portes d'entrée pour les injections SQL
}

A noter qu'il faudra, pour être propre, se pencher sur les conditions d'arrêt du script PHP en cas de déconnexion du client. Si le client se déconnecte quand PHP entre dans le "else", alors suivant le comportement du script, ce dernier pourrait se stopper et le joueur n'aura pas son arme dans son inventaire (car la requête insérant l'arme n'a pas été faite).


Pour l'affichage coté client, il te faudrait, pour éviter le rafraichissement, un morceau AJAX oui (ou un push serveur comme certains adorent ici :p mais si t'es sur un mutualisé, oubli). Avec ton code AJAX, tu peux alors interroger une page PHP, qui renverra comme réponse un JSON par exemple ou un texte brut (ou même un simple header HTTP, pourquoi pas). La réponse du script PHP se base sur la date serveur et sur la base de données pour savoir si une arme est disponible. Un identifiant de l'arme disponible (ou NULL sinon) est alors renvoyée au client. Le client (AJAX) peut ensuite récupérer l'image correspondante et mettre l'affichage de la page à jour. L'affichage contient alors un lien vers un autre fichier PHP, similaire aux codes donnés précédemment, qui se charge d'ajouter l'arme si elle est bien disponible (la vérification de la disponibilité devrait réutiliser le code PHP de la première page, celle que l'AJAX avait appelé). L'arme est alors ajoutée, et le serveur renvoie une réponse de type "Vous avez une arme de plus dans votre inventaire", pour que le client sache ce qu'il s'est passé.


RE: Système de clic en direct - niahoo - 20-09-2013

Quelle différence avec AJAX ? faut bien dans un premier temps vérifier que l'arme est toujours dispo, et dans un second temps l'attribuer à un joueur.

Un transaction avec lock et pis voila.


RE: Système de clic en direct - xviniette - 20-09-2013

Je ne vais pas m'intéresser au côté développement de la chose, mais plutôt sur l'intérêt d'un tel système.

Est il intéressant de proposer un tel système pour récupérer un item ? Il est très simple de créer un bot afin de simuler le clique à un instant précis, et ainsi ne laisser (quasi) aucune chance aux autres joueurs.


RE: Système de clic en direct - Xenos - 20-09-2013

Un tel bot se repérera car il sera présent 24h/7j
Rien n'empêche d'ailleurs d'avoir un système qui affiche l'arme pour certains joueur seulement (ceux dont l'id est congru à 1 modulo 10 par exemple), et d'autres items pour les autres: un bot ne récupèrera pas tous les items du serveur. Ou encore, faire le même genre de système, mais pour chaque joueur. Ok, un bot donnera un atout car on récoltera tous les items qui nous sont proposés sans jamais en rater une seule (ce qui peut mettre la puce à l'oreille des modérateurs), mais cela n'impactera pas les autres joueurs.

D'ailleurs, mais je vais éviter de trop tirer le sujet dans cette direction (comme à mon habitude XD), un bot est-il vraiment une mauvaise chose? cela montre que le jeu intéresse des joueurs car il faut que l'enjeu soit suffisamment intéressant pour que la personne développe un bot sur ce jeu.


RE: Système de clic en direct - Konroy - 20-09-2013

Ok donc plutot ajax pour l'affichage alors ? Vous auriez pas une doc assez simple j'ai aucune base dessus Smile


RE: Système de clic en direct - srm - 22-09-2013

Un tel bot n'est pas obligé d'être présent 24/7 Wink