PROGRAM BAGELS; TYPE INT_ARRAY = ARRAY [1..3] OF INTEGER; PINT_ARRAY = ^INT_ARRAY; FUNCTION ASK_QUESTION(PROMPT:STRING):STRING; VAR ANS:STRING; GOT_ANS:BOOLEAN; I:INTEGER; BEGIN GOT_ANS := FALSE; WHILE(GOT_ANS = FALSE) DO BEGIN WRITELN(PROMPT,'? '); READLN(ANS); IF ANS = '' THEN BEGIN WRITELN('PLEASE ANSWER THE QUESTION.'); END ELSE BEGIN FOR I := 1 TO LENGTH(ANS) DO ANS[I] := UPCASE(ANS[I]); GOT_ANS := TRUE; END; END; ASK_QUESTION := ANS END; FUNCTION IS_AN_INT(INPUT:STRING):BOOLEAN; VAR VALUE,CODE:INTEGER; BEGIN VAL(INPUT,VALUE,CODE); IS_AN_INT := CODE = 0; END; FUNCTION GET_INT_INPUT(PROMPT:STRING):INTEGER; VAR ANS:STRING; GOT_ANS:BOOLEAN; VALUE,CODE:INTEGER; BEGIN GOT_ANS := FALSE; WHILE(GOT_ANS = FALSE) DO BEGIN WRITELN(PROMPT, ''); READLN(ANS); IF IS_AN_INT(ANS) THEN BEGIN VAL(ANS,VALUE,CODE); GOT_ANS := TRUE; END ELSE WRITELN('YOU DID NOT ENTER AN INTEGER.'); END; GET_INT_INPUT := VALUE; END; FUNCTION ASK_TO_PLAY_AGAIN:BOOLEAN; VAR GOT_ANS,ANSWER:BOOLEAN; ANS:STRING; BEGIN GOT_ANS := FALSE; WHILE(GOT_ANS = FALSE) DO BEGIN ANS := ASK_QUESTION('DO YOU WANT TO PLAY AGAIN'); IF ANS = 'YES' THEN BEGIN GOT_ANS := TRUE; ANSWER := TRUE; END ELSE IF ANS = 'Y' THEN BEGIN GOT_ANS := TRUE; ANSWER := TRUE; END ELSE IF ANS = 'NO' THEN BEGIN GOT_ANS := TRUE; ANSWER := FALSE; END ELSE IF ANS = 'N' THEN BEGIN GOT_ANS := TRUE; ANSWER := FALSE; END ELSE WRITELN('PLEASE ANSWER "YES" OR "NO".'); END; ASK_TO_PLAY_AGAIN := ANSWER; END; FUNCTION ASK_TO_SEE_THE_RULES:BOOLEAN; VAR GOT_ANS,ANSWER:BOOLEAN; ANS:STRING; BEGIN GOT_ANS := FALSE; WHILE(GOT_ANS = FALSE) DO BEGIN ANS := ASK_QUESTION('DO YOU WANT TO SEE THE RULES'); IF ANS = 'YES' THEN BEGIN GOT_ANS := TRUE; ANSWER := TRUE; END ELSE IF ANS = 'Y' THEN BEGIN GOT_ANS := TRUE; ANSWER := TRUE; END ELSE IF ANS = 'NO' THEN BEGIN GOT_ANS := TRUE; ANSWER := FALSE; END ELSE IF ANS = 'N' THEN BEGIN GOT_ANS := TRUE; ANSWER := FALSE; END ELSE WRITELN('PLEASE ANSWER "YES" OR "NO".'); END; ASK_TO_SEE_THE_RULES := ANSWER; END; FUNCTION GENERATE_RANDOM_NUMBER(MINIMUM:INTEGER;MAXIMUM:INTEGER;SHOW:BOOLEAN):INTEGER; VAR VALUE:INTEGER; BEGIN RANDSEED := RANDOM(12345) + 5432; VALUE := RANDOM(MAXIMUM) + MINIMUM; IF SHOW = TRUE THEN WRITELN(VALUE); GENERATE_RANDOM_NUMBER := VALUE; END; PROCEDURE DISPLAY_RULES; BEGIN WRITELN('I WILL THINK OF A THREE-DIGIT NUMBER. YOU WILL TRY TO'); WRITELN('GUESS MY NUMBER AND I WILL GIVE YOU CLUES AS FOLLOWS:'); WRITELN(' PICO - ONE DIGIT CORRECT BUT IN THE WRONG POSITION'); WRITELN(' FERMI - ONE DIGIT CORRECT AND IN THE RIGHT POSITION'); WRITELN(' BAGLES - NO DIGITS ARE CORRECT'); WRITELN(' '); WRITELN('YOU GET TWENTY TRIES BEFORE YOU LOSE.'); WRITELN(' '); END; FUNCTION ASK_FOR_GUESS(ATTEMPT:INTEGER):INTEGER; VAR GOT_GUESS:BOOLEAN; RET_VAL:INTEGER; PROMPT:STRING; BEGIN STR(ATTEMPT,PROMPT); GOT_GUESS := FALSE; WHILE(GOT_GUESS = FALSE) DO BEGIN RET_VAL := GET_INT_INPUT('GUESS #' + PROMPT); IF RET_VAL < 0 THEN WRITELN('PLEASE GUESS A NON-NEGATIVE NUMBER.') ELSE IF (RET_VAL < 100) OR (RET_VAL > 999) THEN WRITELN('PLEASE GUESS A NUMBER BETWEEN 100 AND 999.') ELSE GOT_GUESS := TRUE; END; ASK_FOR_GUESS := RET_VAL; END; PROCEDURE DISPLAY_GAME_OVER(NUMBER:INTEGER); BEGIN WRITELN('OH WELL, THAT"S TWENTY GUESSES.'); WRITELN('MY NUMBER WAS ',NUMBER,'.'); END; FUNCTION MAKE_ARRAY_FROM_INTEGER(VAL_IN:INTEGER):PINT_ARRAY; VAR RET_ARRAY:PINT_ARRAY; BEGIN RET_ARRAY^[1] := TRUNC(VAL_IN / 100); RET_ARRAY^[2] := TRUNC((VAL_IN - (RET_ARRAY^[1] * 100)) / 10); RET_ARRAY^[3] := (VAL_IN - (RET_ARRAY^[1] * 100) - (RET_ARRAY^[2] * 10)); MAKE_ARRAY_FROM_INTEGER := RET_ARRAY; END; FUNCTION MAKE_INTEGER_FROM_ARRAY(ARRAY_IN:INT_ARRAY):INTEGER; VAR RET_VAL:INTEGER; BEGIN RET_VAL := (ARRAY_IN[1] * 100) + (ARRAY_IN[2] * 10) + ARRAY_IN[3]; MAKE_INTEGER_FROM_ARRAY := RET_VAL; END; FUNCTION CREATE_THE_NUMBER:PINT_ARRAY; VAR DIGITS:PINT_ARRAY; GOT_DIGIT:BOOLEAN; BEGIN DIGITS^[1] := GENERATE_RANDOM_NUMBER(1, 9, FALSE); GOT_DIGIT := FALSE; WHILE(GOT_DIGIT = FALSE) DO BEGIN DIGITS^[2] := GENERATE_RANDOM_NUMBER(0, 9, FALSE); GOT_DIGIT := (DIGITS^[2] <> DIGITS^[1]); END; GOT_DIGIT := FALSE; WHILE(GOT_DIGIT = FALSE) DO BEGIN DIGITS^[3] := GENERATE_RANDOM_NUMBER(0, 9, FALSE); GOT_DIGIT := ((DIGITS^[3] <> DIGITS^[1]) AND (DIGITS^[3] <> DIGITS^[2])); END; CREATE_THE_NUMBER := DIGITS; END; FUNCTION CHECK_GUESS(GUESS:INTEGER;DIGITS:INT_ARRAY):BOOLEAN; VAR TEMP:PINT_ARRAY; VALS:INT_ARRAY; VALUE:INTEGER; BEGIN TEMP := MAKE_ARRAY_FROM_INTEGER(GUESS); VALS[1] := 0; VALS[2] := 0; VALS[3] := 0; IF TEMP^[1] = DIGITS[1] THEN VALS[1] := 1; IF TEMP^[2] = DIGITS[2] THEN VALS[2] := 1; IF TEMP^[3] = DIGITS[3] THEN VALS[3] := 1; VALUE := MAKE_INTEGER_FROM_ARRAY(VALS); IF VALUE = 111 THEN CHECK_GUESS := TRUE ELSE BEGIN IF VALS[1] = 0 THEN IF (TEMP^[1] = DIGITS[2]) OR (TEMP^[1] = DIGITS[3]) THEN VALS[1] := 2; IF VALS[2] = 0 THEN IF (TEMP^[2] = DIGITS[1]) OR (TEMP^[2] = DIGITS[3]) THEN VALS[2] := 2; IF VALS[3] = 0 THEN IF (TEMP^[3] = DIGITS[1]) OR (TEMP^[3] = DIGITS[2]) THEN VALS[3] := 2; VALUE := MAKE_INTEGER_FROM_ARRAY(VALS); IF VALUE = 0 THEN WRITELN('BAGELS') ELSE BEGIN IF VALS[1] = 1 THEN WRITE('FERMI '); IF VALS[1] = 2 THEN WRITE('PICO '); IF VALS[2] = 1 THEN WRITE('FERMI '); IF VALS[2] = 2 THEN WRITE('PICO '); IF VALS[3] = 1 THEN WRITE('FERMI'); IF VALS[3] = 2 THEN WRITE('PICO'); WRITELN(' '); END; CHECK_GUESS := FALSE; END; END; VAR RUNNING,GAME_OVER:BOOLEAN; SCORE,GUESS,ATTEMPT,NUMBER:INTEGER; DIGITS:INT_ARRAY; ANS:STRING; BEGIN WRITELN('*** BAGELS : PASCAL ***'); RUNNING := TRUE; IF ASK_TO_SEE_THE_RULES = TRUE THEN DISPLAY_RULES; WHILE(RUNNING = TRUE) DO BEGIN GAME_OVER := FALSE; ATTEMPT := 1; DIGITS := CREATE_THE_NUMBER^; WRITELN('OK, I HAVE A NUMBER IN MIND.'); WHILE(GAME_OVER = FALSE) DO BEGIN GUESS := ASK_FOR_GUESS(ATTEMPT); IF CHECK_GUESS(GUESS, DIGITS) = TRUE THEN BEGIN WRITELN('YOU GOT IT!!!'); SCORE := SCORE + 1; GAME_OVER := TRUE; END ELSE BEGIN ATTEMPT := ATTEMPT + 1; IF ATTEMPT > 20 THEN BEGIN NUMBER := MAKE_INTEGER_FROM_ARRAY(DIGITS); DISPLAY_GAME_OVER(NUMBER); GAME_OVER := TRUE; END; END; END; WRITELN('*** GAME OVER ***'); RUNNING := ASK_TO_PLAY_AGAIN; END; WRITELN('A ',SCORE,' POINT BAGELS BUFF!'); WRITELN('HOPE YOU HAD FUN. BYE!'); READLN(ANS); END.