Commencez à programmer en jouant, c'est possible et
débuter en programmation n'a jamais été aussi amusant !
Avec ce jeu, vous allez apprendre à coder en vous divertissant.
Une API fournit une grille de jeu avec des secteurs et des zones, et vous devrez créer des algorithmes pour déplacer vos programmes sur la grille.
Explorez les différentes zones et secteurs, attaquez les autres programmes et capturez leurs ressources afin de progresser dans le jeu.
Trouvez le drapeau et transférez-le vers le programme principal pour remporter le cycle.
Contrairement à de nombreux jeux qui nécessitent une authentification ou limitent les joueurs à un langage de programmation ou à une plate-forme spécifique, ce jeu donne aux joueurs la liberté de coder dans n'importe quel langage sur la plate-forme de leur choix, sans authentification et sans base de données.
En outre, le jeu lui-même est assez unique, permettant aux joueurs de se déplacer dans une grille, d'explorer différentes zones et secteurs, et même d'attaquer d'autres programmes en mode multijoueur, permettant aux joueurs de s'affronter en temps réel.
La version bêta de l'api est désormais disponible gratuitement pour tous.
Vous pouvez trouver plus d'informations sur la façon de tester l'api vous-même sur le dépôt Github en liens ci dessous.
https://github.com/greg198584/gridclient
Il y a également un tutoriel vidéo complet disponible sur youtube.
L'objectif de la version bêta est de permettre à chacun de tester l'api et de fournir des commentaires.
Nous vous encourageons à l'essayer et à nous faire savoir ce que vous en pensez.
L'API fournit une grille de jeu avec des secteurs et des zones, et vous devrez créer des algorithmes pour faire avancer vos programmes dans la bonne direction.
Explorez les différentes régions, attaquez les autres programmes et capturez leurs ressources afin de progresser dans le jeu.
Trouvez le drapeau et transférez-le au programme principal pour gagner.
Le jeu est gagné par le premier joueur qui atteint l'objectif final avec son programme.
En cours de route, vous découvrirez des concepts de programmation tels que les variables, les boucles, les conditionnels et les fonctions.
Que vous soyez un débutant complet ou un programmeur expérimenté, ce jeu est sûr de vous offrir une expérience amusante et stimulante.
L'API créer une grille de jeu qui se compose de secteurs et de zones.
Les différentes routes de l'API vous permettent :
L'API de ce jeu est un excellent moyen de vous mettre au défi et de tester vos compétences en algorithmes.
Il existe de nombreuses stratégies différentes que vous pouvez utiliser pour gagner le jeu.
Cet affichage en mode développement coté serveur permet de voir l'état de la grille.
On y voit les secteurs et les zones.
Le 0 indique qu’aucun programme n'est présent dans une zone.
En dessous de la grille, on a les programmes ID et Nom charger sur la l'API.
Ensuite en dernier on a les informations de la grille :
Chaque requête vers l'api correspond à une itération sur la grille.
Quand le nombre d’itérations sera égal à zéro la grille se réinitialisera.
Le drapeau et le contenu des zones vont se déplacer sur d'autres zones.
Les programmes sont déconnectés de l'API.
Un nouveau cycle commence.
Dans ce jeu, vous essayez constamment de trouver le drapeau le plus rapidement possible.
Plus il y a de demandes, plus vous devez trouver le drapeau rapidement avant qu'il ne change de zone.
Si vous n'êtes pas assez rapide, vous serez déconnecté avant de l'avoir trouvé.
Au final, le client que je vais vous présenter me permet de faire la démonstration de l'API.
Comme je l'ai dit, vous pouvez coder vos algorithmes pour vos programmes dans le langage de programmation que vous voulez car c'est une API.
Vous faites votre propre client et nous allons présenter les routes et le retour de l'API avec Insomnia un équivalent de postman, qui va nous permettre de faire des requêtes à l'API.
Cela signifie que même avec un postman par exemple ou même avec votre navigateur web vous pouvez jouer.
Vous êtes libre de concevoir votre algo mais aussi le rendu de la grille comme le client qui vous sera présenté en CLI qui permet un affichage basique et d'envoyer des requêtes à l'API.
Par conséquent, cette présentation vous permettra de mieux comprendre le fonctionnement de l'API et comment vous pouvez l'utiliser pour créer vos propres programmes.
GET /v1/grid
GET /v1/programme/infos/:id/:secretid
GET /v1/programme/new/:name
POST /v1/programme/load
GET /v1/programme/unset/:id/:secretid
GET /v1/programme/save/:id/:secretid
GET /v1/programme/jump/up/:id/:secretid/:jumpnbr
GET /v1/programme/jump/down/:id/:secretid/:jumpnbr
GET /v1/programme/move/:id/:secretid/:zone_id
GET /v1/programme/scan/:id/:secretid
GET /v1/programme/explore/:id/:secretid/:celluleid/:startid/:endid
GET /v1/programme/destroy/:id/:secretid/:celluleid/:targetid
GET /v1/programme/rebuild/:id/:secretid/:celluleid/:targetid
GET /v1/programme/new/:name
POST /v1/programme/load
En premier on crée un programme.
Une requête GET sur la route /v1/programme/new/:name
name signifie le nom du programme.
{
"id": "dc8563344859b9ab1163b82b8a586790e3d21cad",
"secret_id": "b065f9dc0f34094fed9452995a009af090cbd1f2",
"programme": {
"id": "dc8563344859b9ab1163b82b8a586790e3d21cad",
"name": "AAA",
"position": {
"secteur_id": 0,
"zone_id": 0
},
"cellules": {
"0": {
"id": 0,
"valeur": 10,
"energy": 10,
"datas": null,
"status": true,
"destroy": true,
"rebuild": true,
"current_acces_log": {
"pid": "",
"target_id": "",
"receive_destroy": false,
"active_destroy": false,
"active_rebuild": false,
"active_capture": false,
"c_time": "0001-01-01T00:00:00Z"
},
"acces_log": null,
"capture": false
},
"1": {
"id": 1,
"valeur": 10,
"energy": 10,
"datas": null,
"status": true,
"destroy": true,
"rebuild": true,
"current_acces_log": {
"pid": "",
"target_id": "",
"receive_destroy": false,
"active_destroy": false,
"active_rebuild": false,
"active_capture": false,
"c_time": "0001-01-01T00:00:00Z"
},
"acces_log": null,
"capture": false
},
"2": {
"id": 2,
"valeur": 10,
"energy": 10,
"datas": null,
"status": true,
"destroy": true,
"rebuild": true,
"current_acces_log": {
"pid": "",
"target_id": "",
"receive_destroy": false,
"active_destroy": false,
"active_rebuild": false,
"active_capture": false,
"c_time": "0001-01-01T00:00:00Z"
},
"acces_log": null,
"capture": false
},
"3": {
"id": 3,
"valeur": 10,
"energy": 10,
"datas": null,
"status": true,
"destroy": true,
"rebuild": true,
"current_acces_log": {
"pid": "",
"target_id": "",
"receive_destroy": false,
"active_destroy": false,
"active_rebuild": false,
"active_capture": false,
"c_time": "0001-01-01T00:00:00Z"
},
"acces_log": null,
"capture": false
},
"4": {
"id": 4,
"valeur": 10,
"energy": 10,
"datas": null,
"status": true,
"destroy": true,
"rebuild": true,
"current_acces_log": {
"pid": "",
"target_id": "",
"receive_destroy": false,
"active_destroy": false,
"active_rebuild": false,
"active_capture": false,
"c_time": "0001-01-01T00:00:00Z"
},
"acces_log": null,
"capture": false
},
"5": {
"id": 5,
"valeur": 10,
"energy": 10,
"datas": null,
"status": true,
"destroy": true,
"rebuild": true,
"current_acces_log": {
"pid": "",
"target_id": "",
"receive_destroy": false,
"active_destroy": false,
"active_rebuild": false,
"active_capture": false,
"c_time": "0001-01-01T00:00:00Z"
},
"acces_log": null,
"capture": false
},
"6": {
"id": 6,
"valeur": 10,
"energy": 10,
"datas": null,
"status": true,
"destroy": true,
"rebuild": true,
"current_acces_log": {
"pid": "",
"target_id": "",
"receive_destroy": false,
"active_destroy": false,
"active_rebuild": false,
"active_capture": false,
"c_time": "0001-01-01T00:00:00Z"
},
"acces_log": null,
"capture": false
},
"7": {
"id": 7,
"valeur": 10,
"energy": 10,
"datas": null,
"status": true,
"destroy": true,
"rebuild": true,
"current_acces_log": {
"pid": "",
"target_id": "",
"receive_destroy": false,
"active_destroy": false,
"active_rebuild": false,
"active_capture": false,
"c_time": "0001-01-01T00:00:00Z"
},
"acces_log": null,
"capture": false
},
"8": {
"id": 8,
"valeur": 10,
"energy": 10,
"datas": null,
"status": true,
"destroy": true,
"rebuild": true,
"current_acces_log": {
"pid": "",
"target_id": "",
"receive_destroy": false,
"active_destroy": false,
"active_rebuild": false,
"active_capture": false,
"c_time": "0001-01-01T00:00:00Z"
},
"acces_log": null,
"capture": false
}
}
},
"valid_key": "$2a$14$lpbUs5ujtR2s1fEXd3TGzuDprH56bPwc1PRzdes6bIRDEKbCQNlE2"
}
Chaque requête d'un programme vers l'API retournera s’il n’y a pas d'erreur code http 200, le retour ci-dessus.
Ceci vous permet d'avoir toutes les infos sur votre programme.
Les infos de votre programme seulement sans action peuvent être obtenues avec la route:
GET /v1/programme/infos/:id/:secretid
Dans le retour JSON.
On obtient un ID et un SecretID ceux-ci sont importants afin de pouvoir effectuer des requêtes sur l'API et envoyer des ordres a notre programme.
Exemple usage ID et SecretID
{
"id": "dc8563344859b9ab1163b82b8a586790e3d21cad",
"secret_id": "b065f9dc0f34094fed9452995a009af090cbd1f2",
}
curl --request GET \
--url http://localhost/v1/programme/infos/dc8563344859b9ab1163b82b8a586790e3d21cad/b065f9dc0f34094fed9452995a009af090cbd1f2 \
--header 'content-type: application/json'
{
"programme": {
"id": "dc8563344859b9ab1163b82b8a586790e3d21cad",
"name": "AAA",
"position": {
"secteur_id": 0,
"zone_id": 0
},
"cellules": {
"0": {
"id": 0,
"valeur": 10,
"energy": 10,
"datas": null,
"status": true,
"destroy": true,
"rebuild": true,
"current_acces_log": {
"pid": "",
"target_id": "",
"receive_destroy": false,
"active_destroy": false,
"active_rebuild": false,
"active_capture": false,
"c_time": "0001-01-01T00:00:00Z"
},
"acces_log": null,
"capture": false
}
}
},
"lock_programme": null
}
Multi langage facilement
Avec insomnia je peux transformer ma requête avec un langage de programmation au choix.
En premier on effectue la requête.
Ensuite on choisit sur notre requête quel langage générer.
import requests
url = "http://localhost/v1/programme/infos/dc8563344859b9ab1163b82b8a586790e3d21cad/b065f9dc0f34094fed9452995a009af090cbd1f2"
payload = ""
headers = {'content-type': 'application/json'}
response = requests.request("GET", url, data=payload, headers=headers)
print(response.text)
On va voir avec mon client comment se déroulent les déplacements et attaques.
Move: Choisir une zone
> $ go run main.go infos -n AAA
> $ go run main.go move -n AAA -t move -v 5
> $ go run main.go move -n AAA -t jumpup -v 1
> $ go run main.go scan -n AAA [±main ●●]
2022/10/27 17:43:42 [Programme [AAA] scan]
2022/10/27 17:43:42 [LOG] [< request api status [200] [GET http://localhost/v1/programme/scan/14f10ff3a44091320a8fdd7fed71b8daba483b2f/769a47813faa8c93d966cf582f172e71c286031d] >] ()
2022/10/27 17:43:42 [>>>] [status = [200]]
{
"id": 5,
"actif": true,
"cellule": [
{
"id": 4,
"valeur": 0,
"energy": 0,
"data_type": {
"id": 0,
"content": "",
"energy": 0,
"is_flag": false
},
"data_count": 0,
"status": false,
"destroy": false,
"rebuild": false,
"capture": false
},
{
"id": 5,
"valeur": 0,
"energy": 0,
"data_type": {
"id": 0,
"content": "",
"energy": 0,
"is_flag": false
},
"data_count": 0,
"status": false,
"destroy": false,
"rebuild": false,
"capture": false
},
{
"id": 7,
"valeur": 0,
"energy": 0,
"data_type": {
"id": 0,
"content": "",
"energy": 0,
"is_flag": false
},
"data_count": 0,
"status": false,
"destroy": false,
"rebuild": false,
"capture": false
},
{
"id": 8,
"valeur": 0,
"energy": 0,
"data_type": {
"id": 0,
"content": "",
"energy": 0,
"is_flag": false
},
"data_count": 0,
"status": false,
"destroy": false,
"rebuild": false,
"capture": false
},
{
"id": 0,
"valeur": 0,
"energy": 0,
"data_type": {
"id": 0,
"content": "",
"energy": 0,
"is_flag": false
},
"data_count": 0,
"status": false,
"destroy": false,
"rebuild": false,
"capture": false
},
{
"id": 1,
"valeur": 0,
"energy": 0,
"data_type": {
"id": 0,
"content": "",
"energy": 0,
"is_flag": false
},
"data_count": 0,
"status": false,
"destroy": false,
"rebuild": false,
"capture": false
},
{
"id": 6,
"valeur": 0,
"energy": 0,
"data_type": {
"id": 0,
"content": "",
"energy": 0,
"is_flag": false
},
"data_count": 0,
"status": false,
"destroy": false,
"rebuild": false,
"capture": false
},
{
"id": 2,
"valeur": 0,
"energy": 0,
"data_type": {
"id": 0,
"content": "",
"energy": 0,
"is_flag": false
},
"data_count": 0,
"status": false,
"destroy": false,
"rebuild": false,
"capture": false
},
{
"id": 3,
"valeur": 0,
"energy": 0,
"data_type": {
"id": 0,
"content": "",
"energy": 0,
"is_flag": false
},
"data_count": 0,
"status": false,
"destroy": false,
"rebuild": false,
"capture": false
}
],
"programmes": [
{
"id": "14f10ff3a44091320a8fdd7fed71b8daba483b2f",
"name": "AAA",
"nbr_cellules": 9,
"valeur_total": 90,
"energy_total": 90
},
{
"id": "61c56fe5eac1568fe82ccc29c12f5843685a0d34",
"name": "BBB",
"nbr_cellules": 9,
"valeur_total": 90,
"energy_total": 90
}
]
}
AAA décide d'attaquer BBB.
On doit indiquer dans la route en plus de notre ID et SecretID:
> $ go run main.go destroy -n AAA -c 0 -t 61c56fe5eac1568fe82ccc29c12f5843685a0d34 -e 2
Merci d'avoir pris le temps de lire cet article. J'espère que vous l'avez trouvé instructif et qu'il vous a mis en appétit pour le jeu à venir.
Ce jeu est conçu pour être à la fois amusant et éducatif, et je pense qu'il a le potentiel d'être un outil précieux pour toute personne intéressée pour apprendre la programmation par le jeu.
Le jeu sera bientôt disponible, et je vous encourage à vous inscrire sur ma liste de diffusion afin d'être parmi les premiers à recevoir une notification de sa disponibilité.
En outre, je publierai une série de vidéos sur ma chaîne YouTube qui donneront un aperçu des fonctionnalités et de l'évolution du jeu.
J'espère que vous profiterez de cette occasion pour en apprendre davantage sur la programmation et le codage.
Merci encore pour votre temps et votre intérêt.
Une version BETA est accessible pour les plus curieux
Abonnez-vous
Abonner vous, pour recevoir les nouvelles publications et obtenir ma formation programmation pour débutant 100% gratuite.
À PROPOS
Je m'appelle Gregory Lafitte, ancien étudiant de l'école 42, et aujourd’hui ingénieur informatique.
Je partage mes connaissances et mon expérience dans les métiers du numérique.
Créé avec © systeme.io • Politique de confidentialité • Mentions légales