PROGRAM GuessANumber; FUNCTION IsAnInt(input : STRING) : BOOLEAN; VAR output,code:INTEGER; BEGIN Val(input, output, code); IF code = 0 THEN RETURN TRUE ELSE RETURN FALSE; END; FUNCTION GetNumericInput(prompt : STRING) : INTEGER; VAR output,code:INTEGER; ans:STRING; BEGIN WHILE(TRUE) DO BEGIN writeln(prompt); readln(ans); IF IsAnInt(ans) THEN BEGIN Val(ans, output, code); RETURN output; END ELSE writeln('Your entry was not a number.'); END; END; FUNCTION GetInput(question : STRING) : STRING; VAR ans:STRING; BEGIN WHILE(TRUE) DO BEGIN writeln(question); readln(ans); IF ans = '' THEN writeln('Your entry seems empty.') ELSE RETURN ans; END; END; FUNCTION AskToPlayAgain : BOOLEAN; VAR ans:STRING; i:INTEGER; BEGIN WHILE(TRUE) DO BEGIN ans := GetInput('Would you like to play again? ("YES" or "NO")'); FOR i := 1 TO Length(ans) DO ans[i] := UpCase(ans[i]); IF ans = 'YES' THEN RETURN TRUE; IF ans = 'Y' THEN RETURN TRUE; IF ans = 'NO' THEN RETURN FALSE; IF ans = 'N' THEN RETURN FALSE; writeln('Please respond with "YES" or "NO"'); END; END; VAR Running,GotMaxNumber,GameOver:BOOLEAN; MaxNumber,Answer,Tries,Guess:INTEGER; strMaxNumber:STRING; BEGIN Randomize(); Running := TRUE; writeln('*** GUESS A NUMBER : Pascal ***'); WHILE(Running = TRUE) DO BEGIN WHILE(GotMaxNumber = FALSE) DO BEGIN MaxNumber := GetNumericInput('Please enter the maximum number you wish to use'); IF(MaxNumber > 0) THEN BEGIN GotMaxNumber := TRUE; Answer := Random(MaxNumber) + 1; GameOver := FALSE; Tries := 0; writeln('Ok, I am thinking of a number between 1 and ', MaxNumber, '.'); LEAVE; END ELSE writeln('The maximum number should be greater than zero'); END; Str(MaxNumber, strMaxNumber); Guess:=GetNumericInput('Guess a number between 1 and ' + strMaxNumber + ':'); Tries := Tries + 1; IF(Guess > Answer) THEN writeln('Too high.'); IF(Guess < Answer) THEN writeln('Too low'); IF(Guess = Answer) THEN BEGIN IF(Tries = 1) THEN writeln('You got it in 1 try!') ELSE writeln('You got it in ', Tries, ' tries!'); GameOver := TRUE; END; IF(GameOver) THEN BEGIN Running := AskToPlayAgain(); IF(Running) THEN GotMaxNumber := FALSE; END; END; writeln('Thanks for playing!'); writeln('*** GAME OVER ***'); END.