logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 15-01-2019 21:46:36

d4v3
Membre
Distrib. : Debian Stretch (9.6) 64 bits
Noyau : 4.9.0-8-amd64
(G)UI : XFCE
Inscription : 31-12-2018

[Résolu] Jeu de gestion (HTML, PHP, etc...)

Bonjour !

J'ai commencé il y a un peu plus d'une semaine le développement d'un petit jeu de gestion. C'est très simpliste, le but étant d'approfondir mes connaissances en php / serveurs, avec la gestion du temps tout en essayant d'amuser les copains !

J'ai donc mis toutes mes idées sur papier, de l'organisation visuelle aux spécificités de mes éléments en passant par les tables SQL.
La création de "stations" (cf. villes) est possible ainsi que l'envoi de missions (par exemple: une mission d'expédition, enlève un éclaireur. Puis, ajoute un éclaireur et un montant aléatoire de telle ou telle ressource aux différentes table de la bdd). Bon, l'aléatoire est pas encore implémenté mais ça ira comparé à cet obstacle: Le Temps.

En effet, tout est fait instantanément mais j'aimerai pouvoir mettre un delay.
Par exemple, création de caserne -> enlève 200 bois [maintenant] / Ajoute 1 caserne [dans 2h]. Voir tout dans 2h, là n'est pas le problème pour l'instant mrgreen.gif

Je viens donc vous demander vers où me diriger, comment faire ? Je suis dans le brouillard, apparemment pas possible en php, je dois sûrement le faire côté serveur mais je n'ai pas la moindre idée de l'organisation, du point de départ de cet apprentissage.
Un envoi du formulaire sur une page .php qui transforme en script serveur ? Je ne sais pas.

Pourriez-vous donc m'aiguiller pour rendre mon petit projet réalisable svp ? sos.gif

Merci big_smile

