1- // Utility to generate a random integer in [min, max]
2- function generateRandomInteger ( min , max ) {
3- const minCeil = Math . ceil ( min ) ;
4- const maxFloor = Math . floor ( max ) ;
5- return Math . floor ( Math . random ( ) * ( maxFloor - minCeil + 1 ) ) + minCeil ;
6- }
1+ // Get references to the HTML elements
2+ const guessInput = document . getElementById ( 'guessInput' ) ;
3+ const guessButton = document . getElementById ( 'guessButton' ) ;
4+ const resetButton = document . getElementById ( 'resetButton' ) ;
5+ const message = document . getElementById ( 'message' ) ;
6+ const attemptsDisplay = document . getElementById ( 'attempts' ) ;
77
8- function initNumberGuessingGame ( ) {
9- const input = document . getElementById ( 'guess-input' ) ;
10- const guessBtn = document . getElementById ( 'guess-btn' ) ;
11- const feedback = document . getElementById ( 'feedback' ) ;
12- const attemptsText = document . getElementById ( 'attempts' ) ;
13- const attemptCount = document . getElementById ( 'attempt-count' ) ;
14- const restartBtn = document . getElementById ( 'restart-btn' ) ;
8+ // Game variables
9+ let randomNumber ;
10+ let attempts ;
11+ const MIN_NUM = 1 ;
12+ const MAX_NUM = 100 ;
1513
16- const MIN = 1 ;
17- const MAX = 100 ;
14+ // Function to start a new game or reset the current one
15+ function newGame ( ) {
16+ // 1. Generate a new random number
17+ randomNumber = Math . floor ( Math . random ( ) * ( MAX_NUM - MIN_NUM + 1 ) ) + MIN_NUM ;
18+ console . log ( `The secret number is: ${ randomNumber } ` ) ; // For testing purposes
1819
19- let targetNumber = generateRandomInteger ( MIN , MAX ) ;
20- let attempts = 0 ;
21- let gameOver = false ;
20+ // 2. Reset the number of attempts
21+ attempts = 0 ;
22+ attemptsDisplay . textContent = `Attempts: ${ attempts } ` ;
2223
23- function setFeedback ( message , type ) {
24- feedback . textContent = message ;
25- feedback . dataset . type = type || '' ;
26- }
24+ // 3. Clear messages and input field
25+ message . textContent = '' ;
26+ guessInput . value = '' ;
2727
28- function setGameOver ( over ) {
29- gameOver = over ;
30- input . disabled = over ;
31- guessBtn . disabled = over ;
32- if ( over ) {
33- input . blur ( ) ;
34- }
35- }
28+ // 4. Re-enable input and guess button, hide reset button
29+ guessInput . disabled = false ;
30+ guessButton . disabled = false ;
31+ resetButton . style . display = 'none' ; // Hide the reset button
32+ message . style . color = '#333' ; // Default text color
33+ }
3634
37- function validateGuess ( value ) {
38- if ( value === '' ) return { ok : false , msg : 'Please enter a number.' } ;
39- const num = Number ( value ) ;
40- if ( ! Number . isFinite ( num ) ) return { ok : false , msg : 'That is not a valid number.' } ;
41- if ( ! Number . isInteger ( num ) ) return { ok : false , msg : 'Please enter a whole number.' } ;
42- if ( num < MIN || num > MAX ) return { ok : false , msg : `Enter a number between ${ MIN } and ${ MAX } .` } ;
43- return { ok : true , value : num } ;
44- }
35+ // Function to handle the user's guess
36+ function checkGuess ( ) {
37+ const userGuess = parseInt ( guessInput . value ) ;
4538
46- function handleGuess ( ) {
47- if ( gameOver ) return ;
48- const { ok, msg, value } = validateGuess ( input . value . trim ( ) ) ;
49- if ( ! ok ) {
50- setFeedback ( msg , 'error' ) ;
51- return ;
39+ // Validate the input
40+ if ( isNaN ( userGuess ) || userGuess < MIN_NUM || userGuess > MAX_NUM ) {
41+ message . textContent = `Please enter a valid number between ${ MIN_NUM } and ${ MAX_NUM } .` ;
42+ message . style . color = 'orange' ; // Will be mapped to var(--warning-color) by CSS
43+ return ;
5244 }
53- attempts += 1 ;
54- attemptCount . textContent = String ( attempts ) ;
5545
56- if ( value === targetNumber ) {
57- setFeedback ( `Correct! The number was ${ targetNumber } .` , 'success' ) ;
58- setGameOver ( true ) ;
59- return ;
60- }
61- if ( value < targetNumber ) {
62- setFeedback ( 'Too low. Try a higher number.' , 'low' ) ;
46+ // Increment attempts
47+ attempts ++ ;
48+ attemptsDisplay . textContent = `Attempts: ${ attempts } ` ;
49+
50+ // Compare the guess and provide feedback
51+ if ( userGuess < randomNumber ) {
52+ message . textContent = 'Too Low! Try again.' ;
53+ message . style . color = '#3498db' ; // Will be mapped by CSS
54+ } else if ( userGuess > randomNumber ) {
55+ message . textContent = 'Too High! Try again.' ;
56+ message . style . color = '#e74c3c' ; // Will be mapped to var(--error-color) by CSS
6357 } else {
64- setFeedback ( 'Too high. Try a lower number.' , 'high' ) ;
58+ message . textContent = `Correct! You guessed the number ${ randomNumber } in ${ attempts } attempts! 🎉` ;
59+ message . style . color = '#2ecc71' ; // Will be mapped to var(--success-color) by CSS
60+ endGame ( ) ;
6561 }
66- input . select ( ) ;
67- }
6862
69- function restartGame ( ) {
70- targetNumber = generateRandomInteger ( MIN , MAX ) ;
71- attempts = 0 ;
72- attemptCount . textContent = '0' ;
73- setFeedback ( '' , '' ) ;
74- input . value = '' ;
75- setGameOver ( false ) ;
76- input . focus ( ) ;
77- }
63+ // Clear the input for the next guess
64+ guessInput . value = '' ;
65+ guessInput . focus ( ) ;
66+ }
67+
68+ // Function to end the game when the number is guessed correctly
69+ function endGame ( ) {
70+ guessInput . disabled = true ;
71+ guessButton . disabled = true ;
72+ resetButton . style . display = 'inline-block' ; // Show the reset button
73+ }
74+
75+ // Event Listeners
76+ guessButton . addEventListener ( 'click' , checkGuess ) ;
77+ resetButton . addEventListener ( 'click' , newGame ) ;
7878
79- guessBtn . addEventListener ( 'click' , handleGuess ) ;
80- input . addEventListener ( 'keydown' , function onKeyDown ( event ) {
81- if ( event . key === 'Enter' ) {
82- handleGuess ( ) ;
79+ // Allow pressing "Enter" to submit a guess
80+ guessInput . addEventListener ( 'keydown' , ( event ) => {
81+ if ( event . key === 'Enter' && ! guessButton . disabled ) { // Ensure button is not disabled
82+ checkGuess ( ) ;
8383 }
84- } ) ;
85- restartBtn . addEventListener ( 'click' , restartGame ) ;
84+ } ) ;
8685
87- // Init state
88- attemptsText . hidden = false ;
89- setFeedback ( '' , '' ) ;
90- }
9186
92- window . addEventListener ( 'DOMContentLoaded' , initNumberGuessingGame ) ;
87+ // Initialize the game when the page loads
88+ newGame ( ) ;
0 commit comments