PROGRAM BOMBARDMENT; TYPE INT_ARRAY_2 = ARRAY [1..2] OF INTEGER; INT_ARRAY_25 = ARRAY [1..25] OF INTEGER; PINT_ARRAY_2 = ^INT_ARRAY_2; PINT_ARRAY_25 = ^INT_ARRAY_25; VAR RUNNING,GAME_OVER:BOOLEAN; ANS,T_STR:STRING; TURN,WINNER:INTEGER; OUTPOSTS:INT_ARRAY_2; YOUR_GRID,ENEMY_GRID:INT_ARRAY_25; 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('YOU ARE ON A BATTLEFIELD WITH 4 PLATOONS AND YOU'); WRITELN('HAVE 25 OUTPOSTS AVAILABLE WHERE THEY MAY BE PLACED.'); WRITELN('YOU CAN ONLY PLACE ONE PLATOON AT ANY ONE OUTPOST.'); WRITELN('THE COMPUTER DOES THE SAME WITH ITS FOUR PLATOONS.'); WRITELN(' '); WRITELN('THE OBJECT OF THE GAME IS TO FIRE MISSILES AT THE'); WRITELN('OUTPOSTS OF THE COMPUTER. IT WILL DO THE SAME TO YOU.'); WRITELN('THE ONE WHO DESTROYS ALL FOUR OF THE ENEMY''S PLATOONS'); WRITELN('FIRST IS THE WINNER.'); WRITELN(' '); WRITELN('GOOD LUCK...AND THELL US WHERE YOU WANT THE BODIES SENT.'); WRITELN(' '); END; FUNCTION CHECK_WINNER:INTEGER; VAR RET_VAL:INTEGER; BEGIN IF OUTPOSTS[1] = 0 THEN RET_VAL := 2 ELSE IF OUTPOSTS[2] = 0 THEN RET_VAL := 1 ELSE RET_VAL := 0; CHECK_WINNER := RET_VAL; END; PROCEDURE DISPLAY_YOUR_GRID; VAR X,G,G_START,G_END:INTEGER; DISPLAY,X_STR:STRING; BEGIN WRITELN('======================='); WRITELN('YOUR GRID'); WRITELN('======================='); WRITELN('X | 1 | 2 | 3 | 4 | 5 |'); WRITELN('Y |---+---+---+---+---|'); FOR X := 1 TO 5 DO BEGIN G_START := ((X - 1) * 5) + 1; G_END := X * 5; STR(X,X_STR); DISPLAY := X_STR + ' |'; FOR G := G_START TO G_END DO BEGIN IF YOUR_GRID[G] = -1 THEN DISPLAY := DISPLAY + ' X |' ELSE IF YOUR_GRID[G] = 1 THEN DISPLAY := DISPLAY + ' O |' ELSE DISPLAY := DISPLAY + ' |'; END; WRITELN(DISPLAY); END; WRITELN(' |---+---+---+---+---|'); END; PROCEDURE DISPLAY_ENEMY_GRID; VAR X,G,G_START,G_END:INTEGER; DISPLAY,X_STR:STRING; BEGIN WRITELN('======================='); WRITELN('ENEMY GRID'); WRITELN('======================='); WRITELN('X | 1 | 2 | 3 | 4 | 5 |'); WRITELN('Y |---+---+---+---+---|'); FOR X := 1 TO 5 DO BEGIN G_START := ((X - 1) * 5) + 1; G_END := X * 5; STR(X,X_STR); DISPLAY := X_STR + ' |'; FOR G := G_START TO G_END DO BEGIN IF ENEMY_GRID[G] = -1 THEN DISPLAY := DISPLAY + ' X |' ELSE DISPLAY := DISPLAY + ' |'; END; WRITELN(DISPLAY); END; WRITELN(' |---+---+---+---+---|'); END; PROCEDURE CLEAR_GRIDS; VAR G:INTEGER; BEGIN FOR G:= 1 TO 25 DO BEGIN YOUR_GRID[G] := 0; ENEMY_GRID[G] := 0; END; END; PROCEDURE SET_OUTPOSTS; VAR OUTPOST,X,Y,O:INTEGER; OUTPOST_SET:BOOLEAN; O_STR:STRING; BEGIN OUTPOSTS[1] := 4; OUTPOST := 0; FOR O := 1 TO 4 DO BEGIN STR(O, O_STR); DISPLAY_YOUR_GRID; OUTPOST_SET := FALSE; WHILE OUTPOST_SET = FALSE DO BEGIN WRITELN('PLACE YOUR OUTPOST #' + O_STR); X := GET_INT_INPUT('X'); IF (X < 1) OR (X > 5) THEN WRITELN('X MUST BE BETWEEN 1 AND 5.') ELSE BEGIN Y := GET_INT_INPUT('Y'); IF (Y < 1) OR (Y > 5) THEN WRITELN('Y MUST BE BETWEEN 1 AND 5.') ELSE BEGIN OUTPOST := ((Y - 1) * 5) + X; IF YOUR_GRID[OUTPOST] = 0 THEN BEGIN OUTPOST_SET := TRUE; YOUR_GRID[OUTPOST] := 1; END ELSE WRITELN('YOU ALREADY HAVE AN OUTPOST THERE.'); END; END; END; END; END; PROCEDURE COMPUTER_SET_OUTPOSTS; VAR OUTPOST,O:INTEGER; OUTPOST_SET:BOOLEAN; BEGIN OUTPOSTS[2] := 4; OUTPOST := 0; FOR O := 1 TO 4 DO BEGIN OUTPOST_SET := FALSE; WHILE OUTPOST_SET = FALSE DO BEGIN OUTPOST := GENERATE_RANDOM_NUMBER(1,25,FALSE); IF ENEMY_GRID[OUTPOST] = 0 THEN BEGIN OUTPOST_SET := TRUE; ENEMY_GRID[OUTPOST] := 1; END; END; END; END; PROCEDURE COMPUTER_TURN; VAR LOC,X,Y:INTEGER; GOT_LOC:BOOLEAN; X_STR,Y_STR:STRING; BEGIN GOT_LOC := FALSE; WHILE GOT_LOC = FALSE DO BEGIN LOC := GENERATE_RANDOM_NUMBER(1,25,FALSE); X := (LOC MOD 5); IF X = 0 THEN X := 5; Y := ((LOC + (5 - X)) DIV 5); IF YOUR_GRID[LOC] > -1 THEN GOT_LOC := TRUE; END; WRITELN('..........BOOM!'); STR(X,X_STR); STR(Y,Y_STR); IF YOUR_GRID[LOC] = 0 THEN BEGIN WRITELN('I MISSED YOU, YOU DIRTY RAT.'); WRITELN('I PICKED LOCATION (' + X_STR + ',' + Y_STR + ').'); END ELSE BEGIN WRITELN('I GO YOU. IT WON''T BE LONG NOW!'); WRITELN('OUTPOST AT (' + X_STR + ',' + Y_STR + ') WAS HIT.'); YOUR_GRID[LOC] := -1; OUTPOSTS[1] := OUTPOSTS[1] - 1; IF OUTPOSTS[1] = 3 THEN WRITELN('YOU ONLY HAVE THREEE OUTPOSTS LEFT.') ELSE IF OUTPOSTS[1] = 2 THEN WRITELN('YOU ONLY HAVE TWO OUTPOSTS LEFT.') ELSE IF OUTPOSTS[1] = 1 THEN WRITELN('YOU ONLY HAVE ONE OUTPOST LEFT.') ELSE WRITELN('YOU ARE DEAD! YOU HAVE NO OUTPOSTS LEFT.'); END; END; PROCEDURE FIRE_MISSILE; VAR LOC,X,Y:INTEGER; GOT_LOC:BOOLEAN; BEGIN WRITELN('WHERE DO YOU WANT TO FIRE YOUR MISSILE?'); GOT_LOC := FALSE; WHILE GOT_LOC = FALSE DO BEGIN X := GET_INT_INPUT('X'); IF (X < 1) OR (X > 5) THEN WRITELN('PLEASE ENTER A NUMBER BETWEEN 1 AND 5.') ELSE GOT_LOC := TRUE; END; GOT_LOC := FALSE; WHILE GOT_LOC = FALSE DO BEGIN Y := GET_INT_INPUT('Y'); IF (Y < 1) OR (Y > 5) THEN WRITELN('PLEASE ENTER A NUMBER BETWEEN 1 AND 5.') ELSE GOT_LOC := TRUE; END; LOC := ((Y - 1) * 5) + X; WRITELN('..........BOOM!'); IF ENEMY_GRID[LOC] = -1 THEN WRITELN('YOU FOOL, YOU ALREADY ATTACKED THERE!') ELSE IF ENEMY_GRID[LOC] = 0 THEN WRITELN('HA HA, YOU MISSED!') ELSE BEGIN WRITELN('YOU GOT ONE OF MY OUTPOSTS!'); ENEMY_GRID[LOC] := -1; OUTPOSTS[2] := OUTPOSTS[2] -1; IF OUTPOSTS[2] = 3 THEN WRITELN('ONE DOWN, THREE TO GO.') ELSE IF OUTPOSTS[2] = 2 THEN WRITELN('TWO DOWN, TWO TO GO.') ELSE IF OUTPOSTS[2] = 1 THEN WRITELN('THREE DOWN, ONE TO GO.') ELSE WRITELN('YOU GOT THEM ALL.'); END; END; BEGIN WRITELN('*** BOMBARDMENT : PASCAL ***'); RUNNING := TRUE; IF ASK_TO_SEE_THE_RULES = TRUE THEN DISPLAY_RULES; WHILE(RUNNING = TRUE) DO BEGIN TURN := 0; CLEAR_GRIDS; COMPUTER_SET_OUTPOSTS; SET_OUTPOSTS; GAME_OVER := FALSE; WRITELN('---------- LET THE WAR BEGIN ----------'); WHILE(GAME_OVER = FALSE) DO BEGIN WRITELN('-----------------------'); STR(TURN + 1, T_STR); WRITELN('TURN #' + T_STR); WRITELN('-----------------------'); WRITELN('PRESS [ENTER] TO BEING YOUR TURN.'); READLN(ANS); IF TURN MOD 2 = 0 THEN BEGIN DISPLAY_YOUR_GRID; DISPLAY_ENEMY_GRID; FIRE_MISSILE; END ELSE COMPUTER_TURN; WINNER := CHECK_WINNER; IF WINNER = 0 THEN TURN := TURN + 1 ELSE BEGIN DISPLAY_YOUR_GRID; DISPLAY_ENEMY_GRID; IF WINNER = 1 THEN WRITELN('YOU WIN!!!') ELSE WRITELN('TOO BAD, BETTER LUCK NEXT TIME.'); GAME_OVER := TRUE; END; END; WRITELN('*** GAME OVER ***'); RUNNING := ASK_TO_PLAY_AGAIN; END; WRITELN('THANKS FOR PLAYING!'); READLN(ANS); END.