Gérer une IA de manière sécurisée (Node.Js, Socket.IO)

Résolu/Fermé
Roipirau Messages postés 16 Date d'inscription mercredi 18 septembre 2019 Statut Membre Dernière intervention 18 juillet 2020 - Modifié le 5 juil. 2020 à 19:20
Roipirau Messages postés 16 Date d'inscription mercredi 18 septembre 2019 Statut Membre Dernière intervention 18 juillet 2020 - 14 juil. 2020 à 00:21
Bonjour,

je m'auto-forme sur Node.Js et Socket.IO. Pour vous donner un ordre d'idée de mes compétences, j'ai déjà créé un puissance4 en ligne et un petit truc teste dans lequel on peut jouer un carré qui se déplace en ligne.
Les liens :
- Le puissance4: http://mathieu-giacalone.fr:8080
- Le test: http://mathieu-giacalone.fr:8081

La question que je me pose c'est comment je peux programmer une IA de manière sécurisée sans que quelqu'un puisse tout casser côté client ? J'ai pensé à la faire coter serveur, mais ça me semble vachement compliqué. Si vous voulez un exemple d'IA, ce serait une balle qui rebondit sur les mures et change de direction quand on la frappe.

Je vous remercie d'avance :)
A voir également:

3 réponses

Salut,
euh c'est quoi pour vous une IA?
Que ce soit côté serveur ou client ça ne change pas grand chose au code sauf que si c'est côté serveur il faut actualiser les données côté client quand on en a besoin, voir par exemple avec AJAX.

Une balle qui rebondit sur un écran c'est pas une IA qu'il faut mais simplement un test de collision pour savoir si l'objet est égal ou au delà des limites fixées. Et faire ça pour chaque 'côté' selon la direction éventuellement.
C'est plus en rapport avec l'animation, donc incrémenter ou décrémenter une position en x,y dans un repère cartésien( z si la simulation est en 3D).

Vous parlez d'IA mais renseignez vous plutôt sur la physique appliquée en programmation, par exemple en utilisant une valeur de gravité vous pourrez avoir un mouvement plus réaliste si c'est ce que vous voulez reproduire plutôt qu'un rebond perpendiculaire et linéaire, gérer l’accélération éventuellement...ajouter les frottements, la résistance de l'aire etc...
Simuler un déplacement ou un rebond c'est plus ça qu'autre chose: de la physique/mécanique selon les lois de Newton et autres gestion des forces qui existent(masse, vitesse, frottements...).

"de manière sécurisée sans que quelqu'un puisse tout casser côté client ?"
C'est à dire? Qu'entendez vous par sécurisé? Si c'est sûr le client c'est forcément accessible et peut être potentiellement bloqué ou autre.

Si les données , calcul et logique du programme sont côté serveur le client n'aura qu'à obtenir les informations à afficher. Si cela doit prendre en compte l'interactivité c'est forcément côté client que le signal débute puis est transmis pour influer sur le programme.
Ce sont donc différentes parties qui ont des rôles et implications différentes:

_L'animation ça se passe forcément sur l'écran de l'utilisateur donc c'est la partie client. Une animation c'est une boucle infini(ou le temps de l'animation) qui va récupérer le positions à chaque étape/frame/image selon la vitesse de l'animation.

_côté serveur on peut donc gérer les positions si on veut et la boucle d'animation demandera à chaque fois la nouvelle coordonnée de l'objet en mouvement. C'est plutôt lourd et assez particulier car rajoute le temps de transfert entre le client et le programme côté serveur.

Si le jeu est solo faites tout(ou la majorité) côté client(en rajoutant des vérifications éventuellement côté serveur), si le jeu est multijoueur en réseau alors là pas le choix les coordonnées d'un élément doit être commune à tous au même moment donc cela se passe côté serveur.

Je vous conseille de décomposer les tâches que doit faire votre programme pour avoir une vision d'ensemble(algorithme, diagrammes, objet...) et éventuellement ajouter une méthode ou pattern adapté au programme et vos connaissances.
0
Roipirau Messages postés 16 Date d'inscription mercredi 18 septembre 2019 Statut Membre Dernière intervention 18 juillet 2020 1
6 juil. 2020 à 22:49
Bonjour,

Je vous remercie pour votre réponse.

Pour moi une IA c'est un programme informatique autonome, une balle qui sait détecter les collisions et changer de direction en conséquence sans que j'aie besoin de lui signaler quoi que ce soit est une IA.

