Un jeu 1v1 où deux LLM s'affrontent en tour par tour sur une carte stratégique.
python3 -m http.server 0
LLM Duel est un jeu stratégique en tour par tour où deux intelligences artificielles (LLM) s'affrontent sur une carte 20x15. Chaque joueur connecte son propre modèle (Ollama local ou API externe) et contrôle des unités (ouvriers, guerriers) pour récolter des ressources, construire une armée et détruire la base ennemie.
- WorldBox : Style visuel de gestion de carte
- Starcraft : Stratégie en temps réel et gestion d'unités
- Pokémon : Affrontement de "créatures" avec des règles claires
- Grille 20x15 avec différents types de tuiles (herbe, eau, montagne, sable)
- Génération aléatoire de ressources (🌳 arbres, 💰 or, ⛏️ pierre)
- Bases des joueurs positionnées aux coins opposés
| Unité | Coût (⚡) | PV | Dégâts | Portée | Action Spéciale |
|---|---|---|---|---|---|
| Ouvrier | 10 | 20 | 0 | 1 | Récolte 1 énergie/tour |
| Guerrier | 20 | 40 | 10 | 1 | Attaque les unités adjacentes |
- Chaque joueur reçoit l'état du jeu au début de son tour
- Les ouvriers récoltent automatiquement les ressources
- Chaque joueur peut effectuer une action par unité (déplacer, attaquer, ou créer)
- Alternance automatique entre les joueurs
- Messages internes (vert) : Stratégie expliquée au joueur propriétaire
- Messages externes (rouge) : Communication avec l'adversaire
- Messages système (gris) : Notifications du jeu
- Limite de 50 tokens par message
- Ollama (recommandé) : Modèles locaux (llama3, mistral, etc.)
- OpenAI API : GPT-3.5, GPT-4 (nécessite une clé API)
- Validation stricte des réponses JSON
- Fallback automatique en cas d'erreur
- Aucun! Fonctionne directement dans un navigateur moderne (Chrome, Firefox, Edge, Safari)
- Installer Ollama sur votre machine
- Télécharger un modèle :
ollama pull llama3 # ou ollama pull mistral
- Créer un compte sur OpenAI
- Obtenir une clé API dans votre tableau de bord
# Naviguer dans le dossier du projet
cd llm-duel
# Ouvrir index.html dans votre navigateur
# Sur Mac:
open index.html
# Sur Linux:
xdg-open index.html
# Sur Windows:
start index.html# Avec Python 3
python -m http.server 8000
# Avec Node.js (si installé)
npx serve
# Avec PHP
php -S localhost:8000
# Puis ouvrir http://localhost:8000 dans votre navigateur-
Démarrer le jeu
- Cliquez sur le bouton "🎮 Démarrer Partie"
- La carte est générée avec les bases et ressources
-
Configurer les LLM
- Pour chaque joueur, sélectionnez le type de modèle :
- Ollama (local) : Le jeu se connectera à votre instance Ollama locale
- OpenAI API : Entrez votre clé API OpenAI
- Par défaut, le jeu utilise Ollama avec le modèle
llama3
- Pour chaque joueur, sélectionnez le type de modèle :
-
Jouer en mode simulation (sans LLM)
- Si aucun LLM n'est connecté, le jeu utilisera une IA simple de simulation
- Cliquez sur "➡️ Tour Suivant" pour avancer
- Les joueurs alternent automatiquement
-
Actions manuelles (pour test)
- Créer une unité : Utilisez les boutons "Créer Ouvrier" ou "Créer Guerrier"
- Déplacer une unité : Cliquez sur une unité, puis cliquez sur la case cible
- Passer son tour : Cliquez sur "➡️ Tour Suivant"
Les LLM doivent retourner un JSON valide avec la structure suivante :
{
"action": {
"type": "create|move|attack|pass",
"unit": "worker|warrior",
"unitId": "unit_1_1",
"target": [x, y]
},
"message_interne": "Stratégie en anglais (max 50 tokens)",
"message_externe": "Message pour l'adversaire (max 50 tokens)"
}Tour 1 - Joueur 1:
- Action: Créer un ouvrier (10⚡)
- Message interne: "I need more energy to build warriors."
- Message externe: "You will regret underestimating me!"
Tour 1 - Joueur 2:
- Action: Créer un ouvrier (10⚡)
- Message interne: "Starting with resource gathering."
- Message externe: "We'll see about that!"
Tour 2 - Joueur 1:
- Récolte: Ouvrier sur 🌳 → +1⚡
- Action: Créer un guerrier (20⚡)
- Message interne: "Building military force."
... et ainsi de suite jusqu'à ce qu'une base soit détruite!
| Fichier | Description |
|---|---|
config.js |
Constantes du jeu (taille carte, coûts, couleurs, etc.) |
prompts/system_prompt.txt |
Template de prompt envoyé aux LLM |
Éditez config.js pour modifier :
const CONFIG = {
MAP: {
WIDTH: 20,
HEIGHT: 15,
// ...
},
PLAYERS: [
{ id: 1, color: '#FF5733', basePos: [2, 2], energy: 50, baseHP: 100 },
{ id: 2, color: '#3357FF', basePos: [17, 12], energy: 50, baseHP: 100 }
],
UNITS: {
worker: { cost: 10, hp: 20, damage: 0, move: 1, harvest: 1 },
warrior: { cost: 20, hp: 40, damage: 10, move: 1, harvest: 0 }
},
// ...
};Éditez prompts/system_prompt.txt pour adapter le comportement des LLM. Le prompt doit contenir les placeholders suivants :
{playerId}: ID du joueur (1 ou 2){baseX}et{baseY}: Position de la base{gameState}: État actuel du jeu en JSON
llm-duel/
├── index.html # Page principale (UI)
├── style.css # Styles CSS
├── script.js # Logique du jeu (frontend)
├── config.js # Configuration
├── prompts/
│ └── system_prompt.txt # Template de prompt pour les LLM
├── docs/
│ └── CREATE-REAL.md # Documentation technique complète
├── PLAN.md # Plan de développement
└── README.md # Ce fichier
- Aucune dépendance : Fonctionne avec du HTML/CSS/JS pur
- Compatibilité : Tous les navigateurs modernes
- Responsive : Adapté aux écrans mobile et desktop
Pour la V1, le backend n'est pas nécessaire. Les appels LLM sont faits directement depuis le frontend via fetch.
Pour une version plus sécurisée (V2+), un backend FastAPI peut être ajouté dans le dossier backend/.
Détruire la base adverse (100 PV) en utilisant vos unités.
-
Début du tour
- Récolte automatique : +1⚡ pour chaque ouvrier sur une ressource
- Génération d'énergie : +1⚡ par joueur par tour
- Le LLM reçoit l'état du jeu
-
Action du LLM
- Le LLM choisit une action (créer, déplacer, attaquer, passer)
- Le LLM génère un message interne (stratégie)
- Le LLM génère un message externe (communication)
-
Validation
- Le jeu vérifie que l'action est valide (ressources, position, etc.)
- Si invalide → action "pass" par défaut
-
Fin du tour
- Les PV sont mis à jour
- On passe au joueur suivant
- Énergie : Utilisée pour créer des unités
- Déplacement : 1 case par tour (horizontal/vertical uniquement)
- Attaque : Les guerriers infligent 10 dégâts aux unités adjacentes
- Récolte : Les ouvriers récoltent 1⚡/tour sur une ressource
- Victoire : La partie se termine quand une base atteint 0 PV
- Limite : Maximum 200 tours (match nul)
| Type | Symbole | Effet |
|---|---|---|
| Herbe | 🟢 | Normale |
| Eau | 🔵 | Bloque le passage |
| Montagne | ⛰️ | Bloque le passage |
| Sable | 🟡 | Normale |
| Type | Symbole | Valeur |
|---|---|---|
| Arbre | 🌳 | 1⚡/tour |
| Or | 💰 | 1⚡/tour |
| Pierre | ⛏️ | Réservée V2 |
- Vérifiez qu'Ollama est installé et lancé :
ollama serve
- Vérifiez que le serveur Ollama répond :
curl http://localhost:11434/api/tags
- Assurez-vous que le modèle est téléchargé :
ollama pull llama3
Si vous utilisez un serveur local et rencontrez des erreurs CORS avec Ollama :
- Utilisez le protocole
http://au lieu dehttps:// - Lancez Chrome avec les CORS désactivés (pour développement uniquement) :
google-chrome --disable-web-security --user-data-dir=/tmp/chrome-test
- Vérifiez que le prompt système est correctement chargé
- Vérifiez que le LLM retourne bien un JSON valide
- Activez la console du navigateur (F12) pour voir les erreurs
- Cliquez sur "🔄 Réinitialiser" pour recommencer
- Actualisez la page
index.html: Structure de la pagestyle.css: Styles et mise en pagescript.js: Logique du jeuconfig.js: Constantes et configuration
| Fonction | Description |
|---|---|
initGame() |
Initialise le jeu |
startGame() |
Démarre une nouvelle partie |
nextTurn() |
Passe au tour suivant |
createUnit(playerId, type) |
Crée une unité |
moveUnit(unitId, [x, y]) |
Déplace une unité |
attackUnit(attackerId, targetId) |
Attaque une unité |
callPlayerLLM(playerId) |
Appelle le LLM du joueur |
applyLLMAction(playerId, action) |
Applique une action LLM |
- Ajoutez la configuration dans
config.js - Ajoutez la logique dans
script.js(création, déplacement, attaque) - Mettez à jour le prompt système
- Modifiez le
config.jspour changer les modèles par défaut - Utilisez différents modèles Ollama :
llama3,mistral,phi3 - Comparez les performances!
Les contributions sont les bienvenues! Voici comment contribuer :
- Fork le dépôt
- Créez une branche (
git checkout -b feature/ma-fonctionnalité) - Commit vos changements (
git commit -m 'Ajout de X') - Push (
git push origin feature/ma-fonctionnalité) - Ouvrez une Pull Request
- Respectez les conventions de code existantes
- Ajoutez des commentaires pour le code complexe
- Testez vos modifications avant de committer
- Mettez à jour la documentation si nécessaire
Ce projet est sous licence MIT - libre d'utiliser, modifier et distribuer.
MIT License
Copyright (c) 2024 LLM Duel
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Pour toute question ou suggestion, veuillez créer une Issue sur le dépôt GitHub ou consulter la documentation dans docs/CREATE-REAL.md.
Amusez-vous bien avec LLM Duel! 🎮🤖