diff --git a/script.js b/script.js index 43cfa50..2bf4e87 100644 --- a/script.js +++ b/script.js @@ -1,5 +1,5 @@ const defaultWords = [ - 'DEVOPS', 'AGILE', 'VERSION', 'BRANCH', 'GITHUB', + 'DEVOPS', 'AGILE', 'VERSION', 'BRANCH', 'GITHUB', 'CHANGES', 'FEATURES', 'HOTFIX', 'CONTINUOUS', 'INTEGRATION', 'DEPLOYMENT', 'TESTING', 'COMMIT', 'SNAPSHOT', 'CULTURE', 'PIPELINE', 'DOCKER', 'SCRUM', 'KANBAN', 'MERGE' @@ -10,6 +10,7 @@ let gameState = { player2: { name: '', score: 0 }, currentPlayer: 1, currentWord: '', + lastWord: '', // ✅ add this guessedLetters: [], wrongGuesses: 0, maxWrong: 6, @@ -19,14 +20,14 @@ let gameState = { let wordBank = []; -document.addEventListener('DOMContentLoaded', function() { +document.addEventListener('DOMContentLoaded', function () { loadWordBank(); generateKeyboard(); }); function toggleTheme() { const themeIcon = document.querySelector('.theme-icon'); - + if (themeIcon.textContent === '🌙') { themeIcon.textContent = '☀️'; } else { @@ -37,10 +38,10 @@ function toggleTheme() { function switchTab(tabName) { const tabs = document.querySelectorAll('.tab-content'); tabs.forEach(tab => tab.classList.remove('active')); - + const tabButtons = document.querySelectorAll('.tab'); tabButtons.forEach(btn => btn.classList.remove('active')); - + document.getElementById(tabName).classList.add('active'); event.target.classList.add('active'); } @@ -63,9 +64,9 @@ function saveWordBank() { function displayWordBank() { const wordList = document.getElementById('wordList'); const wordCount = document.getElementById('wordCount'); - + wordCount.textContent = wordBank.length; - + if (wordBank.length === 0) { wordList.innerHTML = `
@@ -75,7 +76,7 @@ function displayWordBank() { `; return; } - + wordList.innerHTML = ''; wordBank.forEach((word, index) => { const wordItem = document.createElement('div'); @@ -120,7 +121,7 @@ function deleteWord(index) { function generateKeyboard() { const keyboard = document.getElementById('keyboard'); const letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; - + keyboard.innerHTML = ''; for (let letter of letters) { const button = document.createElement('button'); @@ -131,35 +132,66 @@ function generateKeyboard() { keyboard.appendChild(button); } } - function startGame() { - const p1Name = document.getElementById('player1Name').value.trim(); - const p2Name = document.getElementById('player2Name').value.trim(); - - gameState.player1.name = p1Name || 'Player 1'; - gameState.player2.name = p2Name || 'Player 2'; - - document.getElementById('player1Display').textContent = gameState.player1.name; - document.getElementById('player2Display').textContent = gameState.player2.name; - + const p1Input = document.getElementById('player1Name'); + const p2Input = document.getElementById('player2Name'); + + const p1Name = p1Input.value.trim(); + const p2Name = p2Input.value.trim(); + + const nameRegex = /^[A-Za-z]{2,}$/; // letters only, min 2 chars + + // Validate Player 1 + if (!nameRegex.test(p1Name)) { + alert('Player 1 name must contain only letters and be at least 2 characters long.'); + p1Input.focus(); + return; + } + + // Validate Player 2 + if (!nameRegex.test(p2Name)) { + alert('Player 2 name must contain only letters and be at least 2 characters long.'); + p2Input.focus(); + return; + } + + // If valid, set names + gameState.player1.name = p1Name; + gameState.player2.name = p2Name; + + document.getElementById('player1Display').textContent = p1Name; + document.getElementById('player2Display').textContent = p2Name; + document.getElementById('gameArea').style.display = 'block'; - + nextRound(); } + function nextRound() { if (wordBank.length === 0) { alert('No words in the word bank! Add some words first.'); return; } - + gameState.guessedLetters = []; gameState.wrongGuesses = 0; gameState.gameActive = true; - - const randomIndex = Math.floor(Math.random() * wordBank.length); - gameState.currentWord = wordBank[randomIndex]; - + + let newWord; + + if (wordBank.length === 1) { + newWord = wordBank[0]; // Only one word available + } else { + do { + const randomIndex = Math.floor(Math.random() * wordBank.length); + newWord = wordBank[randomIndex]; + } while (newWord === gameState.lastWord); + } + + gameState.currentWord = newWord; + gameState.lastWord = newWord; + document.getElementById('gameStatus').classList.remove('show'); document.getElementById('gameStatus').className = 'game-status'; resetHangman(); @@ -172,18 +204,18 @@ function nextRound() { function guessLetter(letter) { if (!gameState.gameActive) return; - + if (gameState.guessedLetters.includes(letter)) { return; } - + gameState.guessedLetters.push(letter); - + if (!gameState.currentWord.includes(letter)) { gameState.wrongGuesses++; updateHangman(); } - + updateWordDisplay(); updateWrongLetters(); updateLives(); @@ -193,7 +225,7 @@ function guessLetter(letter) { function updateWordDisplay() { const display = document.getElementById('wordDisplay'); let displayText = ''; - + for (let letter of gameState.currentWord) { if (gameState.guessedLetters.includes(letter)) { displayText += letter + ' '; @@ -201,16 +233,16 @@ function updateWordDisplay() { displayText += '_ '; } } - + display.textContent = displayText.trim(); } function updateWrongLetters() { const wrongLettersDiv = document.getElementById('wrongLetters'); - const wrong = gameState.guessedLetters.filter(letter => + const wrong = gameState.guessedLetters.filter(letter => !gameState.currentWord.includes(letter) ); - + if (wrong.length === 0) { wrongLettersDiv.textContent = 'None yet'; } else { @@ -219,16 +251,16 @@ function updateWrongLetters() { } function updateLives() { - const livesLeft = gameState.maxWrong - gameState.wrongGuesses + 1; + const livesLeft = gameState.maxWrong - gameState.wrongGuesses; document.getElementById('livesLeft').textContent = livesLeft; } function updateHangman() { const parts = ['head', 'body', 'leftArm', 'rightArm', 'leftLeg', 'rightLeg']; - + const wrongOrder = ['head', 'leftArm', 'rightArm', 'body', 'leftLeg', 'rightLeg']; const partIndex = gameState.wrongGuesses - 1; - + if (partIndex >= 0 && partIndex < wrongOrder.length) { const partToShow = wrongOrder[partIndex]; document.getElementById(partToShow).style.display = 'block'; @@ -255,7 +287,7 @@ function resetKeyboard() { function updateCurrentPlayer() { const player1Div = document.getElementById('player1Score'); const player2Div = document.getElementById('player2Score'); - + if (gameState.currentPlayer === 1) { player1Div.classList.add('active'); player2Div.classList.remove('active'); @@ -269,12 +301,12 @@ function checkGameStatus() { const allLettersGuessed = [...gameState.currentWord].every(letter => gameState.guessedLetters.includes(letter) ); - + if (allLettersGuessed) { gameWon(); return; } - + if (gameState.wrongGuesses >= gameState.maxWrong) { gameLost(); return; @@ -283,7 +315,7 @@ function checkGameStatus() { function gameWon() { gameState.gameActive = false; - + if (gameState.currentPlayer === 1) { gameState.player2.score += 10; document.getElementById('score2').textContent = gameState.player2.score; @@ -291,28 +323,28 @@ function gameWon() { gameState.player1.score += 10; document.getElementById('score1').textContent = gameState.player1.score; } - + const statusDiv = document.getElementById('gameStatus'); const statusMsg = document.getElementById('statusMessage'); - - const winnerName = gameState.currentPlayer === 1 ? + + const winnerName = gameState.currentPlayer === 1 ? gameState.player2.name : gameState.player1.name; - + statusMsg.textContent = `🎉 ${winnerName} won! The word was: ${gameState.currentWord}`; statusDiv.classList.add('show', 'winner'); } function gameLost() { gameState.gameActive = false; - + const statusDiv = document.getElementById('gameStatus'); const statusMsg = document.getElementById('statusMessage'); - - const currentPlayerName = gameState.currentPlayer === 1 ? + + const currentPlayerName = gameState.currentPlayer === 1 ? gameState.player1.name : gameState.player2.name; - + statusMsg.textContent = `😢 ${currentPlayerName} lost! The word was: ${gameState.currentWord}`; statusDiv.classList.add('show', 'loser'); - + gameState.currentPlayer = gameState.currentPlayer === 1 ? 2 : 1; }