Mis à part ça, j'ai du mal à vous faire comprendre précisément ce que je ne comprends pas parce que c'est super flou dans ma tête. Mais par exemple j'utilise le moteur 3D Babylon.js ou Three.js. Comme moteur de physique 3D j'utilise Cannon.js. Comment gérer la physique et la position de la balle de manière sécurisée ? Parce que si je fais en sorte que tous les clients envoient la position d'une balle soumise au moteur de physique Cannon.js, il suffit que 1 client triche pour que tout sois cassé. Et côté serveur je ne vois vraiment pas comment je peux gérer la physique "Si les données , calcul et logique du programme sont côté serveur le client n'aura qu'à obtenir les informations à afficher.".
0
Salut,
'Mis à part ça, j'ai du mal à vous faire comprendre précisément ce que je ne comprends pas parce que c'est super flou dans ma tête. "
Donc commencez à poser les tâches et les détailler puis faire leur liste, un algorithme, des diagrammes fonctionnels.
Sinon je ne voit pas comment vous pouvez faire quelque chose dont vous ne savez rien.
Voir aussi UML éventuellement et les méthodes d'analyse et conception et pattern de développement.

Je pensait que mes explications étaient simples:
la position d'un objet ce sont ses valeurs dans un repère(2D ou 3D ce sont des coordonnées quand même).
Si elles sont fournies par le serveur alors tout le monde a les mêmes.
Si elles sont sur le client alors tout le monde a une valeur différente.

Donc pour afficher quelque chose sur le client celui ci va demander au moment où il a besoin la position qui sera ainsi fournie en 'temps réel"(plus ou moins si l'on omet le temps de transfert).

Si ça reste flou pour vous je vous conseille de faire étape par étape:
commencez par déplacer un carré sur l'écran dont la posiition est calculé. Vous réaliserez que si vous faites ça côté client en pur JavaScript la position n'existe que pour le client le temps que la page reste ouverte.
Donc il faut utiliser quelque chose côté serveur qui est le seul moyen d'enregistrer une donnée de façon fiable.
Cette donnée c'est la position... le calcul n'a rien à voir là dedans, c'est un détail de mettre à jour une position en fonction de facteur comme le temps, la distance, vitesse et autres critères possible.

CLIENT = LOCAL
SERVEUR = possible d'envoyer au membres du réseau

Comme vous parlez de socket.io je me doutais que vous pensiez multi et réseau mais là vous mélangez quand même pas mal de choses...
Faites simple d'abord pour comprendre ce que vous faites pas besoin de babylon.js ou three.js
Commencez par savoir utiliser node pour mettre à jour un nombre sur une base de données et vous avez l'essentiel de votre programme comme il doit fonctionner(avec quand même la partie qui sert à afficher).

Enfin ne pas tout mélanger, si vous pensez à la sécurité c'est autre chose que de devoir faire un test de collision pour faire rebondir une balle.

Peut-être ceci peu vous aider:
https://web.developpez.com/tutoriels/web/failles-securite-application-web/

Mais on parle bien d'enjeu(et tâches) différente et de principes différent que ce soit pour afficher de la 3D, faire une animation ou sécuriser l'ensemble normal que vous ne soyez pas clair si vous mélangez tout...chacun à sa propre part. Le fait qu'il faut les imbriquer ensemble ne change rien au fait que chaque tâche est différente et à ses propres contraintes, méthodes et solutions...
Après choisir celle qui vous correspond et correspond à votre besoin c'est pas de mon ressort mais ça découle plutôt de l'analyse de ces besoins(donc déjà les écrire au clair et faire l’organigramme des tâches précises à réaliser) ainsi que de vos compétences et du temps que vous mettez à acquérir celles qui vous manque.

Bref faites un plan: fixez les étapes et trouvez comment les réaliser me semble un bon début.
0
Roipirau Messages postés 16 Date d'inscription mercredi 18 septembre 2019 Statut Membre Dernière intervention 18 juillet 2020 1
14 juil. 2020 à 00:21
Salut,

Merci pour votre aide :)

J'ai trouvé un truc super cool qui s'appelle "Lance".
Voici le lien de leur site: https://lance.gg/#quickstart

En gros ça permet de faire ce que je voulais. Puisque la logique du jeu est fait côté client, mais aussi côté serveur à l'aide d'une classe qu'il faut extend qui est GameEngine.
0