diff --git a/src/components/GuessingGame.tsx b/src/components/GuessingGame.tsx index c657875..cdaeffc 100644 --- a/src/components/GuessingGame.tsx +++ b/src/components/GuessingGame.tsx @@ -34,6 +34,7 @@ const GuessingGame: React.FC = ({ showSocialShare = true }) = const [userGuess, setUserGuess] = useState(''); const [guesses, setGuesses] = useState([]); const [feedback, setFeedback] = useState(''); + const [validNumbers, setValidNumbers] = useState>(new Set()); // Computer asking mode const [possibleNumbers, setPossibleNumbers] = useState([]); @@ -116,6 +117,44 @@ const GuessingGame: React.FC = ({ showSocialShare = true }) = }; }, [possibleNumbers]); + // Calculate valid numbers based on guesses and feedback + const updateValidNumbers = useCallback((guesses: number[], secretNumber: number | null) => { + if (guesses.length === 0 || !secretNumber) { + const allNumbers = new Set(Array.from({ length: maxRange }, (_, i) => i + 1)); + setValidNumbers(allNumbers); + return; + } + + const valid = new Set(); + for (let num = 1; num <= maxRange; num++) { + let isValid = true; + + for (const guess of guesses) { + if (guess === secretNumber) break; // Game would be over + + if (guess < secretNumber) { + // Guess was too low, so number must be higher than guess + if (num <= guess) { + isValid = false; + break; + } + } else { + // Guess was too high, so number must be lower than guess + if (num >= guess) { + isValid = false; + break; + } + } + } + + if (isValid) { + valid.add(num); + } + } + + setValidNumbers(valid); + }, [maxRange]); + // Start new game const startGame = () => { if (gameMode === 'user-guesses') { @@ -123,6 +162,8 @@ const GuessingGame: React.FC = ({ showSocialShare = true }) = setSecretNumber(secret); setGuesses([]); setFeedback(''); + const allNumbers = new Set(Array.from({ length: maxRange }, (_, i) => i + 1)); + setValidNumbers(allNumbers); } else { const numbers = Array.from({ length: maxRange }, (_, i) => i + 1); setPossibleNumbers(numbers); @@ -160,9 +201,9 @@ const GuessingGame: React.FC = ({ showSocialShare = true }) = setCurrentQuestion(question); }, [computerStrategy, possibleNumbers, generateRandomQuestion, generateLinearQuestion, generateBinaryQuestion]); - // Handle user's guess - const handleGuess = () => { - const guess = parseInt(userGuess); + // Handle user's guess (both input and number click) + const handleGuess = (guessValue?: number) => { + const guess = guessValue || parseInt(userGuess); if (isNaN(guess) || guess < 1 || guess > maxRange) { setFeedback('Please enter a valid number within the range.'); return; @@ -174,10 +215,14 @@ const GuessingGame: React.FC = ({ showSocialShare = true }) = if (guess === secretNumber) { setGameState('won'); setFeedback(`Congratulations! You found the number in ${newGuesses.length} guesses!`); - } else if (guess < secretNumber!) { - setFeedback('Too low! Try a higher number.'); } else { - setFeedback('Too high! Try a lower number.'); + if (guess < secretNumber!) { + setFeedback('Too low! Try a higher number.'); + } else { + setFeedback('Too high! Try a lower number.'); + } + // Update valid numbers based on new feedback + updateValidNumbers(newGuesses, secretNumber); } setUserGuess(''); @@ -388,17 +433,46 @@ const GuessingGame: React.FC = ({ showSocialShare = true }) = )} + {/* Number Grid Display */} +
+

Click a number or type your guess:

+
+ {Array.from({ length: maxRange }, (_, i) => i + 1).map(num => { + const isValid = validNumbers.has(num); + const isGuessed = guesses.includes(num); + + return ( + + ); + })} +
+
+
setUserGuess(e.target.value)} onKeyDown={(e) => e.key === 'Enter' && handleGuess()} min={1} max={maxRange} /> -