IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Go Discussion :

Créer des jeux avec Go : 3 mois sans LLM contre 3 jours avec LLM ! par Mariano Gappa


Sujet :

Go

  1. #1
    Invité de passage
    Homme Profil pro
    Inscrit en
    Septembre 2025
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2025
    Messages : 1
    Par défaut Créer des jeux avec Go : 3 mois sans LLM contre 3 jours avec LLM ! par Mariano Gappa
    Créer des jeux avec Go : 3 mois sans LLM contre 3 jours avec LLM ! par Mariano Gappa

    Nom : 0.jpg
Affichages : 74720
Taille : 58,5 Ko

    Introduction

    Après 15 ans en tant qu'ingénieur logiciel, je me suis rendu compte que je n'avais jamais réellement créé et publié de jeu.

    Ayant grandi en Argentine 🇦🇷 où je jouais aux cartes avec mes amis, j'ai décidé d'en choisir un parmi ceux-là. Je me suis posé la question suivante :

    Nom : 1.jpg
Affichages : 4145
Taille : 10,0 Ko

    Truco : 3 mois sans LLM

    Le 18 juin 2024, j'ai commencé à créer Truco pendant mon temps libre. En tant que développeur backend Go de longue date, le backend était une évidence. Le défi résidait dans l'interface utilisateur et l'hébergement à long terme sans serveur payant.

    Nom : 2.jpg
Affichages : 4143
Taille : 26,0 Ko

    C'était avant les LLM, donc chaque détail devait être réglé à la main. Il m'a fallu environ 3 mois d'essais et d'erreurs pour le mettre au point.

    Je n'avais jamais prévu de faire de la publicité ou de monétiser le jeu ; je voulais juste le terminer et peut-être donner à quelqu'un la joie de rejouer au jeu de son enfance. Un an plus tard, sans aucun effort supplémentaire de ma part, les gens y jouent toujours !

    Nom : 3.jpg