Voilà une petit image de la map, lors de la création de station (La référence à fallout est bien sûr évidente, mais comme c'est un jeu que je fais pour amuser mes amis ça ne pose pas de problème ^^)
1547584967-exmple-map.png

Dernière modification par d4v3 (21-01-2019 12:15:21)

Hors ligne

#2 15-01-2019 22:52:05

pas-si-facile
Membre
Lieu : Paris
Distrib. : Debian 9 stable
Noyau : Linux 4.9.0-8-amd64
(G)UI : Xfce
Inscription : 09-01-2019
Site Web

Re : [Résolu] Jeu de gestion (HTML, PHP, etc...)

Salut,

Un truc qui ressemble à ça (dans le fait de déterminer un temps de départ par ntp puis de s'en servir ensuite comme timestamp) :
https://stackoverflow.com/questions/165 … er-via-php  ?

Dernière modification par pas-si-facile (15-01-2019 22:52:35)

Hors ligne

#3 15-01-2019 23:06:47

d4v3
Membre
Distrib. : Debian Stretch (9.6) 64 bits
Noyau : 4.9.0-8-amd64
(G)UI : XFCE
Inscription : 31-12-2018

Re : [Résolu] Jeu de gestion (HTML, PHP, etc...)

Merci ! Ca a l'air intéressant en effet de se servir du ntp !

A l'envoi du formulaire on prend le temps et on y ajoute deux heures.
Et dans les codes pour récupérer les données on vérifie que ce temps <= à l'heure actuelle ? Je ne vois pas trop comment organiser la bdd dans ce cas là.

Pour le moment, c'est de type :


| ID |  id_station | bois | argent |
  1          5        50     50
 


Il faudrait donc créer une table par type d'élément du jeu avec id, id_station, date_creation ??

Dernière modification par d4v3 (15-01-2019 23:07:32)

Hors ligne

#4 15-01-2019 23:40:59

anonyme
Invité

Re : [Résolu] Jeu de gestion (HTML, PHP, etc...)

Bonjour,

Sans même passer par du NTP tu dois pouvoitr trouver une fonction date() en PHP. wink
Tu peux créer un champ pour définir des types d'objets et ainsi définir des sous groupes d'objets sur lesquels appliquer une action particulière pour éviter d'ajouter une table. Mais tu as tout intérêt à définir précisément dès le départ l'ensemble des données dont tu auras besoin et leur organisation en tables dans la base, sous peine de passer pas mal de temps ensuite à refaire la base et adapter toutes les requêtes existantes au nouveau schéma.

#5 16-01-2019 01:06:27

d4v3
Membre
Distrib. : Debian Stretch (9.6) 64 bits
Noyau : 4.9.0-8-amd64
(G)UI : XFCE
Inscription : 31-12-2018

Re : [Résolu] Jeu de gestion (HTML, PHP, etc...)

tux12 a écrit :

Bonjour,

Sans même passer par du NTP tu dois pouvoitr trouver une fonction date() en PHP. wink
Tu peux créer un champ pour définir des types d'objets et ainsi définir des sous groupes d'objets sur lesquels appliquer une action particulière pour éviter d'ajouter une table. Mais tu as tout intérêt à définir précisément dès le départ l'ensemble des données dont tu auras besoin et leur organisation en tables dans la base, sous peine de passer pas mal de temps ensuite à refaire la base et adapter toutes les requêtes existantes au nouveau schéma.



D'accord je vais me pencher sur cette solution. Bon mes tables sont déjà créées mais comme je fais vraiment un petit projet ce sera pas long de tout retravailler ^^

tux12 a écrit :

des types d'objets et ainsi définir des sous groupes d'objets


J'ai créé des tables "ressources", pour bois et argent par exemple, et "infrastructures", pour caserne et centre-ville par exemple. Mais je ne vois pas comment organiser cela autrement, j'espère que ça se clarifiera en intégrant les notions que j'aurais trouvées durant mes recherches sur la fonction date() !

Merci !

Dernière modification par d4v3 (16-01-2019 01:07:00)

Hors ligne

#6 16-01-2019 01:11:21

d4v3
Membre
Distrib. : Debian Stretch (9.6) 64 bits
Noyau : 4.9.0-8-amd64
(G)UI : XFCE
Inscription : 31-12-2018

Re : [Résolu] Jeu de gestion (HTML, PHP, etc...)

d4v3 a écrit :

...




P.S: Et donc il n'y aurait pas besoin de manip' côté serveur ? tout continuerait de se faire dans la gestion dans table ? J'avoue que c'est bien plus pratique pour le développement ! smile

P.S2: Désolé pour le double-post j'ai miss-click..

Dernière modification par d4v3 (16-01-2019 01:13:22)

Hors ligne

#7 16-01-2019 09:48:06

anonyme
Invité

Re : [Résolu] Jeu de gestion (HTML, PHP, etc...)

Bonjour
=> https://www.w3schools.com/php/php_ref_date.asp

dans un moteur de recherche tu tape par exemple "php time" ou "php date" etc ...
sur le site officiel de php aussi  => http://php.net/manual/fr/index.php
il faut juste travailler tes scripts

#8 16-01-2019 18:57:14

d4v3
Membre
Distrib. : Debian Stretch (9.6) 64 bits
Noyau : 4.9.0-8-amd64
(G)UI : XFCE
Inscription : 31-12-2018

Re : [Résolu] Jeu de gestion (HTML, PHP, etc...)

anonyme a écrit :

Bonjour
=> https://www.w3schools.com/php/php_ref_date.asp

dans un moteur de recherche tu tape par exemple "php time" ou "php date" etc ...
sur le site officiel de php aussi  => http://php.net/manual/fr/index.php
il faut juste travailler tes scripts



Merci, j'ai déjà utiliser date() par exemple. Mais je n'avais pas pensé à faire une organisation des tables dépendant de dates, donc je vais me pencher dessus. Je pensais que peut être il aurait fallu passé par un script serveur directement.

anonyme a écrit :

il faut juste travailler tes scripts


Qu'entends-tu par scripts ? Parles tu de mon code .php ou de scripts serveurs ?

Hors ligne

#9 16-01-2019 19:59:29

anonyme
Invité

Re : [Résolu] Jeu de gestion (HTML, PHP, etc...)

Histoire de mettre la grouille, euh... je veux dire de te donner des pistes, tu peux aussi définir et manipuler des dates en SQL directement.. big_smile
voir par exemple ici https://openclassrooms.com/fr/courses/9 … tes-en-sql
Dans tous les cas ça n'empêche pas de gérer le serveur par NTP, mais ça sera plus facile de passer par les fonctions de PHP ou MySQL que d'écrire un client NTP en PHP.

#10 16-01-2019 21:08:48

d4v3
Membre
Distrib. : Debian Stretch (9.6) 64 bits
Noyau : 4.9.0-8-amd64
(G)UI : XFCE
Inscription : 31-12-2018

Re : [Résolu] Jeu de gestion (HTML, PHP, etc...)

tux12 a écrit :

Histoire de mettre la grouille, euh... je veux dire de te donner des pistes, tu peux aussi définir et manipuler des dates en SQL directement.. big_smile
voir par exemple ici https://openclassrooms.com/fr/courses/9 … tes-en-sql
Dans tous les cas ça n'empêche pas de gérer le serveur par NTP, mais ça sera plus facile de passer par les fonctions de PHP ou MySQL que d'écrire un client NTP en PHP.



Aaaah super merci ! Je ne pensais pas une minute à manipuler directement le SQL ! Je vais donc me pencher sur le tuto que tu as collé ici ! Merci smile

Hors ligne

#11 17-01-2019 10:06:33

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian
Noyau : Dur
(G)UI : gui gui, je zuis un doiseau
Inscription : 07-07-2008
Site Web

Re : [Résolu] Jeu de gestion (HTML, PHP, etc...)

@d4v3: pour ce genre de choses, je pense qu'un système à la cron est nécessaire.

Dans une table de ta BDD, tu listes les événements qui doivent survenir et la datetime à laquelle ils doivent survenir (exemple: construire bâtiment X à 12h15).

+----+------+--------+-------------------------------------------------+---------------------+-------+
| id | user | action | data                                            | action_time         | done  |
+----+------+--------+-------------------------------------------------+---------------------+-------+
|  1 |   42 |  build | a:2:{s:4:"type";s:7:"barraks";s:4:"city";i:13;} | 2019-01-20 12:15:00 | false |
+----+------+--------+-------------------------------------------------+---------------------+-------+



Et tu fais un cron qui s'exécute très régulièrement (genre toutes les 10 secondes), qui vérifie s'il n'y a pas des tâches qui devraient être exécutées (action_time < now()), les exécute et les retire de la liste (ou les marque comme faites si tu veux un historique)
Donc, un script task_manager.php qui serait exécuté via « php /chemin/vers/ton/task_manager.php » toutes les 10 secondes par le serveur.


captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.

Hors ligne

#12 17-01-2019 12:57:57

d4v3
Membre
Distrib. : Debian Stretch (9.6) 64 bits
Noyau : 4.9.0-8-amd64
(G)UI : XFCE
Inscription : 31-12-2018

Re : [Résolu] Jeu de gestion (HTML, PHP, etc...)

Ah oui c'est cool, en plus ça permet d'avoir un journal de logs grâce à l'historique ! Ca complique la tâche mais ça a l'air plus optimisé je vais essayer !
Donc, l'envoi du formulaire entre la data et task_manager.php dis if action_time < now(){faire le contenu de la data} si j'ai bien compris smile

Pour info, que signifie "a:2:{s:4:"type";s:7:"barraks";s:4:"city";i:13;}". C'est un exemple ou est-ce possible de mettre une commande sql dans la colonne data ?


Sinon sans cron, j'avais pensé à ajouter une table travaux (donc partir du même principe, avec colonne id_station, type, date) mais en effectuant des vérifications au début du code.
Si date < now { SET $type = $type +1}

Mais c'est vrai que ça oblige à faire une table par autre table de référence. scratchhead.gif
Ah et aussi pour faire un journal ou autre ça complique.

Je vais essayer la technique que tu proposes, et je reviendrai poster ici mon avancée (je m'y mettrai sûrement ce week-end) smile

Merci !

Hors ligne

#13 17-01-2019 13:20:17

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian
Noyau : Dur
(G)UI : gui gui, je zuis un doiseau
Inscription : 07-07-2008
Site Web

Re : [Résolu] Jeu de gestion (HTML, PHP, etc...)

d4v3 a écrit :

Ah oui c'est cool, en plus ça permet d'avoir un journal de logs grâce à l'historique ! Ca complique la tâche mais ça a l'air plus optimisé je vais essayer !


C'est aussi un moyen plus simple de traites des cas comme « je construis une mine, dès que la mine est terminée, elle va commencer à extraire du fer, comment être sûr que l'extraction a bien commencé au bon moment, etc. » si t'as un cron, ta mine est « effectivement » construite au bon moment.

d4v3 a écrit :

Donc, l'envoi du formulaire entre la data et task_manager.php dis if action_time < now(){faire le contenu de la data} si j'ai bien compris smile


Alors, ce que je te propose, c'est que ton task_manager.php soit réservé à cron (tu peux l'appeler cron.php d'ailleurs…). Ton formulaire pour rajouter une tâche, tu l'envoies à un autre fichier qui s'occupe juste de rajouter le truc dans la base de donnée.

Ensuite, dans cron.php, tu fais un truc du genre

SELECT * FROM `tasks` WHERE `action_time` < NOW() AND done = 0;


Comme ça, tu ne récupères que les tâches qui t'intéressent. Puis tu itères dessus et les effectue.

d4v3 a écrit :

Pour info, que signifie "a:2:{s:4:"type";s:7:"barraks";s:4:"city";i:13;}". C'est un exemple ou est-ce possible de mettre une commande sql dans la colonne data ?


En fait, ce sont des données PHP transformées en texte via la fonction serialize()

$data = array("type" => "barraks", "city" => 13);
$data_str = serialize($data);


Comme ça, si tu as des champs sur lesquels tu ne souhaites pas faire de requête, qui ne concernent pas toutes les entrées (comme justement des données précises sur la tâche à effectuer), au lieu de créer de nouvelles colonnes dans la base de donnée, tu peux tout simplement stocker dans dans une colonne TEXT, sous forme sérialisée.
Le "a:2", "s:4", "i", ce sont des informations rajoutées par PHP pour être sûr de pouvoir retrouver ses petits… a:2 => tableau à 2 éléments. s:4 => chaîne de caractère de longueur 4, "i" => un entier.

Tu récupères ensuite ça avec un

$data = unserialize($ma_ligne['data']);



d4v3 a écrit :

Sinon sans cron, j'avais pensé à ajouter une table travaux (donc partir du même principe, avec colonne id_station, type, date) mais en effectuant des vérifications au début du code.
Si date < now { SET $type = $type +1}

Mais c'est vrai que ça oblige à faire une table par autre table de référence. https://debian-facile.org/img/smilies/x … chhead.gif
Ah et aussi pour faire un journal ou autre ça complique.



Et surtout, ton code n'est exécuté que lorsque l'on visite la page. Si tu veux par exemple enchaîner deux constructions dans la nuit, et que la première produit une ressource une fois achevée, ben… si tu ne te connectes que le matin, tu as perdu toute la production de bois de la nuit.

d4v3 a écrit :

Je vais essayer la technique que tu proposes, et je reviendrai poster ici mon avancée (je m'y mettrai sûrement ce week-end) smile


Ok smile


captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.

Hors ligne

#14 17-01-2019 13:33:26

d4v3
Membre
Distrib. : Debian Stretch (9.6) 64 bits
Noyau : 4.9.0-8-amd64
(G)UI : XFCE
Inscription : 31-12-2018

Re : [Résolu] Jeu de gestion (HTML, PHP, etc...)

Wow je n'avais même pas encore envisagé la production de ressources pour tout dire ! C'est super j'ai plein de notions à travailler là merci beaucoup ! big_smile

Dernière modification par d4v3 (17-01-2019 22:40:42)

Hors ligne

#15 20-01-2019 21:35:15

d4v3
Membre
Distrib. : Debian Stretch (9.6) 64 bits
Noyau : 4.9.0-8-amd64
(G)UI : XFCE
Inscription : 31-12-2018

Re : [Résolu] Jeu de gestion (HTML, PHP, etc...)

Bonjour !

Bon j'ai essayé de remplir la table et j'ai déjà eu un problème que je ne comprends pas. Tout me semble bon mais ça ne marche pas, avec ce message d'erreur:

) Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 Erreur de syntaxe près de '(id_station, action, data, action_time) VALUES('12', 'add', 'UPDATE population S' à la ligne 1 in E:\wamp-sites\jeu\index.php on line 47
( ! ) PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 Erreur de syntaxe près de '(id_station, action, data, action_time) VALUES('12', 'add', 'UPDATE population S' à la ligne 1 in E:\wamp-sites\jeu\index.php on line 47



Voilà le code php:

// Ajout de batisseurs / Suppression de population
                $addBatisseurs = $_POST['addBatisseurs'];            
                $addDataSQL = 'UPDATE population SET batisseurs = batisseurs + '.$addBatisseurs.' WHERE id_station = '.$userinfo['station1'].'; UPDATE ressources SET population = population - '.$addBatisseurs.';';
                $taskDate= date("d/m/Y H:i:s", strtotime('now +5 Minutes'));
               
                $reqTaskAdd = $bdd->prepare('INSERT INTO (id_station, action, data, action_time) VALUES(?, ?, ?, ?)');
                $reqTaskAdd->execute(array($userinfo['station1'], 'add', $addDataSQL, $taskDate));

Hors ligne

#16 20-01-2019 21:35:37

d4v3
Membre
Distrib. : Debian Stretch (9.6) 64 bits
Noyau : 4.9.0-8-amd64
(G)UI : XFCE
Inscription : 31-12-2018

Re : [Résolu] Jeu de gestion (HTML, PHP, etc...)

La solution est peut-être évidente mais je ne la vois pas yikes
Edit désolé du double post je continue de cliquer sur "Citer" au lieu de "Modifier" ><
Haha, j'ai oublié de nommer la table après INSERT INTO, ce temps perdu pour rien ! Désolé out.gif

Dernière modification par d4v3 (20-01-2019 22:02:32)

Hors ligne

#17 21-01-2019 12:15:00

d4v3
Membre
Distrib. : Debian Stretch (9.6) 64 bits
Noyau : 4.9.0-8-amd64
(G)UI : XFCE
Inscription : 31-12-2018

Re : [Résolu] Jeu de gestion (HTML, PHP, etc...)

La solution que j'ai retenue est donc de créer un fichier cron.php en interaction avec une table contenant les requêtes SQL à exécuter.
Le fichier donne donc cela, pour l'instant. Bien sûr il faut encore le faire évoluer mais grâce à cette solution proposée par captnfab beaucoup de portes se sont ouvertes !

$reqTasks = $bdd->query('SELECT data FROM `tasks` WHERE `action_time` < NOW() AND done = 0');
    while($data = $reqTasks->fetch())
    {
        $sql = $data['data'];
        $prepare = $bdd->prepare($sql);  
        $prepare->execute(array($sql));
        $prepare->closeCursor();
        $itisDone = $bdd->prepare('UPDATE `tasks` SET done = 1 WHERE data = ?');
        $itisDone->execute(array($sql));
        $itisDone->closeCursor();
    }



Prochaines étapes, continuer d'appliquer cela à toutes les fonctionnalités, faire une page pour afficher des logs et ajouter de l'AJAX pour afficher le temps restant.

Merci à tous de m'avoir répondu smile

Dernière modification par d4v3 (21-01-2019 12:16:05)

Hors ligne

#18 22-01-2019 09:39:42

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian
Noyau : Dur
(G)UI : gui gui, je zuis un doiseau
Inscription : 07-07-2008
Site Web

Re : [Résolu] Jeu de gestion (HTML, PHP, etc...)

Content d'avoir pu aider. Ça prend forme smile

Juste une petite remarque : si tu as deux requêtes les mêmes à exécuter, alors qd tu en exécutes une, ça marquera l'autre comme exécutée également (parce que ton WHERE ne filtre que sur `data`).
Pour éviter cela, il est bon d'utiliser une colonne ID qui ne contienne que des valeurs uniques (en général, une clé primaire contenant des entiers auto-incrémentés).
Ça donnerait un « SELECT id,data FROM… » et puis « …SET done = 1 WHERE ID = ?'); »

Bonne continuation, et tiens nous au courant des évolutions de ton jeu ! smile

captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.

Hors ligne

#19 23-01-2019 00:27:37

d4v3
Membre
Distrib. : Debian Stretch (9.6) 64 bits
Noyau : 4.9.0-8-amd64
(G)UI : XFCE
Inscription : 31-12-2018

Re : [Résolu] Jeu de gestion (HTML, PHP, etc...)

captnfab a écrit :


Juste une petite remarque : si tu as deux requêtes les mêmes à exécuter, alors qd tu en exécutes une, ça marquera l'autre comme exécutée également (parce que ton WHERE ne filtre que sur `data`).
Pour éviter cela, il est bon d'utiliser une colonne ID qui ne contienne que des valeurs uniques (en général, une clé primaire contenant des entiers auto-incrémentés).
Ça donnerait un « SELECT id,data FROM… » et puis « …SET done = 1 WHERE ID = ?'); »



Oui les deux sont marquées, mais comme je veux que certaines choses se passent au même moment je ne trouve pas cela gênant, pour l'instant en tout cas mrgreen.gif

captnfab a écrit :

Bonne continuation, et tiens nous au courant des évolutions de ton jeu ! smile



Encore merci, toutes ces requêtes dans le fichier cron.php, c'est génial !
Ça reste très basique mais si le jeu plaît aux copains, je le mettrais en ligne et posterais dans la rubrique jeu pour tester !

Hors ligne

Pied de page des forums