🧠 Langage Kod - Documentation Complète
Le langage Kod est un langage de programmation simplifié conçu spécifiquement pour l'apprentissage de la programmation à travers la création de jeux 2D.
📋 Table des Matières
- Philosophie du Langage
- Syntaxe de Base
- Variables et Types
- Structures de Contrôle
- Fonctions
- API Graphique
- Gestion des Entrées
- Exemples Pratiques
- Bonnes Pratiques
Philosophie
Qu'est-ce que Kod ?
Kod est un langage de script inspiré de Python, LUA et Pascal, conçu pour :
✅ Simplicité : Syntaxe épurée, pas de point-virgules
✅ Lisibilité : Structure claire avec end
explicites
✅ Accessibilité : Idéal pour les débutants
✅ Immédiat : Résultats visuels instantanés
✅ Ludique : Orienté création de jeux
Compilation Automatique
Kod est transpilé automatiquement en JavaScript ES6 :
// Code Kod
let speed = 5
function update()
x = x + speed
end
// JavaScript généré
class KodGame {
constructor(emulator) {
this.speed = 5;
}
update() {
this.x = this.x + this.speed;
}
}
Syntaxe de Base
Structure d'un Programme
// === VARIABLES GLOBALES ===
let playerX = 200
let playerY = 150
let score = 0
// === FONCTION DE DÉMARRAGE ===
function start()
clearScreen("#000033")
drawText("Jeu démarré!", 100, 50, "#FFFFFF")
end
// === BOUCLE PRINCIPALE ===
function update()
// Effacer l'écran
clearScreen("#000033")
// Logique du jeu
if isKeyPressed("left")
playerX = playerX - 3
end
// Affichage
drawCircle(playerX, playerY, 15, "#FF6600")
drawText("Score: " + score, 10, 20, "#FFFFFF")
end
Règles Syntaxiques
1. Commentaires
// Commentaire sur une ligne
// Les commentaires sont ignorés par le compilateur
let x = 100 // Commentaire en fin de ligne
2. Casse et Nommage
// Variables : camelCase recommandé
let playerSpeed = 5
let enemyCount = 3
let isGameOver = false
// Fonctions : camelCase obligatoire
function updatePlayer()
// ...
end
function checkCollision()
// ...
end
3. Indentation
- Recommandée : 4 espaces
- Flexible : Tabs acceptés
- Important : Cohérence dans tout le code
4. Blocs de Code
// Toujours terminer les blocs par 'end'
if condition
// instructions
end
function maFonction()
// instructions
end
for i = 1 to 10
// instructions
end
Variables et Types
Déclaration de Variables
// Déclaration avec valeur initiale
let x = 100
let y = 200
let name = "Player"
let isAlive = true
// Variables numériques
let speed = 2.5
let angle = 3.14159
let health = 100
// Variables texte (chaînes)
let title = "Mon Jeu"
let message = "Game Over"
// Variables booléennes
let gameStarted = false
let hasKey = true
Types Supportés
1. Nombres
let entier = 42 // Nombre entier
let decimal = 3.14 // Nombre décimal
let negatif = -10 // Nombre négatif
let grand = 1000000 // Grand nombre
2. Chaînes de Caractères
let simple = "Hello"
let guillemets = 'World'
let phrase = "Bonjour le monde!"
let vide = ""
// Concaténation avec +
let complet = "Score: " + score
let coordonnees = "Position (" + x + ", " + y + ")"
3. Booléens
let vrai = true
let faux = false
// Résultats de comparaisons
let estGrand = (x > 100)
let estEgal = (score == 0)
Opérations sur Variables
Arithmétiques
let a = 10
let b = 3
let somme = a + b // 13
let difference = a - b // 7
let produit = a * b // 30
let quotient = a / b // 3.33...
let modulo = a % b // 1 (reste)
Comparaisons
let x = 5
let y = 10
// Égalité
x == y // false
x != y // true
// Ordre
x < y // true
x > y // false
x <= 5 // true
x >= 10 // false
Logiques
let a = true
let b = false
// ET logique
a && b // false
// OU logique
a || b // true
// NON logique
!a // false
!b // true
Structures de Contrôle
Conditions (if/else)
Syntaxe Simple
if condition
// instructions si vrai
end
Avec Alternative
if playerHealth > 0
drawCircle(playerX, playerY, 20, "#00FF00")
else
drawText("GAME OVER", 150, 150, "#FF0000")
end
Conditions Multiples
if score < 100
drawText("Débutant", 10, 10, "#YELLOW")
else if score < 500
drawText("Intermédiaire", 10, 10, "#ORANGE")
else if score < 1000
drawText("Avancé", 10, 10, "#RED")
else
drawText("Expert!", 10, 10, "#GOLD")
end
Conditions Complexes
// Plusieurs conditions avec ET
if (playerX > 0) && (playerX < 400) && (playerY > 0) && (playerY < 300)
// Joueur dans les limites
end
// Plusieurs conditions avec OU
if isKeyPressed("space") || isKeyPressed("enter")
// Tir ou validation
end
// Négation
if !gameOver && !isPaused
// Continuer le jeu
end
Boucles
Boucle For Simple
// Compter de 1 à 10
for i = 1 to 10
drawCircle(i * 30, 100, 10, "#FF0000")
end
Boucle For avec Pas
// Compter de 0 à 100 par pas de 10
for x = 0 to 100 step 10
drawLine(x, 0, x, 300, "#333333")
end
Boucle While
let x = 0
while x < 400
drawPixel(x, 150, "#FFFFFF")
x = x + 5
end
Exemples Pratiques de Boucles
// Dessiner une grille
for x = 0 to 400 step 20
for y = 0 to 300 step 20
drawPixel(x, y, "#444444")
end
end
// Afficher plusieurs ennemis
for i = 1 to 5
let enemyX = i * 70
drawRect(enemyX, 200, 20, 20, "#FF0000")
end
// Animation de particules
let particleX = 0
while particleX < 400
drawCircle(particleX, 150, 3, "#FFFF00")
particleX = particleX + 8
end
Fonctions
Structure des Fonctions
Fonctions Obligatoires
function start()
// Appelée UNE FOIS au démarrage du jeu
// Initialisation, écran de démarrage
clearScreen("#000000")
drawText("Initialisation...", 100, 150, "#FFFFFF")
end
function update()
// Appelée CHAQUE FRAME (60 fois par seconde)
// Logique principale du jeu
clearScreen("#000033")
// Mise à jour des objets
updatePlayer()
updateEnemies()
// Affichage
drawPlayer()
drawEnemies()
drawUI()
end
Fonctions Personnalisées
// Fonction sans paramètres
function resetGame()
playerX = 200
playerY = 150
score = 0
gameOver = false
end
// Fonction avec logique
function updatePlayer()
if isKeyPressed("left")
playerX = playerX - playerSpeed
end
if isKeyPressed("right")
playerX = playerX + playerSpeed
end
// Limites de l'écran
if playerX < 0
playerX = 0
end
if playerX > 380
playerX = 380
end
end
// Fonction d'affichage
function drawPlayer()
drawRect(playerX, playerY, 20, 20, "#00FF00")
if hasShield
drawCircle(playerX + 10, playerY + 10, 25, "#0066FF")
end
end
Organisation du Code
Structure Recommandée
// === VARIABLES GLOBALES ===
let playerX = 200
let playerY = 150
let enemies = []
let score = 0
// === FONCTION PRINCIPALE ===
function start()
initializeGame()
end
function update()
handleInput()
updateGame()
renderGame()
end
// === FONCTIONS D'INITIALISATION ===
function initializeGame()
clearScreen("#001122")
createEnemies()
showStartMessage()
end
// === FONCTIONS DE LOGIQUE ===
function handleInput()
if isKeyPressed("left")
movePlayerLeft()
end
if isKeyPressed("right")
movePlayerRight()
end
end
function updateGame()
updatePlayer()
updateEnemies()
checkCollisions()
end
// === FONCTIONS D'AFFICHAGE ===
function renderGame()
clearScreen("#001122")
drawBackground()
drawPlayer()
drawEnemies()
drawUI()
end
API Graphique
Gestion de l'Écran
Nettoyage
// Effacer tout l'écran avec une couleur
clearScreen("#000000") // Noir
clearScreen("#FFFFFF") // Blanc
clearScreen("#003366") // Bleu foncé
clearScreen("#RGB") // Format hexadécimal
Formes Géométriques
Rectangles
// Rectangle plein
drawRect(x, y, width, height, color)
drawRect(100, 50, 80, 40, "#FF0000")
// Exemples
drawRect(0, 0, 400, 20, "#333333") // Barre supérieure
drawRect(playerX, playerY, 20, 20, "#00FF00") // Joueur carré
Cercles
// Cercle plein
drawCircle(x, y, radius, color)
drawCircle(200, 150, 25, "#FFFF00")
// Exemples
drawCircle(ballX, ballY, ballRadius, "#FFFFFF") // Balle
drawCircle(mouseX, mouseY, 5, "#FF0000") // Curseur
Lignes
// Ligne droite
drawLine(x1, y1, x2, y2, color)
drawLine(0, 150, 400, 150, "#666666")
// Exemples
drawLine(0, 0, 400, 300, "#FFFFFF") // Diagonale
drawLine(playerX, playerY, targetX, targetY, "#FF0000") // Visée
Pixels
// Point unique
drawPixel(x, y, color)
drawPixel(200, 150, "#FFFFFF")
// Utile pour les effets
for i = 1 to 100
drawPixel(randomX, randomY, "#FFFF00") // Étoiles
end
Texte et Interface
Affichage de Texte
// Texte simple
drawText(text, x, y, color)
drawText("Score: 1250", 10, 20, "#FFFFFF")
// Exemples d'interface
drawText("GAME OVER", 150, 150, "#FF0000")
drawText("Niveau " + currentLevel, 10, 40, "#FFFF00")
drawText("Vies: " + lives, 10, 60, "#00FF00")
drawText("Temps: " + timeRemaining, 300, 20, "#CYAN")
Couleurs
Formats Supportés
// Hexadécimal (recommandé)
"#FF0000" // Rouge pur
"#00FF00" // Vert pur
"#0000FF" // Bleu pur
"#FFFFFF" // Blanc
"#000000" // Noir
"#808080" // Gris
// Couleurs nommées (limitées)
"red" // Rouge
"green" // Vert
"blue" // Bleu
"yellow" // Jaune
"white" // Blanc
"black" // Noir
Palette Recommandée
// Couleurs de jeu classiques
let colorBackground = "#001122" // Bleu très foncé
let colorPlayer = "#00FF00" // Vert vif
let colorEnemy = "#FF0000" // Rouge vif
let colorUI = "#FFFFFF" // Blanc
let colorPowerup = "#FFFF00" // Jaune
let colorBorder = "#666666" // Gris moyen
Sons et Audio
Jouer des Sons
// Jouer une note musicale
playSound(note, durée)
playSound("do", 0.3) // Note do pendant 0.3 secondes
playSound("re", 0.5) // Note ré pendant 0.5 secondes
// Notes disponibles
playSound("do", 0.2) // Do (C4 - 261.63 Hz)
playSound("re", 0.2) // Ré (D4 - 293.66 Hz)
playSound("mi", 0.2) // Mi (E4 - 329.63 Hz)
playSound("fa", 0.2) // Fa (F4 - 349.23 Hz)
playSound("sol", 0.2) // Sol (G4 - 392.00 Hz)
playSound("la", 0.2) // La (A4 - 440.00 Hz)
playSound("si", 0.2) // Si (B4 - 493.88 Hz)
playSound("do2", 0.2) // Do aigu (C5 - 523.25 Hz)
Exemples d'Usage Audio
// Effet sonore de saut
if isKeyPressed("up") && onGround
playerY = playerY - jumpPower
playSound("do", 0.1) // Petit bip de saut
end
// Mélodie de victoire
function playVictoryMelody()
playSound("do", 0.2)
playSound("mi", 0.2)
playSound("sol", 0.4)
end
// Son d'erreur/dégât
if collision
playSound("si", 0.1) // Note aigue pour l'alerte
end
// Séquence musicale simple
let melodyStep = 0
let melodyNotes = ["do", "re", "mi", "do"]
if frameCount % 30 == 0 // Chaque demi-seconde
playSound(melodyNotes[melodyStep], 0.2)
melodyStep = melodyStep + 1
if melodyStep >= 4
melodyStep = 0
end
end
Paramètres Audio
// Durée par défaut : 0.2 seconde
playSound("do") // Équivaut à playSound("do", 0.2)
// Durées recommandées
playSound("do", 0.1) // Son court (effet)
playSound("re", 0.3) // Son moyen (action)
playSound("mi", 0.5) // Son long (mélodie)
playSound("fa", 1.0) // Son très long (ambiance)
Notes techniques :
- Les sons sont générés par oscillateur (pas de fichiers audio)
- Type d'onde : square
(son rétro 8-bit)
- Volume automatiquement ajusté avec fade-out
- Nécessite une interaction utilisateur pour initialiser l'audio
Gestion des Entrées
Détection des Touches
Fonction Principale
isKeyPressed(keyName) // Retourne true/false
Touches Supportées
// Flèches directionnelles
isKeyPressed("up") // Flèche Haut ou W
isKeyPressed("down") // Flèche Bas ou S
isKeyPressed("left") // Flèche Gauche ou A
isKeyPressed("right") // Flèche Droite ou D
// Espace
isKeyPressed("space") // Barre d'espace
Exemples de Contrôles
Mouvement Basique
function update()
// Mouvement du joueur
if isKeyPressed("left")
playerX = playerX - playerSpeed
end
if isKeyPressed("right")
playerX = playerX + playerSpeed
end
if isKeyPressed("up")
playerY = playerY - playerSpeed
end
if isKeyPressed("down")
playerY = playerY + playerSpeed
end
end
Mouvement avec Limites
function updatePlayer()
let oldX = playerX
let oldY = playerY
// Tentative de mouvement
if isKeyPressed("left")
playerX = playerX - playerSpeed
end
if isKeyPressed("right")
playerX = playerX + playerSpeed
end
// Vérification des limites
if playerX < 0
playerX = 0
end
if playerX > 380 // 400 - largeur joueur (20)
playerX = 380
end
end
Actions Spéciales
function handleActions()
// Tir avec espace
if isKeyPressed("space")
if canShoot
createBullet(playerX + 10, playerY)
canShoot = false
shootCooldown = 10
end
end
// Gestion du cooldown
if shootCooldown > 0
shootCooldown = shootCooldown - 1
end
if shootCooldown == 0
canShoot = true
end
end
Contrôles de Jeu
function handleGameControls()
// Pause/Reprise
if isKeyPressed("space") && gameStarted && !gamePaused
gamePaused = true
else if isKeyPressed("space") && gamePaused
gamePaused = false
end
// Redémarrage
if isKeyPressed("space") && gameOver
restartGame()
end
end
Exemples Pratiques
1. Animation Simple
let x = 0
let direction = 1
function start()
clearScreen("#000033")
end
function update()
clearScreen("#000033")
// Animation rebond
x = x + (direction * 3)
if x > 380 || x < 0
direction = direction * -1
end
drawCircle(x, 150, 20, "#FF6600")
end
2. Collecteur d'Objets
let playerX = 200
let playerY = 250
let coinX = 100
let coinY = 100
let score = 0
function start()
clearScreen("#001122")
end
function update()
clearScreen("#001122")
// Contrôles joueur
if isKeyPressed("left")
playerX = playerX - 3
end
if isKeyPressed("right")
playerX = playerX + 3
end
// Collision avec pièce
let distance = (playerX - coinX) * (playerX - coinX) + (playerY - coinY) * (playerY - coinY)
if distance < 400 // 20*20 pixels de distance
score = score + 10
// Nouvelle position aléatoire pour la pièce
coinX = 50 + (score % 300)
coinY = 50 + ((score * 3) % 200)
end
// Affichage
drawRect(playerX - 10, playerY - 10, 20, 20, "#00FF00") // Joueur
drawCircle(coinX, coinY, 8, "#FFFF00") // Pièce
drawText("Score: " + score, 10, 20, "#FFFFFF") // Interface
end
3. Jeu de Tir Simple
let playerX = 200
let bullets = []
let enemies = []
let score = 0
function start()
// Créer quelques ennemis
for i = 1 to 5
// enemies[i] sera géré inline dans update()
end
end
function update()
clearScreen("#000033")
// Contrôles joueur
if isKeyPressed("left") && playerX > 0
playerX = playerX - 4
end
if isKeyPressed("right") && playerX < 380
playerX = playerX + 4
end
// Tir (simplifié - une balle à la fois)
if isKeyPressed("space")
bulletX = playerX
bulletY = 280
bulletActive = true
end
// Mise à jour balle
if bulletActive
bulletY = bulletY - 6
if bulletY < 0
bulletActive = false
end
drawRect(bulletX, bulletY, 3, 8, "#FFFFFF")
end
// Ennemis simples (positions fixes)
for i = 1 to 5
let enemyX = i * 70
let enemyY = 50
drawRect(enemyX, enemyY, 20, 20, "#FF0000")
// Collision balle-ennemi (basique)
if bulletActive
if (bulletX > enemyX - 10) && (bulletX < enemyX + 30) && (bulletY < enemyY + 20) && (bulletY > enemyY - 10)
score = score + 100
bulletActive = false
// L'ennemi "disparaît" temporairement
end
end
end
// Affichage
drawRect(playerX - 10, 280, 20, 20, "#00FF00") // Joueur
drawText("Score: " + score, 10, 20, "#FFFFFF") // Interface
end
Bonnes Pratiques
1. Structure du Code
Organisation Claire
// === CONSTANTES ET CONFIGURATION ===
let SCREEN_WIDTH = 400
let SCREEN_HEIGHT = 300
let PLAYER_SPEED = 4
// === VARIABLES DE JEU ===
let playerX = 200
let playerY = 150
let gameState = "playing" // "menu", "playing", "gameover"
// === FONCTIONS PRINCIPALES ===
function start()
initializeGame()
end
function update()
if gameState == "menu"
handleMenu()
else if gameState == "playing"
handleGameplay()
else if gameState == "gameover"
handleGameOver()
end
end
// === FONCTIONS SPÉCIALISÉES ===
function initializeGame()
// ...
end
Nommage Cohérent
// ✅ Bon nommage
let playerSpeed = 4
let enemyCount = 5
let isGameOver = false
function updatePlayer()
// ...
end
function drawEnemies()
// ...
end
// ❌ Mauvais nommage
let s = 4 // Pas clair
let x1 = 5 // Pas descriptif
let flag = false // Trop vague
2. Performance
Optimisation des Rendus
function update()
// ✅ Effacer UNE FOIS par frame
clearScreen("#000033")
// ✅ Grouper les dessins similaires
drawBackground()
drawAllEnemies()
drawPlayer()
drawUI()
end
// ❌ À éviter
function update()
clearScreen("#000033")
drawPlayer()
clearScreen("#000033") // ❌ Double effacement
drawEnemy()
clearScreen("#000033") // ❌ Triple effacement
end
Calculs Optimisés
// ✅ Calculer une fois, utiliser plusieurs fois
let playerCenterX = playerX + 10
let playerCenterY = playerY + 10
// Utiliser les valeurs calculées
drawCircle(playerCenterX, playerCenterY, 15, "#00FF00")
checkCollisionWithEnemies(playerCenterX, playerCenterY)
// ❌ Calculs répétitifs
drawCircle(playerX + 10, playerY + 10, 15, "#00FF00")
checkCollisionWithEnemies(playerX + 10, playerY + 10) // Recalcule
3. Lisibilité
Commentaires Utiles
// === GESTION DES COLLISIONS ===
function checkPlayerEnemyCollision()
for i = 1 to enemyCount
let enemyX = enemies[i].x
let enemyY = enemies[i].y
// Calcul de la distance euclidienne
let dx = playerX - enemyX
let dy = playerY - enemyY
let distance = (dx * dx) + (dy * dy)
// Collision si distance < rayon combiné au carré
if distance < 400 // (10+10)² = 400
handlePlayerHit()
end
end
end
Code Auto-Documenté
// ✅ Variables explicites
let COLLISION_RADIUS = 20
let PLAYER_LIVES = 3
let ENEMY_SPAWN_RATE = 60 // frames entre chaque spawn
if frameCount % ENEMY_SPAWN_RATE == 0
spawnNewEnemy()
end
// ❌ Nombres magiques
if frameCount % 60 == 0 // Pourquoi 60 ?
spawnNewEnemy()
end
4. Gestion d'État
États de Jeu Clairs
let gameState = "menu" // "menu", "playing", "paused", "gameover"
function update()
if gameState == "menu"
handleMenuInput()
drawMenu()
else if gameState == "playing"
updateGameLogic()
drawGame()
else if gameState == "paused"
handlePauseInput()
drawPausedGame()
else if gameState == "gameover"
handleGameOverInput()
drawGameOver()
end
end
5. Débogage
Messages de Debug
let DEBUG_MODE = true
function update()
// Logique normale
updatePlayer()
// Informations de debug
if DEBUG_MODE
drawText("Player: (" + playerX + ", " + playerY + ")", 10, 280, "#YELLOW")
drawText("FPS: 60", 300, 280, "#YELLOW")
drawText("Enemies: " + enemyCount, 10, 260, "#YELLOW")
end
end
🎯 Récapitulatif
Le langage Kod vous permet de créer facilement des jeux 2D avec :
✅ Syntaxe simple : if
/end
, function
/end
✅ Typage automatique : Variables flexibles
✅ API graphique : Formes, texte, couleurs
✅ Gestion d'entrées : Clavier intégré
✅ Boucle de jeu : start()
et update()
Étapes Suivantes
- 🎮 Explorez les Exemples Complets
- 🎯 Suivez le Guide de Création de Jeux
- 🔍 Consultez l'API de Référence
Bon coding avec Kod ! 🚀