Affichages : 4149
Taille : 37,5 Ko

    Si vous souhaitez le découvrir, voici quelques liens :

    Truco (jouer au jeu)

    Backend en Go

    Frontend en React (ne me jugez pas 🤷*♂️ c'est le mieux que je puisse faire avec une heure de connaissances en React)

    « Escoba » : 3 jours avec les LLM

    Un an plus tard, lors d'une visite à ma famille en Argentine, j'ai appris à mon neveu à jouer à Escoba, le deuxième jeu de cartes le plus populaire du pays (malgré ce qu'affirme ChatGPT).

    Nom : 4.jpg
Affichages : 4144
Taille : 25,0 Ko

    Les LLM étant désormais courants, je me suis demandé à quel point la création d'un jeu pouvait être plus rapide. J'ai donc décidé de le tester.

    J'ai cloné le backend de Truco et j'ai donné à Claude une longue instruction générative expliquant les règles d'Escoba et lui demandant de refactoriser le code pour l'implémenter. À ma grande surprise, cela a fonctionné presque parfaitement dès la première tentative 😱. Pendant un instant, je me suis dit : adieu, mon travail 😰.

    Nom : 5.jpg
Affichages : 4154
Taille : 52,6 Ko

    Le seul bug que j'ai trouvé était qu'il utilisait incorrectement la fonction append à un endroit et modifiait les actions. À part cela, je n'ai ajouté que quelques fonctionnalités supplémentaires (comme un meilleur bot).

    Le frontend était une autre histoire ; il m'a fallu quelques jours pour le mettre au point. Le véritable défi n'était probablement pas seulement le LLM, mais aussi mes propres compétences en React, combinées à la configuration inhabituelle consistant à laisser une fonction WASM black-box gérer l'état du jeu. Le débogage en JavaScript n'a pas non plus facilité les choses.

    Si vous souhaitez le découvrir, voici quelques liens :

    Escoba (jouer au jeu)

    Backend en Go

    Frontend en React

    Étape par étape : comment créer votre propre jeu

    Je suppose que vous êtes venu ici pour voir s'il n'est pas trop difficile de vous y essayer vous-même ! Je vais donc vous donner les bases minimalistes pour créer votre propre jeu avec cette pile.

    J'ai écrit un ensemble minimaliste de dépôts pour le jeu Tic-Tac-Toe afin que vous puissiez les forker pour commencer :

    https://github.com/marianogappa/tictactoe-backend, https://github.com/marianogappa/tictactoe-frontend

    Vous pouvez le consulter ici :

    https://marianogappa.github.io/tictactoe-frontend/

    Nom : 6.jpg
Affichages : 4130
Taille : 20,0 Ko

    Côté backend

    Un backend au tour par tour est simple à décrire :

    • Initialisez une structure GameState (par exemple, configuration initiale du plateau, liste d'actions vide).
    • Implémentez CalculatePossibleActions, afin que les clients sachent ce qui est valide.
    • Ajoutez RunAction pour modifier le GameState.
    • S'il y a un bot, écrivez une fonction pour choisir une action à partir de l'état actuel.

    C'est tout !

    Remarque : oubliez les parties entre humains, à moins que vous ne soyez prêt à payer pour ce serveur.


    Côté front-end

    Je ne suis pas un expert en front-end, mais les tâches sont simples :

    • Appelez le backend pour créer un nouveau GameState.
    • Affichez-le dans l'interface utilisateur.
    • Laissez le joueur choisir une action parmi les options valides.
    • Appelez le backend pour appliquer l'action.
    • Déclenchez l'action du bot lorsque c'est son tour.

    C'est tout !

    Interopérabilité côté backend

    Pour transcompiler le backend en WASM, vous pouvez compiler avec :

    Code GO : Sélectionner tout - Visualiser dans une fenêtre à part
    GOARCH=wasm GOOS=js go build -o main.wasm main.go



    Mais cela produit des binaires énormes (ce qui est lent sur mobile). Utilisez TinyGo pour des binaires plus petits.

    Avant de compiler, vous avez besoin d'un point d'entrée différent pour les fonctions que vous allez mettre à la disposition du frontend. Créez un fichier main.go différent qui exporte les fonctions dont vous avez besoin, et protégez-le via des drapeaux de compilation :

    Code GO : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    //go:build tinygo
    // +build tinygo
     
    package main
     
    [...]
     
    func main() {
    	js.Global().Set("trucoNew", js.FuncOf(trucoNew))
    	js.Global().Set("trucoRunAction", js.FuncOf(trucoRunAction))
    	js.Global().Set("trucoBotRunAction", js.FuncOf(trucoBotRunAction))
    	select {}
    }
     
    var (
    	state *truco.GameState // "Global variable" for the GameState
    	bot   truco.Bot
    )



    N'oubliez pas de bloquer à la fin de main() avec select {} pour empêcher le programme de se fermer immédiatement.


    Interopérabilité des données backend

    GameState est généralement une structure libre que vous définissez dans Go. WASM ne peut pas sérialiser/désérialiser directement les structures. L'astuce consiste à tout passer en JSON. Après avoir fouillé dans la documentation TinyGo, voici la formule :

    Code GO : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    func trucoRunAction(this js.Value, p []js.Value) interface{} { // Always this signature
    	// Read the input JSON
        jsonBytes := make([]byte, p[0].Length()) 
    	js.CopyBytesToGo(jsonBytes, p[0])
     
    	// 1. Decode the input JSON to your struct
        // 2. Run your Go code, return an output struct
    	// 3. Encode the output struct to JSON
    	newBytes := _runAction(jsonBytes)
     
    	// Return the output JSON
    	buffer := js.Global().Get("Uint8Array").New(len(newBytes))
    	js.CopyBytesToJS(buffer, newBytes)
    	return buffer
    }



    Interopérabilité côté frontend

    Enfin, appelez les fonctions backend depuis le frontend et [suivez le GameState dans une variable globale]((https://github.com/marianogappa/truc...meState.js#L19) :

    Code GO : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function jsRunAction(data) {
        const encoder = new TextEncoder();
        const encodedData = encoder.encode(JSON.stringify(data));
        const result = trucoRunAction(encodedData);
        const json = new TextDecoder().decode(result);
        return JSON.parse(json);
    }
     
    let gameState = jsNewGame();
     
    // Note that RunAction doesn't take a GameState.
    // WASM is the source of truth; your frontend can't mutate it.
    gameState = jsRunAction(action);



    Chaque fois que vous modifiez le backend, vous devez le recompiler en WASM et remplacer l'ancien fichier dans le frontend. J'ai ajouté ceci dans le Makefile :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    compile_library:
    	cd $(GOPATH)/src/github.com/marianogappa/escoba && \
    	TINYGOROOT=/usr/local/Cellar/tinygo/0.38.0 tinygo build -o main.wasm -target wasm main_wasm.go && \
    	mv main.wasm $(CURDIR)/public/wasm/wasm.wasm && \
    	cp /usr/local/Cellar/tinygo/0.38.0/targets/wasm_exec.js $(CURDIR)/public/wasm/wasm_exec.js && \
    	cd -


    Notez que je copie également wasm_exec.js. C'est une condition requise pour exécuter le code WASM. L'autre condition requise est d'ajouter la balise script à la tête (HEAD) du fichier HTML :

    Code GO : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
        <script src="wasm/wasm_exec.js"></script>
    	<script>
            const go = new Go(); // Defined in wasm_exec.js
            const WASM_URL = 'wasm/wasm.wasm';
     
            var wasm;
            let wasmReady = false;
     
            if ('instantiateStreaming' in WebAssembly) {
                WebAssembly.instantiateStreaming(fetch(WASM_URL), go.importObject).then(function (obj) {
                    wasm = obj.instance;
                    go.run(wasm);
                    wasmReady = true;
                })
            } else {
                fetch(WASM_URL).then(resp =>
                    resp.arrayBuffer()
                ).then(bytes =>
                    WebAssembly.instantiate(bytes, go.importObject).then(function (obj) {
                        wasm = obj.instance;
                        go.run(wasm);
                        wasmReady = true;
                    })
                )
            }
        </script>



    Dépannage

    Le fichier WASM ne se charge pas

    Cela fonctionne automatiquement dans Github Pages, mais localement, vous devez servir les fichiers via HTTP. Vous pouvez utiliser http-server pour cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    npx http-server ./public -p 8080


    Rendez-vous ensuite sur [c]http://localhost:8080[/c dans votre navigateur.

    Conclusion

    J'ai pris beaucoup de plaisir à créer ces jeux et j'espère que vous trouverez intéressant de voir comment ils fonctionnent. J'espère également que cela vous sera utile pour créer vos propres jeux ! Si vous avez des questions, n'hésitez pas à me contacter.

    Nom : 7.jpg
Affichages : 4125
Taille : 103,3 Ko

    Source : "Making Games in Go: 3 Months Without LLMs vs 3 Days With LLMs!"

    Et vous ?

    Pensez-vous que cette méthode est crédible ou pertinente ?
    Quel est votre avis sur le sujet ?

    Voir aussi :

    Le langage Go souffle ses 15 bougies et atteint sa position la plus haute sur l'indice Tiobe. Google annonce que le nombre d'utilisateurs de Go a plus que triplé au cours des cinq dernières années

    Comment j'utilise les LLM en tant qu'ingénieur logiciel, par sean goedecke

    Le jour où j'ai appris à l'IA à comprendre le code comme un développeur senior, par Namanyay Goel

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 877
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 877
    Par défaut
    Bonjour,

    Article intéressant, moi aussi j'ai toujours eu envie d'essayé de faire un petit jeu en go sur mobile mais jamais pris réellement le temps.

    Comment avez-vous géré la partie réseau pour ne pas avoir d'hébergement avec serveur payant ?... c'est un peu le truc qui me freine.

    Pour la partie mise en ligne sur le store et installateur, c'est simple à faire ?

    Pour le front-end, il y a Fyne qui pourrait vous permettre d'avoir de meilleurs performances.
    Peut-être une autre piste est de créer un serveur/client Web en go au lieu d'utiliser WASM. Aussi pour le front-end il y a Wails qui devrait bientôt (si ce n'est déjà fait) être utilisable sur mobile.

  3. #3
    Membre actif
    Homme Profil pro
    R&D
    Inscrit en
    Avril 2004
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : R&D

    Informations forums :
    Inscription : Avril 2004
    Messages : 129
    Par défaut Drôle de dévs
    3 mois pour ce jeu, sérieux ? En 2007 j'ai fait une bataille navale multijoueurs en moins de 10 jours : backend en MSSQL, service web ASP.Net, frontend en MS Excel (c’était un démo pour Office 2007 commandé par MS France)
    D'autre part, c'est drôle de voir beaucoup des articles genre " LLM m'a généré une appli pendant 1 jour " alors que la fonctionnalité est au niveau de " liste de contacts ". Il ne reste que trouver des clients qui vont commander cela...
    Est-ce que on peut générer quelque choses plus compliqué, par exemple, une gestion des comptes et/ou des budgètes ?
    Et surtout les budgètes vu les débats dans l’Assemblée Nationale

  4. #4
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 707
    Billets dans le blog
    2
    Par défaut
    C'est toujours intéressant de développer des jeux

    J'ai participé à de nombreuses GameJams et j'ai écrit plusieurs articles sur le sujet. Je termine également le développement de mon premier jeu commercial qui sortira officiellement le 2 décembre prochain. Je l'ai développé entièrement, sans utiliser de moteur de jeu (j'ai développé mon propre moteur) et pas d'IA.
    Après avoir rebranché ma Megadrive d'époque et rejouer sans pb aux jeux que j'avais conservés : plus de trente après, pas de pb ça fonctionne comme au premier jour.
    Mon objectif était donc de développer un jeu complet moi même du niveau de ce qui se faisait à l'époque des consoles 16 bits (mon enfance !). Je n'ai pas utilisé de moteurs existants ni l'IA car je voulais être confronté aux problèmes et trouver des solutions par moi même.

    Il s'agit bien évidemment d'un projet personnel qui a débuté il y a 2 ans et demi. Je n'ai pas travaillé à 100% sur ce projet mais de temps en temps pendant mes temps libres. J'en vois le bout !

    Comme évoqué, les jeux de carte restent des choses simples (pas de gestion de la caméra, pas de gestion de collisions, pas d'animations dans tous les sens, pas d'effets visuels, gestion d'input simple (pas de gestion des manettes), etc...). De mon expérience, l'IA peut faire des choses correctes pour des choses simples. Dès que l'on complexifie la demande, je pense qu'on peut utiliser l'IA sur des points précis mais il faut être capable d'assembler ces points précis pour obtenir un tout cohérent. J'ai toujours développé mes propres routines et ensuite, lorsque j'avais la routine fonctionnelle, j'ai demandé à l'IA de voir s'il y avait des optimisations possibles. En procédant ainsi, j'ai trouvé les réponses de l'IA bien plus précises et opportunes.

    Voici la petite vidéo de mon jeu Nagory :
    Mon site - Mes tutoriels - GitHub - Youtube - N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

Discussions similaires

  1. Réponses: 1
    Dernier message: 06/03/2013, 22h52
  2. [XL-2010] comment faire des insert dans une base access sans avoir access
    Par Poulki dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 23/08/2012, 07h45
  3. [CS4] implémenter des jeux dans un menu
    Par sirina20 dans le forum ActionScript 3
    Réponses: 0
    Dernier message: 13/05/2012, 16h36
  4. Réponses: 1
    Dernier message: 20/06/2011, 17h35
  5. Installer des jeux dans une VM ?
    Par byloute dans le forum Windows Vista
    Réponses: 2
    Dernier message: 26/01/2009, 21h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo