Une implémentation complète du jeu de Go (Weiqi/Baduk) en JavaScript, respectant les règles traditionnelles avec interface moderne et fonctionnalités avancées.
Contrôler le plus de territoire possible en plaçant des pierres et en capturant celles de l'adversaire.
- Noir commence toujours
- Une pierre par tour sur une intersection libre
- Les pierres ne bougent jamais une fois posées
- Liberté : intersections vides adjacentes à une pierre/groupe
- Capture : un groupe sans liberté est retiré du plateau
- Les pierres capturées deviennent des prisonniers
- Ko : Interdit de recréer immédiatement la position précédente
- Suicide : Généralement interdit (placer sans liberté)
- Passer : Possible à tout moment
- Deux passes consécutives → Comptage du territoire
- Abandon possible à tout moment
- Territoire : intersections vides contrôlées
- Prisonniers : pierres capturées
- Komi : bonus de 6.5 points pour Blanc (compense l'avantage du premier coup)
- Score = Territoire + Prisonniers + Komi (Blanc uniquement)
- 9×9 : Parfait pour débuter (parties rapides)
- 13×13 : Niveau intermédiaire
- 19×19 : Standard professionnel
- Design authentique avec plateau en bois et pierres réalistes
- Points d'étoile (Hoshi) traditionnels
- Coordonnées A-T / 1-19 (sans I)
- Marquage du dernier coup avec point rouge
- Animations fluides pour placement et captures
- Détection automatique des captures
- Règle du Ko implémentée
- Prévention du suicide
- Comptage de territoire intelligent
- Gestion des groupes et libertés
- Sauvegarde/Chargement local
- Export SGF (format standard du Go)
- Historique complet des coups
- Mode comptage interactif
- Paramètres personnalisables (Komi, affichage)
Jeu-de-go/
├── index.html # Interface utilisateur complète
├── style.css # Design authentique et responsive
├── script.js # Logique de jeu et règles
└── README.md # Documentation
- HTML5 : Structure sémantique et accessibilité
- CSS3 : Grid layout, animations, design authentique
- JavaScript ES6+ : Algorithmes de Go, gestion d'état
- LocalStorage : Sauvegarde des parties
- Format SGF : Export professionnel des parties
- GitHub Pages : Hébergement gratuit
-
Créer un dépôt
# Sur GitHub, créez un dépôt nommé "Jeu-de-go" -
Ajouter les fichiers
git clone https://github.com/Timso-dev/Jeu-de-go.git cd Jeu-de-go # Ajoutez les 3 fichiers : index.html, style.css, script.js git add . git commit -m "Ajout du jeu de Go" git push origin main
-
Activer GitHub Pages
- Settings → Pages
- Source : "Deploy from a branch"
- Branch :
main→/ (root)
-
Jouer
https://Timso-dev.github.io/Jeu-de-go/
git clone https://github.com/Timso-dev/Jeu-de-go.git
cd Jeu-de-go
# Serveur local optionnel
python -m http.server 8000
# Ou ouvrir index.html directementclass GoGame {
constructor() {
this.boardSize = 19; // Taille du plateau
this.board = []; // État du plateau
this.currentPlayer = 'black'; // Joueur actuel
this.moveHistory = []; // Historique complet
this.prisoners = {}; // Pierres capturées
this.koPosition = null; // Position Ko interdite
}
}getGroup(board, startRow, startCol) {
// Parcours en profondeur pour identifier un groupe connexe
const group = [];
const visited = new Set();
const stack = [{row: startRow, col: startCol}];
while (stack.length > 0) {
// Explorer les pierres de même couleur adjacentes
const {row, col} = stack.pop();
// ... logique de groupe
}
return group;
}getGroupLibertiesCount(board, group) {
const liberties = new Set();
group.forEach(({row, col}) => {
// Compter les intersections vides adjacentes
const directions = [[0,1], [1,0], [0,-1], [-1,0]];
directions.forEach(([dr, dc]) => {
const newRow = row + dr;
const newCol = col + dc;
if (this.isValidPosition(newRow, newCol) &&
board[newRow][newCol] === null) {
liberties.add(`${newRow},${newCol}`);
}
});
});
return liberties.size;
}captureGroups(board, row, col) {
const captured = [];
const opponent = this.currentPlayer === 'black' ? 'white' : 'black';
// Vérifier chaque groupe adverse adjacent
const directions = [[0,1], [1,0], [0,-1], [-1,0]];
directions.forEach(([dr, dc]) => {
const adjacentGroup = this.getGroup(board, row + dr, col + dc);
if (adjacentGroup.length > 0 &&
this.getGroupLibertiesCount(board, adjacentGroup) === 0) {
captured.push(...adjacentGroup);
}
});
return captured;
}// Empêche la répétition immédiate de position
const boardString = this.boardToString(testBoard);
if (this.koPosition === boardString) {
this.showMessage('Règle du Ko : coup interdit', 'error');
return;
}calculateTerritoryScore() {
const territory = { black: 0, white: 0 };
const visited = new Set();
// Identifier chaque région vide
for (let row = 0; row < this.boardSize; row++) {
for (let col = 0; col < this.boardSize; col++) {
if (this.board[row][col] === null && !visited.has(`${row},${col}`)) {
const emptyRegion = this.getEmptyTerritory(row, col, visited);
const owner = this.getTerritoryOwner(emptyRegion);
if (owner) {
territory[owner] += emptyRegion.length;
}
}
}
}
return territory;
}- Plateau en bois : Dégradé brun authentique
- Pierres réalistes : Effet 3D avec ombres radiales
- Points Hoshi : Marqueurs traditionnels selon la taille
- Coordonnées : Système standard A-T / 1-19
- Dernier coup : Point rouge sur la dernière pierre
- Survol : Prévisualisation de placement
- Captures : Animation de disparition
- Territoire : Zones colorées en mode comptage
- Pierres mortes : Affichage semi-transparent
- Desktop : Panneau latéral avec plateau principal
- Tablet : Réorganisation en colonne
- Mobile : Interface optimisée tactile
exportSGF() {
let sgf = '(;FF[4]CA[UTF-8]AP[WebGo:1.0]';
sgf += `SZ[${this.boardSize}]KM[${this.komi}]`;
this.moveHistory.forEach(move => {
if (move.pass) {
sgf += `;${move.player === 'black' ? 'B' : 'W'}[]`;
} else {
const coords = this.moveToSGF(move.row, move.col);
sgf += `;${move.player === 'black' ? 'B' : 'W'}[${coords}]`;
}
});
sgf += ')';
return sgf;
}saveGame() {
const gameData = {
boardSize: this.boardSize,
board: this.board,
moveHistory: this.moveHistory,
currentPlayer: this.currentPlayer,
prisoners: this.prisoners,
timestamp: new Date().toISOString()
};
localStorage.setItem('goGame', JSON.stringify(gameData));
}- Clic sur pierres mortes pour les marquer
- Calcul automatique du territoire
- Affichage des scores partiels
- Validation finale avec totaux
- Parcours de graphe (DFS pour groupes)
- Détection de cycles (règle du Ko)
- Analyse de connectivité (libertés)
- Optimisation mémoire (représentation plateau)
- Encapsulation des règles du jeu
- Modularité des fonctions
- Gestion d'état complexe
- Patterns de conception
- Manipulation DOM avancée
- Gestion d'événements complexes
- Animations CSS fluides
- Design responsive multi-device
// Autoriser le suicide
isValidMove(row, col) {
// Supprimer la vérification du suicide
return this.board[row][col] === null;
}
// Changer le Komi par défaut
constructor() {
this.komi = 7.5; // Komi alternatif
}// Dans le HTML
<option value="15">15×15 (Personnalisé)</option>
// Points d'étoile personnalisés
const starPoints = {
15: [[3,3], [3,11], [11,3], [11,11], [7,7]]
};/* Thème moderne */
.go-board {
background: linear-gradient(45deg, #2c3e50, #34495e);
border: 3px solid #1abc9c;
}
.stone.black-stone {
background: radial-gradient(circle at 30% 30%, #444, #000);
}- Intelligence artificielle basique (algorithme Monte Carlo)
- Niveaux de difficulté progressifs
- Suggestions de coups pour débutants
- Analyse de position (influence, territoire)
- Parties en ligne (WebSockets)
- Salles de jeu privées/publiques
- Chat intégré pendant les parties
- Système de classement ELO
- Base de données de parties célèbres
- Mode analyse avec variations
- Problèmes de Go (tsumego)
- Statistiques avancées de jeu
- Tutoriel interactif pour débutants
- Mode entraînement avec feedback
- Bibliothèque d'ouvertures (joseki)
- Vidéos explicatives intégrées
- ✅ Chrome 70+
- ✅ Firefox 65+
- ✅ Safari 12+
- ✅ Edge 79+
- ✅ Mobile Safari iOS 12+
- ✅ Chrome Android 70+
- JavaScript ES6+ (classes, destructuring)
- CSS Grid et Flexbox
- LocalStorage API
- File API (export SGF)
- Fork le projet
- Créer une branche (
git checkout -b feature/amelioration) - Commiter (
git commit -m 'Ajout fonctionnalité X') - Pousser (
git push origin feature/amelioration) - Pull Request
- 🐛 Corrections de bugs dans les règles
- ✨ Nouvelles fonctionnalités (IA, multijoueur)
- 📚 Amélioration documentation
- 🎨 Design et UX améliorés
- ⚡ Optimisations performance
- 🌍 Traductions autres langues
- Code ES6+ moderne et commenté
- Tests unitaires pour règles critiques
- Documentation JSDoc des fonctions
- Respect des conventions de nommage
- Pull requests avec description détaillée
Ce projet est sous licence MIT. Utilisation libre y compris commerciale.
- ✅ Projets personnels et éducatifs
- ✅ Applications commerciales
- ✅ Modifications et redistributions
- ✅ Intégration dans autres projets
- Inspiration : Traditions millénaires du Go en Asie
- Design : Esthétique des vrais plateaux de Go
- Algorithmes : Communauté open-source du Go
- Format SGF : Smart Game Format standards
- Documentation : Ce README complet
- Issues : Signaler un problème
- Discussions : Forum communautaire
- Email : support@votredomaine.com
⭐ Mettez une étoile si vous appréciez ce projet !
"Le Go est un miroir de l'esprit humain" - Proverbe asiatique 🎋