JeuWeb - Crée ton jeu par navigateur
[Résolu] Comment coder proprement ? - 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 : [Résolu] Comment coder proprement ? (/showthread.php?tid=2381)

Pages : 1 2 3 4 5


RE: Aide pour coder "pro"^^ - Sephi-Chan - 06-02-2008

Et pourtant c'est super bien. Si vous saviez ce que j'ai pu cracher sur la POO, quand je rageais de pas en comprendre les intérêts, et autre. Alors que maintenant, je trouve ça génial !


Sephi-Chan, mettez-vous y ! Big Grin


RE: Aide pour coder "pro"^^ - Kassak - 06-02-2008

Quelqu'un de motivé pour faire un truc avec moi?

Genre de passer mon script d'attaque, qui j'avoue est lourd, en classe, afin que je voye ce que ça a dans le bide la POO^^


RE: Aide pour coder "pro"^^ - Ziliev - 06-02-2008

Si personne veut nous montrer aussi ... C'est un concept franchement difficile à apréhender quand t'as toujours connu que le codage bétécon, alors évitez nous de nous farcir 15 pages de tuto pour qu'on se rende compte au final que ca nous interesse pas ou qu'on y comprend rien ...


RE: Aide pour coder "pro"^^ - blackduty - 06-02-2008

Il y a des scripts en POO sur le forum.
Jetez y un œil Wink

http://www.jeuweb.org/board/showthread.php?tid=2851

Maintenant, on va pas non plus se battre avec vous pour faire de la POO. C'est un choix de programmation, ni plus, ni moins.


RE: Aide pour coder "pro"^^ - Ziliev - 06-02-2008

blackduty a écrit :Il y a des scripts en POO sur le forum.
Jetez y un œil Wink
C'est exactement de ca que je parle quand je vous dit qu'on a pas envie de se tapper 15 pages de tuto pour se faire une idée Tongue Et encore j'me rend compte que 15 pages j'étais trop gentil.

blackduty a écrit :C'est un choix de programmation, ni plus, ni moins.
Pour ceux qui savent ce que c'est oui ils peuvent choisir, les autres ?

Tout le monde s'accorde pour dire que ca a un aspect génial, personne est foutu de prendre 5 minutes à nous faire un exemple ...


RE: Aide pour coder "pro"^^ - pascal - 06-02-2008

on prend quoi pour l'exemple ?
quelqu'un a un code classique sous la main ( inscription, attaque, ... ) ?

A+

Pascal, motivé


RE: Aide pour coder "pro"^^ - Ziliev - 06-02-2008

Bin c'est difficile de vous donner un sujet qui montrera bien la différence sans savoir en quoi ca consiste hein :p S'tu veux un truc simple y a le login ou la correction d'un formulaire mais je sais pas si ca sera bien visible. S'tu me trouves un sujet qui te plait j'veux bien te faire le mode "classique" ^^


RE: Aide pour coder "pro"^^ - Sephi-Chan - 06-02-2008

C'est bien le problème, mon script d'inscription est passé à la trappe lors d'un nettoyage d'hivers, d'autant que je n'ai pas une grande expérience en la matière encore.


Sephi-Chan


RE: Aide pour coder "pro"^^ - pascal - 06-02-2008

faites péter l'inscription :
_ description de ce que ça fait
_ les données en jeu
_ ce qui est vérifié, tout ça

on va voir comment passer du procédural à l'objet.

A+

Pascal


RE: Aide pour coder "pro"^^ - Zamentur - 06-02-2008

Et bien moi je suis convaincu!

D'abord il y a 2 choses:
- les fonction
- la POO

