!******************************** !* * !* Program: PACMAN.BAS * !* Author: David Pallmann * !* Created: 16-May-85 * !* * !******************************** !Standardized graphic char calls...TAB(-1, etc). Allows use with ! non-AlphaMicro CRT's. RRM 21 Dec 1987. !XCALLS: PACMAN, VERIFY PROGRAM PACMAN, 1.01 MAP1 S(20,70), S, 1 MAP1 GRAPH, S, 1 MAP1 CHAR, S, 1 MAP1 CHAMP, S, 80 MAP1 TEXT, S, 70 MAP1 X(4), F, 6 MAP1 Y(4), F, 6 MAP1 C, F, 6 MAP1 DOTS, F, 6 MAP1 DRAG, F, 6 MAP1 CUR, F, 6 MAP1 FRUIT, F, 6 MAP1 FRUIT'FLAG, F, 6 MAP1 HIGH'SCORE, F, 6 MAP1 I, F, 6 MAP1 J, F, 6 MAP1 LIVES, F, 6 MAP1 PAC, S, 1 MAP1 POWER, F, 6 MAP1 REF'DRAG, F, 6 MAP1 SCORE, F, 6 MAP1 R, F, 6 MAP1 X, F, 6 MAP1 Y, F, 6 ON ERROR GOTO ERROR'TRAP GET'PARAM: GRAPH = "Y" INIT: ! XCALL VERIFY, "PACMAN.SBR" XCALL PACMAN SCORE = 0 REF'DRAG = 5 LIVES = 5 FRUIT = 0 NEW'GAME: DRAG = REF'DRAG DOTS = 0 POWER = 0 PAC = "<" PRINT TAB(-1,11); LOOKUP "PACMAN.DAT", I IF I=0 THEN GOTO LOAD'SCREEN OPEN #1, "PACMAN.DAT", INPUT INPUT LINE #1, CHAMP INPUT #1, HIGH'SCORE CLOSE #1 LOAD'SCREEN: PRINT TAB(-1,29); RESTORE PRINT TAB(-1,0); PRINT TAB(-1,11); FOR I = 1 TO 20 READ TEXT FOR J = 1 TO 70 CHAR = MID(TEXT,J,1) CALL DISPLAY S(I,J) = CHAR NEXT J PRINT NEXT I PRINT TAB(-1,12); PRINT TAB(22,1); "< < < < <"; PRINT TAB(1,33); " PAC-MAN "; FOR I = 1 TO 4 Y(I) = 3 X(I) = 35 PRINT TAB(Y(I),X(I)); "@"; NEXT I IF HIGH'SCORE=0 THEN GOTO RESET'USER PRINT TAB(22,40); "High Score"; HIGH'SCORE; "by "; CHAMP; RESET'USER: Y = 19 X = 35 GOTO PUT'PAC USER'STROBE: XCALL PACMAN, CHAR IF CHAR="" THEN GOTO MOVE'GHOSTS IF CHAR=CHR(27) THEN GOTO END'GAME IF CHAR=CHR(11) THEN GOTO UP IF CHAR=CHR(10) THEN GOTO DOWN IF CHAR=CHR(8) THEN GOTO LEFT IF CHAR=CHR(12) THEN GOTO RIGHT IF CHAR="H" THEN GOTO HOLD GOTO MOVE'GHOSTS HOLD: PRINT TAB(-1,12); PRINT TAB(1,20); "HOLD"; HOLD2: XCALL PACMAN, CHAR IF CHAR="" THEN GOTO HOLD2 PRINT TAB(-1,11); PRINT TAB(1,20); "----"; GOTO USER'STROBE UP: IF S(Y-1,X)="*" THEN GOTO MOVE'GHOSTS CALL REMOVE'PAC Y = Y-1 PAC = "V" GOTO PUT'PAC DOWN: IF S(Y+1,X)="*" THEN GOTO MOVE'GHOSTS CALL REMOVE'PAC Y = Y+1 PAC = "^" GOTO PUT'PAC LEFT: IF S(Y,X-2)="*" THEN GOTO MOVE'GHOSTS CALL REMOVE'PAC X = X-2 PAC = ">" IF X<3 THEN X = 67 GOTO PUT'PAC RIGHT: IF S(Y,X+2)="*" THEN GOTO MOVE'GHOSTS CALL REMOVE'PAC X = X+2 PAC = "<" IF X>67 THEN X = 3 GOTO PUT'PAC PUT'PAC: PRINT TAB(-1,12); PRINT TAB(Y,X-1); TAB(-1,33); PAC; IF Y=11 AND X=35 THEN SCORE = SCORE+FRUIT'FLAG : CALL PRINT'SCORE :& CALL REMOVE'FRUIT FOR I = 1 TO 4 IF Y(I)=Y AND X(I)=X AND POWER>0 THEN Y(I) = 3 : X(I) = 35 :& SCORE = SCORE+200 : CALL PRINT'SCORE NEXT I IF POWER>0 IF S(Y,X)="." THEN GOTO DOT IF S(Y,X)="o" THEN GOTO POWER'DOT GOTO MOVE'GHOSTS POWER'DOT: PRINT CHR(7); SCORE = SCORE+90 POWER = POWER+25+(DRAG*25) PRINT TAB(-1,12); DOT: S(Y,X) = " " SCORE = SCORE+10 CALL PRINT'SCORE DOTS = DOTS-1 IF DOTS=0 THEN GOTO WIN IF DOTS<80 THEN DRAG = 4 IF DOTS<60 THEN DRAG = 3 IF DOTS<40 THEN DRAG = 2 IF DOTS<20 THEN DRAG = 1 REM PRINT CHR(7); GOTO MOVE'GHOSTS MOVE'GHOSTS: FRUIT = FRUIT+0.25 IF INT(FRUIT/1000)=FRUIT/1000 THEN CALL CREATE'FRUIT IF INT(FRUIT/1900)=FRUIT/1900 THEN CALL REMOVE'FRUIT IF INT(RND(0)*DRAG)<>0 THEN GOTO USER'STROBE IF POWER=1 THEN GOTO END'POWER CUR = CUR+1 IF CUR>4 THEN CUR = 1 IF POWER>0 THEN POWER = POWER-1 : GOTO RANDOM'MOVEMENT GOTO DELIBERATE'MOVEMENT CREATE'FRUIT: IF FRUIT'FLAG>0 THEN RETURN FRUIT'FLAG = INT(FRUIT/2) PRINT TAB(-1,12); PRINT TAB(11,35); IF GRAPH="Y" THEN PRINT TAB(-1,23); "H"; TAB(-1,24); ELSE PRINT "%"; RETURN REMOVE'FRUIT: IF FRUIT'FLAG=0 THEN RETURN FRUIT'FLAG = 0 PRINT TAB(-1,11); PRINT TAB(11,35); S(11,33); RETURN END'POWER: PRINT CHR(7); CHR(7); POWER = 0 DELIBERATE'MOVEMENT: R = Y(CUR) C = X(CUR) IF YR THEN R = R+1 IF XC THEN C = C+2 IF R=Y AND C=X THEN GOTO RANDOM'MOVEMENT IF S(R,C)<>"*" THEN GOTO MOVE'GHOST RANDOM'MOVEMENT: R = Y(CUR) C = X(CUR) I = INT(RND(0)*4) IF I=0 THEN R = R-1 IF I=1 THEN R = R+1 IF I=2 THEN C = C-2 IF I=3 THEN C = C+2 IF S(R,C)="*" THEN GOTO RANDOM'MOVEMENT MOVE'GHOST: PRINT TAB(-1,12); IF POWER=0 THEN PRINT TAB(R,C-1); TAB(-1,33); "@"; ELSE & PRINT TAB(R,C-1); TAB(-1,32); "@"; PRINT TAB(-1,11); PRINT TAB(Y(CUR),X(CUR)-1); TAB(-1,33); S(Y(CUR),X(CUR)); Y(CUR) = R X(CUR) = C IF R=Y AND C=X AND POWER=0 THEN GOTO EAT'HIM'UP GOTO USER'STROBE WIN: PRINT CHR(7); SCORE = SCORE+5000 IF REF'DRAG>0 THEN REF'DRAG = REF'DRAG-1 HALF'TIME: PRINT TAB(-1,12); FOR I = 2 TO 79 PRINT TAB(23,I); "<"; PRINT TAB(23,I-1); " "; FOR J = 1 TO 50 NEXT J NEXT I PRINT TAB(23,79); " "; FOR I = 80 TO 1 STEP -1 PRINT TAB(23,I); "> "; FOR J = 1 TO 50 NEXT J NEXT I PRINT TAB(23,1); " "; GOTO NEW'GAME EAT'HIM'UP: PRINT CHR(7); LIVES = LIVES-1 PRINT TAB(22,LIVES*2+1); " "; IF LIVES>0 THEN GOTO RESET'USER END'GAME: IF SCORE<=HIGH'SCORE THEN GOTO EXIT PRINT TAB(-1,12); PRINT CHR(7); CHR(7); CHR(7); PRINT TAB(23,1); "NEW HIGH SCORE! WHAT'S YOUR NAME? "; INPUT LINE CHAMP IF CHAMP="" THEN GOTO END'GAME OPEN #1, "PACMAN.DAT", OUTPUT PRINT #1, CHAMP PRINT #1, SCORE CLOSE #1 ERROR'TRAP: PRINT TAB(23,1); TAB(-1,24); TAB(-1,12); TAB(-1,28); IF ERR(0)<2 THEN END PRINT TAB(-1,10); "*** ERROR IN 'PACMAN' LINE=0 FILE=0 ERROR ="; ERR(0); PRINT "***" END EXIT: PRINT TAB(23,1); TAB(-1,24); TAB(-1,12); TAB(-1,28); END END REMOVE'PAC: PRINT TAB(-1,11); PRINT TAB(Y,X-1); TAB(-1,33); S(Y,X); RETURN PRINT'SCORE: PRINT TAB(1,70); PRINT TAB(-1,12); PRINT USING "######"; SCORE; RETURN DISPLAY: IF GRAPH="Y" THEN GOTO GRAPHIC'DISPLAY TEXT'DISPLAY: IF INSTR(1,"|-+ABCD",CHAR)<>0 THEN CHAR = "*" IF CHAR=" " THEN PRINT TAB(-1,33); ELSE PRINT CHAR; IF CHAR="." OR CHAR="o" THEN DOTS = DOTS+1 RETURN GRAPHIC'DISPLAY: IF INSTR(1,"|-+ABCD",CHAR)=0 THEN GOTO TEXT'DISPLAY PRINT TAB(-1,23); IF CHAR="|" THEN PRINT TAB(-1,47); ! V IF CHAR="-" THEN PRINT TAB(-1,46); ! "Z"; IF CHAR="A" THEN PRINT TAB(-1,40); ! "Q"; IF CHAR="B" THEN PRINT TAB(-1,38); ! "R"; IF CHAR="C" THEN PRINT TAB(-1,39); ! "S"; IF CHAR="D" THEN PRINT TAB(-1,41); ! "U"; GD'END: CHAR = "*" PRINT TAB(-1,24); RETURN DATA --------------------------------------------------------------------- DATA B-------------------------------------------------------------------C DATA | o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o | DATA | . B------------ . ------------C . B-------------- . ----------C . | DATA | . | . . . . . . . . . . . . . | . | . . . . . . . . . . . . . | . | DATA | . | . --------------------- . | . | . --------------------- . | . | DATA | . | . . . . . . . . . . . . . | . | . . . . . . . . . . . . . | . | DATA | . . . --------------------- . | . | . --------------------- . . . | DATA | . | . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | . | DATA | . A---------- . ----------- . ----- . ----------- . ----------D . | DATA = . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . = DATA | . B---------- . ----------- . ----- . ----------- . ----------C . | DATA | . | . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | . | DATA | . . . --------------------- . | . | . --------------------- . . . | DATA | . | . . . . . . . . . . . . . | . | . . . . . . . . . . . . . | . | DATA | . | . --------------------- . | . | . --------------------- . | . | DATA | . | . . . . . . . . . . . . . | . | . . . . . . . . . . . . . | . | DATA | . A------------ . ------------D . A-------------- . ----------D . | DATA | o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o | DATA A-------------------------------------------------------------------D