// === MODULE JEUX TEMPORAIRES === class TempGamesModule { constructor(options) { this.container = options.container; this.content = options.content; this.onScoreUpdate = options.onScoreUpdate || (() => {}); this.onGameEnd = options.onGameEnd || (() => {}); this.currentGame = null; this.availableGames = [ { id: 'word-match', name: 'Word Match', icon: '🎯', description: 'Associe les mots anglais avec leur traduction', difficulty: 'easy' }, { id: 'quick-translation', name: 'Quick Translation', icon: '⚡', description: 'Traduis le mot le plus rapidement possible', difficulty: 'medium' }, { id: 'word-builder', name: 'Word Builder', icon: '🔤', description: 'Reconstitue le mot lettre par lettre', difficulty: 'medium' } ]; this.init(); } init() { this.showGameSelector(); } showGameSelector() { this.container.innerHTML = `

🎯 Mini-Jeux Temporaires

Sélectionne un mini-jeu pour t'amuser avec le vocabulaire !

${this.availableGames.map(game => this.createGameCard(game)).join('')}

Ces jeux sont en développement et seront bientôt des modules complets !

`; this.setupGameSelector(); } createGameCard(game) { const difficultyColor = { easy: '#10B981', medium: '#F59E0B', hard: '#EF4444' }[game.difficulty]; return `
${game.icon}

${game.name}

${game.description}

${game.difficulty.toUpperCase()}
`; } setupGameSelector() { document.querySelectorAll('.mini-game-card').forEach(card => { card.addEventListener('click', () => { const gameId = card.dataset.game; this.startMiniGame(gameId); }); }); } startMiniGame(gameId) { const game = this.availableGames.find(g => g.id === gameId); if (!game) return; switch(gameId) { case 'word-match': this.startWordMatch(); break; case 'quick-translation': this.startQuickTranslation(); break; case 'word-builder': this.startWordBuilder(); break; } } // === WORD MATCH GAME === startWordMatch() { this.container.innerHTML = `

🎯 Word Match

Score: 0
Clique sur un mot anglais, puis sur sa traduction française !
`; this.setupWordMatch(); } setupWordMatch() { document.querySelector('.back-to-selector').addEventListener('click', () => { this.showGameSelector(); }); const words = this.content.vocabulary.slice(0, 6).map(w => ({ english: w.english, french: w.french })); const shuffledFrench = [...words].sort(() => Math.random() - 0.5); const englishContainer = document.getElementById('english-words'); const frenchContainer = document.getElementById('french-words'); let selectedEnglish = null; let matchedPairs = 0; let score = 0; words.forEach((word, index) => { const englishBtn = document.createElement('button'); englishBtn.className = 'word-btn english-btn'; englishBtn.textContent = word.english; englishBtn.dataset.word = word.english; englishContainer.appendChild(englishBtn); englishBtn.addEventListener('click', () => { document.querySelectorAll('.english-btn').forEach(btn => btn.classList.remove('selected')); englishBtn.classList.add('selected'); selectedEnglish = word.english; }); }); shuffledFrench.forEach(word => { const frenchBtn = document.createElement('button'); frenchBtn.className = 'word-btn french-btn'; frenchBtn.textContent = word.french; frenchBtn.dataset.word = word.french; frenchContainer.appendChild(frenchBtn); frenchBtn.addEventListener('click', () => { if (!selectedEnglish) { document.getElementById('match-feedback').textContent = 'Sélectionne d\'abord un mot anglais !'; return; } const correctWord = words.find(w => w.english === selectedEnglish); if (correctWord && correctWord.french === word.french) { // Correct match score += 10; matchedPairs++; document.querySelector(`[data-word="${selectedEnglish}"]`).classList.add('matched'); frenchBtn.classList.add('matched'); document.getElementById('match-feedback').textContent = 'Parfait ! 🎉'; if (matchedPairs === words.length) { setTimeout(() => { alert(`Félicitations ! Score final: ${score}`); this.onGameEnd(score); }, 1000); } } else { // Wrong match score = Math.max(0, score - 2); document.getElementById('match-feedback').textContent = `Non, "${selectedEnglish}" ne correspond pas à "${word.french}"`; } document.getElementById('match-score').textContent = score; this.onScoreUpdate(score); selectedEnglish = null; document.querySelectorAll('.english-btn').forEach(btn => btn.classList.remove('selected')); }); }); } // === QUICK TRANSLATION GAME === startQuickTranslation() { this.container.innerHTML = `

⚡ Quick Translation

Score: 0 Temps: 30s

---

Traduction en français :