#Les fonctions constitue le premier pas!
Et d'ailleurs je pense qu'on peut se passer du tout en POO en php, mais on ne peut pas se passer de créer des fonctions, ou alors faut pas avoir un code à faire évoluer dans le temps (plus d'un an).

Le problème de montrer l'intérêt concrètement c'est que l'intérêt se trouve au fur et à mesure du temps. A force de faire des modification on se rend compte du bordel que çà deviens si on n'a pas centraliser d'une façon ou d'une autre les traitements.

Pour celà j'aurais bien eu envie de vous passer le script d'attaque de Ragol-online au fur et à mesure du temps, mais le hic c'est que c'est trop complexe et surtout trop long.
En gros les fonctions on permit sur ce script qui faisait au départ 3000 lignes à 1500 lignes (avec un bon nombre de fonctionnalité en plus)

#2 règles simple pour les fonctions:
- un bout de code qui est exécuter qu'une fois partout dans la totalité d'un programme ne nécessite pas de fonction sauf si dans le futur on pense avoir besoin de faire cette action autre part
- un bout de code utilisé à plusieurs endroit différents d'un script nécessite une fonction. NB: le bout de code en question peut varier légèrement.

#Du concret
Bon comme vous en voulez en voici. Pour simplifier je ne vais mettre que des commentaires, je ne mettrais pas de code pur, car le but c'est de comprendre l'utilité, pas de vous noyer dans des millier de ligne Smile

Nous somme dans les sources du jeu Ragol-online(environ 200 fichier 300 avec ceux qui sont là mais ne sont plus utilisé et une moyenne de 200 à 300 lignes par fichier). Ce jeu implémente une map sur laquel les joueurs peuvent se déplacer, il leur est d'ailleurs possible de se téléporter avec certains objets

Voici une idée de à quoi çà ressemble (en partie) au début(sans fonction):
#useobjet.php
Ce script permet au joueurs d'utiliser un objet
Code PHP :
<?php 
//500 ligne de code

case 'telepipe':
//si il y a des coordonnées indiqué
//On teleporte le joueur (environ 20 lignes)
//Sinon
//On réaffiche un formulaire pour demander

//200 lignes

#valider.php
Ce script permet de valider son compte en cliquant sur un lien préalablement transmit par mail
Code PHP :
<?php 
//300 ligne de code

//On place le joueur sur la map aleatoirement
//On recherche les coordonnée aleatoire
//On place le joueur sur la map (et encore 20 lignes)

//600 lignes


#attaquer.php
Ce script permet de gérer les attaques quand quelqu'un meurt "les Spores" le reconstitue prés de sa colonie
Code PHP :
<?php 
//600 lignes de code

//grans case de 2000 lignes dans lequel si le joueurs meurt la variable $mort passe à true

//Si $mort=true
//On place le joueur aléatoirement prés de sa colonie
//On recherche les coordonnées aléatoire
//On place le joueur sur la map (et encore 20 lignes)
//Autre action tel que l'historique, l'évolution des caractéristiques, l'envoie d'un mp
//600 lignes

Voici donc à quoi ressemble au début le script, un jour je me rend compte qu'il y a un bug les personnages m'y en place par le script copier coller atterrissent dans l'eau, normalement il ne devrait pas j'ai oublié dans ma requêtes sql de mettre une condition dans le where.

Ce jour là j'ai modifié useobjet.php et valider.php, çà prend un peu de temps car après un test de la correction je me rend compte que les variables utilisé ne sont pas les même!

Je passe le bug au statut de réglé
Surprise des joueurs viennent encore se plaindre qu'il tombe dans l'eau, ah tient j'ai oublié qu'il y avait aussi dans attaquer.php que j'avais copier coller ce script!

Tout ceci ne serait pas arriver si j'avais centraliser le traitement
Si je l'avais fait peut importe la manière je n'aurais eu qu'à modifier l'endroit ou l'action de placement du joueurs sur la map se trouver pour que le bug soit résolue partout puisque c'est centraliser donc au meme endroit.

On peut d'ailleurs voir que dans attaquer.php il y a un début de centralisation puisque dans le script on meurt de plusieurs façon mais la mort n'est infligé qu'à la fin du script plutôt qu'une dizaine de fois dans le script grâce à $mort.

Ca çà va bien dans une page, mais si on a fait un site multipage comme c'est le cas et que cette action est dans plusieurs page comme c'est le cas, il existe une autre solution: les fonctions Wahou!

Voici donc la modif que j'ai fait suite à cette erreur

#useobjet.php
Ce script permet au joueurs d'utiliser un objet
Code PHP :
<?php 
//500 ligne de code

case 'telepipe':
//si il y a des coordonnées indiqué
//Appel à la fonction placer(id,X,Y,$rayon) (2 lignes)
require_once('fonction_placement.php');
placer($id,$X,$Y);
//Sinon
//On réaffiche un formulaire pour demander

//200 lignes

#valider.php
Ce script permet de valider son compte en cliquant sur un lien préalablement transmit par mail
Code PHP :
<?php 
//300 ligne de code

//On place le joueur sur la map aleatoirement
//Appel à la fonction placer(id,X,Y,$rayon) (2 lignes)
require_once('fonction_placement.php');
placer($id,$X,$Y);

//600 lignes


#attaquer.php
Ce script permet de gérer les attaques quand quelqu'un meurt "les Spores" le reconstitue prés de sa colonie
Code PHP :
<?php 
//600 lignes de code

//grans case de 2000 lignes dans lequel si le joueurs meurt la variable $mort passe à true

//Si $mort=true
//On place le joueur aléatoirement prés de sa colonie
//On recherche les coordonnées
//Appel à la fonction placer(id,X,Y) (2 lignes)
require_once('fonction_placement.php');
placer($id,$x,$y,$rayon);
//Autre action tel que l'historique, l'évolution des caractéristiques, l'envoie d'un mp
//600 lignes

#fonction_placer.php
Code PHP :
<?php 
//10 lignes de code
function placer($id,$x,$y,$rayon) {
//Les 20 lignes nécessaire à la transportation
}

Par la suite il s'est avéré que:
- il y a eu un problème de place autour des colonies les joueurs ne pouvait plus se déplacer j'ai mis 15 minute à modifier pour que les téléporter tombe en damier pair et atterrissent le plus prés de leur colonie. Dans l'autre cas j'aurais mis 1h sans les fonctions et çà sans compter les éventuels oublis...
- j'ai trouvé un autre endroit qui pouvait utiliser cette fonction (l'action de reverser un telepipe, en gros quand quelqu'un se teleporte on peut faire le chemin inverse en emprunter le même "tunel")
- L'équipe d'animation du jeu à proposer de créer 4 objets dit "Héritage du Don" dont un qui s'appelait "Eol" qui devait permettre à son possesseur de transporter autour d'une case voulue. J'ai mis 1h à créer cet objet grâce à ma fonction
=> on peut dire que grace à cette fonction le jeu était de meilleur qualité

Et çà c'est les économies faite pour un seul bout de code générique. Mais en fait j'en avais pas mal des bout de code repetitif à plein d'endroit, et à force de les regrouper on gagne du temps, et c'est moins long de debbuguer.


Voilà donc pourquoi utiliser des fonctions ? (en approche pratique)




#Cas de l'objet
L'objet en fait c'est la seconde étape. On a vu la puissance des fonctions pour centraliser et donc gagner du temps et de la possibilité d'évolution dans la conception d'un programme.
Seulement voilà il s'avère que si on adopte pas plus que le simple fait de faire des fonctions et qu'on ne réfléchit pas assez au départ à l'évolutivité du code, ce dernier verra au fur et à mesure du temps son temps de correction de bug suite à l'implementation de nouvelle fonctionnalité de plus en plus long.

Je l'ai d'ailleurs constaté au bout de 3 ans de développement sur ragol. J'en était d'ailleurs arrivé au point ou je me disais que j'irais plus vite de tout reprendre à zero et de tout réorganiser et que çà irais plus vite car passer 10h de debug pour une fonctionnalité qui as mis 1h à faire çà craint!

Le hic c'est que à ce moment là il est presque quasi trop tard, et la création et la modification pour faire place à des objets prend beaucoup de temps.
Pour exemple j'ai implémenté au bout de 1 an de developpement intensif, la classe d'abstraction sql de punbb que j'ai d'ailleurs légèrement optimisé.
Mon optimisation permettait de gagner une ligne dans le code utilisateur de l'objet.

En gros cette classe d'abstraction permettait de remplacer çà:
Code PHP :
<?php 
$sql
="ma requete";
$req=mysql_query($sql) or die error("erreur etc...");
$data=mysql_fetch_array($req) or die error("erreur etc...");
$ma_valeur=$data('valeur');
Par çà
Code PHP :
<?php 
$ma_valeur
=$db->extract_ladata("ma requete");

En fait cette classe d'abstraction me permettait de gérer les erreurs, ainsi que de raccourcir le code.

Il y avais environ 1000 fois le cas de figure 1 dans le programme j'ai donc du procéder à 100 remplacement à travers 300 fichier ce qui m'a pris à l'époque 3 jours de 8h (pour en gros passer en revue tout le code :arfSmile

Mais une fois que çà as était fait j'ai aussi gagner beaucoup de temps!
-j'ai pus enregistrer les erreur sql dans une base de donnée et voir leur fréquences
-quand j'ai découvert que mysql_fetch_assoc aller plus vite que mysql_fetch_array pour j'ai pris 5 minute pour le changer dans ma classe d'abstraction
- mes requêtes ne faisait plus qu'une ligne et il n'y avais que le strict minimum sans or die etc à se soucier. D'ailleurs j'avais pus à penser à le mettre (et avant çà m'arrivais souvent)
- il devenait possible de créer un système de cache , pour éviter de redemander 2 fois la même chose
- je pouvais faire des détections d'attaques SQL et çà ne se voyais pas dans le code de base. Donc je voyais plus les informations importantes plutôt que ce qu'il y a autour

Bref tous ce qui avais attrait au requêtes devenait évolutif, j'avais un gain de lisibilité et un gain de fiabilité.


Pour Ragol je n'ai pas été plus loin.

Quand on arrive au tout en objet on se rend compte des possibilités.

Voici donc un exemple que j'ai mis en place pour ma v2:

C'est en fait un problème de sécurité. Le but et de mettre une protection assez forte contre les failles Cross-Site Request Forgery ou CSRF.
Ces failles permettent à un pirates de faire faire une action sur un site à un utilisateurs connectés (à ce site) et çà sans qu'il le sache. De nombreux jeux en ligne avec une map par case pourrait être victime par exemple d'un script qui décale tout les joueurs d'une case. Ce script serais cacher sur une page semblant anodine, et qui serait poster sur le forum du jeu (de façon à être sur que les gens soit connecté quand il regarde la page piégé)
On peut aussi faire de même pour s'acaparer des ressources ou plein d'autre chose. Celà dit c'est de l'attaque sophistiqué.


Bref pour protéger de çà je vérifie plein de chose et je fais notamment une chose: les nom de champs de mes formulaire sont aléatoire.

Le hic c'est que derrière, il faut récupérer les valeurs!
Voici comment s'utilise une classe qui me simplifie largement la vie:
Code PHP :
<?php 
<form action="page.php" method="POST">
<
input type="text" name="<?=$anti_csrf::gen_id_post('or');?>">
</
form>

page.php
Code PHP :
<?php 
//Pour recuperer la valeur je fais
$or=$anti_csrf::get_var('or');

on remarque que finalement avec ma folie antihacking le code grâce à cet classe n'en a pas trop souffert!


En vérité pour le moment cette classe n'est pas encore codé donc l'identifiant aléatoire est en fait l'argument or => or => or. Mais dans le futur si je veux je pourrais le mettre en place or=> rand => or. Et çà peut importe combien de page j'aurais qu'à utiliser là ou c'est centraliser.

L'avantage c'est qu'à l'heure actuel j'ai 5 projets différents en cours professionnel ou non. Et dans mes 5 projet je peux utilisé cette classe. Tout comme ma nouvelle classe d'abstraction sql, ma classe d'upload de fichier, ma classe de moteur template (inspiré du modèle de naholir) etc...

Bon l'exemple étant une classe singleton, il y a cependant aussi la possibilité de créer de vrai objet.
Je prévois notamment de faire du calcul matriciel, j'aurais donc un objet matrice(au sens mathématique). Ca aussi je pourrais le réutiliser ailleurs
Je vais très certainement définir un objet pour chaque élément physique static du jeu (perso, faune, flore, objet, véhicule, bâtiment ...) et j'en suis donc à l'étape de définition de ces objets


Voilà pourquoi au bout d'un moment, on finit par remplacer le procédurale par l'objet.



NB:J'ai commencé à rédigez çà il n'y avais que 4 réponses, dsl pour ceux qui ne voulait pas 15 pages... N'empêche que je présente ici les avantages que j'ai rencontrer au fil du temps au fonction puis aux objets. Si vous voulez la version synthétique aller voir le message X-ZoD rajoutez y aussi "cumul des script à travers plusieurs projet" ou quelques choses du genre Smile