PROGRAM ACEY_DUCEY; FUNCTION ASK_QUESTION(PROMPT:STRING):STRING; VAR ANS:STRING; GOTANS:BOOLEAN; I:INTEGER; BEGIN GOTANS := FALSE; WHILE(GOTANS = FALSE) DO BEGIN WRITELN(PROMPT,'? '); READLN(ANS); IF ANS = '' THEN WRITELN('PLEASE ANSWER THE QUESTION.') ELSE BEGIN FOR I := 1 TO LENGTH(ANS) DO ANS[I] := UPCASE(ANS[I]); GOTANS := 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; GOTANS:BOOLEAN; VALUE,CODE:INTEGER; BEGIN GOTANS := FALSE; WHILE(GOTANS = FALSE) DO BEGIN WRITELN(PROMPT, ' '); READLN(ANS); IF IS_AN_INT(ANS) THEN BEGIN VAL(ANS, VALUE, CODE); GOTANS := TRUE; END ELSE WRITELN('YOU DID NOT ENTER AN INTEGER.'); END; GET_INT_INPUT := VALUE; END; FUNCTION ASK_FOR_BET(WALLET:INTEGER):INTEGER; VAR GOTBET:BOOLEAN; BET:INTEGER; BEGIN GOTBET := FALSE; WHILE(GOTBET = FALSE) DO BEGIN BET := GET_INT_INPUT('WHAT IS YOUR BET?'); IF BET < 0 THEN WRITELN('PLEASE BET A NON-NEGATIVE AMOUNT.') ELSE IF BET > WALLET THEN BEGIN WRITELN('SORRY MY FRIEND, BUT YOU BET TOO MUCH.'); WRITELN('YOU HAVE ONLY ',WALLET,' DOLLARS TO BET.'); END ELSE GOTBET := TRUE; END; ASK_FOR_BET := BET; END; FUNCTION ASK_TO_PLAY_AGAIN:BOOLEAN; VAR GOTANS:BOOLEAN; ANSWER:BOOLEAN; ANS:STRING; BEGIN GOTANS := FALSE; WHILE(GOTANS = FALSE) DO BEGIN ANS := ASK_QUESTION('DO YOU WANT TO PLAY AGAIN'); IF ANS = 'YES' THEN BEGIN GOTANS := TRUE; ANSWER := TRUE; END ELSE IF ANS = 'Y' THEN BEGIN GOTANS := TRUE; ANSWER := TRUE; END ELSE IF ANS = 'NO' THEN BEGIN GOTANS := TRUE; ANSWER := FALSE; END ELSE IF ANS = 'N' THEN BEGIN GOTANS := 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 GOTANS:BOOLEAN; ANSWER:BOOLEAN; ANS:STRING; BEGIN GOTANS := FALSE; WHILE(GOTANS = FALSE) DO BEGIN ANS := ASK_QUESTION('DO YOU WANT TO SEE THE RULES'); IF ANS = 'YES' THEN BEGIN GOTANS := TRUE; ANSWER := TRUE; END ELSE IF ANS = 'Y' THEN BEGIN GOTANS := TRUE; ANSWER := TRUE; END ELSE IF ANS = 'NO' THEN BEGIN GOTANS := TRUE; ANSWER := FALSE; END ELSE IF ANS = 'N' THEN BEGIN GOTANS := TRUE; ANSWER := FALSE; END ELSE WRITELN('PLEASE ANSWER "YES" OR "NO"'); END; ASK_TO_SEE_THE_RULES := ANSWER; END; PROCEDURE DISPLAY_CARD(CARD:INTEGER); BEGIN IF CARD = 11 THEN WRITELN('JACK') ELSE IF CARD = 12 THEN WRITELN('QUEEN') ELSE IF CARD = 13 THEN WRITELN('KING') ELSE IF CARD = 14 THEN WRITELN('ACE') ELSE WRITELN(CARD) END; PROCEDURE DISPLAY_RULES; BEGIN WRITELN('ACEY DUCEY IS PLAYED IN THE FOLLOWING MANNER:'); WRITELN('THE DEALER (COMPUTER) DEALS TWO CARDS FACE UP'); WRITELN('YOU HAVE THE OPTION TO BET OR NOT BET DEPENDING'); WRITELN('ON WHETHER OR NOT YOU FEEL THE NEXT CARD WILL'); WRITELN('HAVE A VALUE BETWEEN THE FIRST TWO.'); WRITELN(' '); WRITELN('IF YOU DO NOT WANT TO BET, INPUT A 0 (ZERO).'); END; FUNCTION GENERATE_RANDOM_NUMBER(MINIMUM:INTEGER;MAXIMUM:INTEGER;SHOW:BOOLEAN):INTEGER; VAR VALUE:INTEGER; BEGIN VALUE := RANDOM(MAXIMUM) + MINIMUM; IF SHOW = TRUE THEN WRITELN(VALUE); GENERATE_RANDOM_NUMBER := VALUE; END; FUNCTION SELECT_CARD(CARDS: ARRAY OF INTEGER):INTEGER; VAR GOTCARD:BOOLEAN; CARD:INTEGER; BEGIN GOTCARD := FALSE; WHILE(GOTCARD = FALSE) DO BEGIN CARD := GENERATE_RANDOM_NUMBER(2, 14, FALSE); IF (CARD <> CARDS[0]) AND (CARD <> CARDS[1]) AND (CARD <> CARDS[2]) THEN BEGIN DISPLAY_CARD(CARD); GOTCARD := TRUE; END END; SELECT_CARD := CARD; END; VAR RUNNING:BOOLEAN; GAMEOVER:BOOLEAN; WALLET:INTEGER; CARDS:ARRAY [1..3] OF INTEGER; BET:INTEGER; BEGIN WRITELN('*** ACEY DUCEY : PASCAL ***'); RANDOMIZE; RUNNING := TRUE; IF ASK_TO_SEE_THE_RULES = TRUE THEN DISPLAY_RULES; WHILE(RUNNING = TRUE) DO BEGIN CARDS[1] := 0; CARDS[2] := 0; CARDS[3] := 0; WALLET := 100; GAMEOVER := FALSE; WHILE(GAMEOVER = FALSE) DO BEGIN WRITELN('YOU NOW HAVE ',WALLET,' DOLLARS.'); CARDS[1] := SELECT_CARD(CARDS); CARDS[2] := SELECT_CARD(CARDS); BET := ASK_FOR_BET(WALLET); IF BET > 0 THEN BEGIN CARDS[3] := SELECT_CARD(CARDS); IF (CARDS[3] > CARDS[1]) AND (CARDS[3] < CARDS[2]) THEN BEGIN WRITELN('YOU WIN!!!'); WALLET := WALLET + BET; END ELSE IF (CARDS[3] > CARDS[2]) AND (CARDS[3] < CARDS[1]) THEN BEGIN WRITELN('YOU WIN!!!'); WALLET := WALLET + BET; END ELSE BEGIN WRITELN('SORRY, YOU LOSE.'); WALLET := WALLET - BET; END; IF WALLET < 1 THEN BEGIN WRITELN('SORRY FRIEND, YOU ARE BROKE.'); GAMEOVER := TRUE; END END ELSE GAMEOVER := TRUE; END; WRITELN('*** GAME OVER ***'); RUNNING := ASK_TO_PLAY_AGAIN; END; WRITELN('OK, HOPE YOU HAD FUN.'); WRITELN('THANKS FOR PLAYING!'); END.