`; this.setupQuickTranslation(); } setupQuickTranslation() { document.querySelector('.back-to-selector').addEventListener('click', () => { this.showGameSelector(); }); let currentWordIndex = 0; let score = 0; let timeLeft = 30; let gameTimer = null; let isPlaying = false; const words = this.shuffleArray([...this.content.vocabulary]).slice(0, 10); document.getElementById('start-quick-game').addEventListener('click', () => { if (isPlaying) return; isPlaying = true; currentWordIndex = 0; score = 0; timeLeft = 30; document.getElementById('start-quick-game').style.display = 'none'; gameTimer = setInterval(() => { timeLeft--; document.getElementById('quick-time').textContent = timeLeft; if (timeLeft <= 0) { clearInterval(gameTimer); alert(`Temps écoulé ! Score final: ${score}`); this.onGameEnd(score); } }, 1000); this.showQuickWord(); }); const showQuickWord = () => { if (currentWordIndex >= words.length) { clearInterval(gameTimer); alert(`Bravo ! Score final: ${score}`); this.onGameEnd(score); return; } const currentWord = words[currentWordIndex]; document.getElementById('current-word').textContent = currentWord.english; // Créer 4 options (1 correcte + 3 fausses) const options = [currentWord.french]; const otherWords = words.filter(w => w.french !== currentWord.french); for (let i = 0; i < 3; i++) { if (otherWords[i]) { options.push(otherWords[i].french); } } const shuffledOptions = this.shuffleArray(options); const optionsContainer = document.getElementById('translation-options'); optionsContainer.innerHTML = ''; shuffledOptions.forEach(option => { const btn = document.createElement('button'); btn.className = 'option-btn'; btn.textContent = option; btn.addEventListener('click', () => { if (option === currentWord.french) { score += 5; btn.classList.add('correct'); setTimeout(() => { currentWordIndex++; this.showQuickWord(); }, 500); } else { score = Math.max(0, score - 1); btn.classList.add('wrong'); document.querySelector(`button:contains("${currentWord.french}")`); } document.getElementById('quick-score').textContent = score; this.onScoreUpdate(score); // Désactiver tous les boutons document.querySelectorAll('.option-btn').forEach(b => b.disabled = true); }); optionsContainer.appendChild(btn); }); }; this.showQuickWord = showQuickWord; } // === WORD BUILDER GAME === startWordBuilder() { this.container.innerHTML = `

🔤 Word Builder

Score: 0

Traduction : ---

`; this.setupWordBuilder(); } setupWordBuilder() { document.querySelector('.back-to-selector').addEventListener('click', () => { this.showGameSelector(); }); let currentWordIndex = 0; let score = 0; const words = this.shuffleArray([...this.content.vocabulary]).slice(0, 8); const showBuilderWord = () => { if (currentWordIndex >= words.length) { alert(`Félicitations ! Score final: ${score}`); this.onGameEnd(score); return; } const currentWord = words[currentWordIndex]; const wordSpaces = document.getElementById('word-spaces'); const availableLetters = document.getElementById('available-letters'); document.getElementById('french-hint').textContent = currentWord.french; // Créer les espaces wordSpaces.innerHTML = ''; currentWord.english.split('').forEach((letter, index) => { const space = document.createElement('div'); space.className = 'letter-space'; space.dataset.index = index; space.dataset.letter = letter.toLowerCase(); wordSpaces.appendChild(space); }); // Créer les lettres mélangées + quelques lettres supplémentaires const wordLetters = currentWord.english.toLowerCase().split(''); const extraLetters = 'abcdefghijklmnopqrstuvwxyz'.split('') .filter(l => !wordLetters.includes(l)) .slice(0, 3); const allLetters = this.shuffleArray([...wordLetters, ...extraLetters]); availableLetters.innerHTML = ''; allLetters.forEach(letter => { const letterBtn = document.createElement('button'); letterBtn.className = 'letter-btn'; letterBtn.textContent = letter.toUpperCase(); letterBtn.dataset.letter = letter; letterBtn.addEventListener('click', () => { this.placeLetter(letter, letterBtn); }); availableLetters.appendChild(letterBtn); }); document.getElementById('next-word-btn').style.display = 'none'; document.getElementById('give-up-btn').style.display = 'inline-block'; }; const placeLetter = (letter, btn) => { const emptySpace = document.querySelector( `.letter-space[data-letter="${letter}"]:not(.filled)` ); if (emptySpace) { emptySpace.textContent = letter.toUpperCase(); emptySpace.classList.add('filled'); btn.disabled = true; // Vérifier si le mot est complet const allSpaces = document.querySelectorAll('.letter-space'); const filledSpaces = document.querySelectorAll('.letter-space.filled'); if (allSpaces.length === filledSpaces.length) { score += 15; document.getElementById('builder-score').textContent = score; this.onScoreUpdate(score); document.getElementById('next-word-btn').style.display = 'inline-block'; document.getElementById('give-up-btn').style.display = 'none'; // Désactiver toutes les lettres document.querySelectorAll('.letter-btn').forEach(b => b.disabled = true); } } else { // Mauvaise lettre btn.classList.add('wrong-letter'); setTimeout(() => btn.classList.remove('wrong-letter'), 1000); } }; document.getElementById('next-word-btn').addEventListener('click', () => { currentWordIndex++; showBuilderWord(); }); document.getElementById('give-up-btn').addEventListener('click', () => { currentWordIndex++; showBuilderWord(); }); this.placeLetter = placeLetter; showBuilderWord(); } shuffleArray(array) { const shuffled = [...array]; for (let i = shuffled.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]]; } return shuffled; } start() { // Interface commune - montrer le sélecteur this.showGameSelector(); } destroy() { this.container.innerHTML = ''; } } // CSS supplémentaire pour les mini-jeux const tempGamesStyles = ` `; // Ajouter les styles document.head.insertAdjacentHTML('beforeend', tempGamesStyles); // Enregistrement du module window.GameModules = window.GameModules || {}; window.GameModules.TempGames = TempGamesModule;