1- // TODO: Generate a random number
2- // TODO: Handle user guess input
3- // TODO: Compare guess to target number
4- // TODO: Provide feedback (too high, too low, correct)
5- // TODO: Track number of attempts
6- // TODO: Restart game functionality
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+ }
77
88function initNumberGuessingGame ( ) {
9- // TODO: Generate random number
10- // TODO: Handle user input and feedback
11- // TODO: Track attempts
12- // TODO: Restart game
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' ) ;
15+
16+ const MIN = 1 ;
17+ const MAX = 100 ;
18+
19+ let targetNumber = generateRandomInteger ( MIN , MAX ) ;
20+ let attempts = 0 ;
21+ let gameOver = false ;
22+
23+ function setFeedback ( message , type ) {
24+ feedback . textContent = message ;
25+ feedback . dataset . type = type || '' ;
26+ }
27+
28+ function setGameOver ( over ) {
29+ gameOver = over ;
30+ input . disabled = over ;
31+ guessBtn . disabled = over ;
32+ if ( over ) {
33+ input . blur ( ) ;
34+ }
35+ }
36+
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+ }
45+
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 ;
52+ }
53+ attempts += 1 ;
54+ attemptCount . textContent = String ( attempts ) ;
55+
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' ) ;
63+ } else {
64+ setFeedback ( 'Too high. Try a lower number.' , 'high' ) ;
65+ }
66+ input . select ( ) ;
67+ }
68+
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+ }
78+
79+ guessBtn . addEventListener ( 'click' , handleGuess ) ;
80+ input . addEventListener ( 'keydown' , function onKeyDown ( event ) {
81+ if ( event . key === 'Enter' ) {
82+ handleGuess ( ) ;
83+ }
84+ } ) ;
85+ restartBtn . addEventListener ( 'click' , restartGame ) ;
86+
87+ // Init state
88+ attemptsText . hidden = false ;
89+ setFeedback ( '' , '' ) ;
1390}
1491
1592window . addEventListener ( 'DOMContentLoaded' , initNumberGuessingGame ) ;
0 commit comments