The ABC Programmer (Check GAMES.ABC For QB Version) OTHELLO REVISED FOR PB ------------------------------------------------------------------------------ '========================================================== ' Othello Revision by William Yu [1995] (Converted to PB) ' ' Minimum Requirements: EGA ' ' Instructions for gameplay: ' ' The basis of the game relies on turning the other ' players "chips" over. The more "chips" that you turn ' over results in more "chips" of your color on the ' board. In the end, the player with the most "chips" ' of their color on the grid wins the game! ' ' Enjoy this game, the computer does random moves so it'll ' be a snap to kick its butt. '========================================================== DEFINT A-Z CLS: SCREEN 7,0,0,0 BEGINGAME: X = 0: Y = 0: W = 230: Z = 190 LINE (15, 15)-(215, 175), 15, B LINE (14, 14)-(216, 176), 7, B LINE (13, 13)-(217, 177), 8, B PAINT (150, 100), 7, 15 FOR X = 35 TO 205 STEP 20 LINE (X, 15)-(X, 175), 15 NEXT X FOR Y = 31 TO 180 STEP 16 LINE (15, Y)-(215, Y), 15 NEXT Y PC = 12 PLAYERC = 9 CIRCLE (105, 87), 7, PLAYERC PAINT (105, 87), PLAYERC CIRCLE (125, 87), 7, PC PAINT (125, 87), PC CIRCLE (105, 103), 7, PC PAINT (105, 103), PC CIRCLE (125, 103), 7, PLAYERC PAINT (125, 103), PLAYERC LOCATE 2, 32: COLOR 15: PRINT "OTHELLO" LINE (95, 79)-(115, 95), 0, B X = 95: Y = 79: W = 115: Z = 95 CIRCLE (275, 30), 7, PLAYERC PAINT (275, 30), PLAYERC COLOR 15,0 LOCATE 9, 32: PRINT "PLAYERS" LOCATE 11, 31: PRINT "1. ONE" LOCATE 13, 31: PRINT "2. TWO" DO A$ = INPUT$(1) LOOP UNTIL A$ = "1" OR A$ = "2" LOCATE 9, 32: PRINT SPACE$(7) LOCATE 11, 31: PRINT SPACE$(6) LOCATE 13, 31: PRINT SPACE$(6) IF A$ = "1" THEN PLAYER = 1 ELSE PLAYER = 2 LOCATE 20, 32: PRINT CHR$(34); : COLOR 10: PRINT "P"; : COLOR 15: PRINT CHR$(34); "ass" LOCATE 22, 32: PRINT CHR$(34); : COLOR 10: PRINT "Q"; : COLOR 15: PRINT CHR$(34); "uit" BOX = 4 DO IF PLAYERC = 12 AND PLAYER = 1 THEN GOSUB COMPUTER V$ = INKEY$ IF V$ = CHR$(0) + "P" THEN GOSUB DOWN IF V$ = CHR$(0) + "K" THEN GOSUB LEFTY IF V$ = CHR$(0) + "M" THEN GOSUB RIGHTY IF V$ = CHR$(0) + "H" THEN GOSUB UP IF UCASE$(V$) = "P" THEN SWAP PLAYERC, PC: PAINT (275, 30), PLAYERC, 0 IF UCASE$(V$) = "Q" THEN GOTO OTHELLOEND IF V$ = CHR$(13) THEN GOSUB PUTSQUARE IF V$ = CHR$(27) THEN GOTO OTHELLOEND LOOP LEFTY: IF X = 15 THEN RETURN LINE (X, Y)-(W, Z), 15, B X = X - 20: W = W - 20 LINE (X, Y)-(W, Z), 0, B RETURN RIGHTY: IF W = 215 THEN RETURN LINE (X, Y)-(W, Z), 15, B X = X + 20: W = W + 20 LINE (X, Y)-(W, Z), 0, B RETURN DOWN: IF Z = 175 THEN RETURN LINE (X, Y)-(W, Z), 15, B Y = Y + 16: Z = Z + 16 LINE (X, Y)-(W, Z), 0, B RETURN UP: IF Y = 15 THEN RETURN LINE (X, Y)-(W, Z), 15, B Y = Y - 16: Z = Z - 16 LINE (X, Y)-(W, Z), 0, B RETURN COMPUTER: LOCATE 9, 31: COLOR 14: PRINT "COMPUTING" BACKX = X BACKY = Y AGAIN = 0 RANDOMIZE TIMER DO V$ = INKEY$ IF V$ = CHR$(27) THEN GOTO DECIDEWINNER RNY = INT(RND * 10) + 1 RNX = INT(RND * 10) + 1 IF RNY = 1 THEN Y = 15 ELSE Y = 15 + ((RNY - 1) * 16) IF RNX = 1 THEN X = 15 ELSE X = 15 + ((RNX - 1) * 20) GOSUB PUTSQUARE AGAIN = AGAIN + 1 IF AGAIN = 250 THEN LOCATE 9, 31: COLOR 11: PRINT " PASS! " SLEEP 1 SWAP PLAYERC, PC PAINT (275, 30), PLAYERC, 0 LOCATE 9, 31: PRINT SPACE$(9) X = BACKX Y = BACKY RETURN END IF LOOP UNTIL VALID = 1 IF VALID <> 1 THEN FOR Y = 15 TO 170 STEP 16 FOR X = 15 TO 200 STEP 20 GOSUB PUTSQUARE IF VALID = 1 THEN EXIT FOR NEXT X IF VALID = 1 THEN EXIT FOR NEXT Y X = BACKX Y = BACKY END IF LOCATE 9, 31: PRINT SPACE$(9) X = BACKX Y = BACKY RETURN PUTSQUARE: VALID = -1 Colour = POINT(X + 10, Y + 10) IF Colour <> 7 THEN IF PLAYERC = 12 AND PLAYER = 1 THEN RETURN ELSE LOCATE 10, 31: COLOR 10: PRINT "OCCUPIED!": SLEEP 1: LOCATE 10, 31: PRINT SPACE$(9): RETURN END IF END IF ' Check side on Right N = X + 20 M = N C = 0 FOR R = N TO 200 STEP 20 C = POINT(R + 10, Y + 10) IF C = 7 THEN EXIT FOR IF C = PLAYERC THEN EXIT FOR NEXT R IF C = PLAYERC AND N <> R THEN VALID = 1 N = R - 20 FOR R = M TO N STEP 20 PAINT (R + 10, Y + 10), PLAYERC, 7 NEXT R END IF ' Check side on Left N = X - 20 M = N C = 0 FOR R = N TO 10 STEP -20 C = POINT(R + 10, Y + 10) IF C = 7 THEN EXIT FOR IF C = PLAYERC THEN EXIT FOR NEXT R IF C = PLAYERC AND N <> R THEN VALID = 1 N = R + 20 FOR R = N TO M STEP 20 PAINT (R + 10, Y + 10), PLAYERC, 7 NEXT R END IF ' Check Up N = Y - 18 M = N C = 0 FOR R = N TO 10 STEP -16 C = POINT(X + 10, R + 10) IF C = 7 THEN EXIT FOR IF C = PLAYERC THEN EXIT FOR NEXT R IF C = PLAYERC AND N <> R THEN VALID = 1 N = R + 16 FOR R = N TO M STEP 16 PAINT (X + 10, R + 10), PLAYERC, 7 NEXT R END IF ' Check Down N = Y + 14 M = N C = 0 FOR R = N TO 170 STEP 16 C = POINT(X + 10, R + 10) IF C = 7 THEN EXIT FOR IF C = PLAYERC THEN EXIT FOR NEXT R IF C = PLAYERC AND N <> R THEN VALID = 1 N = R - 14 FOR R = M TO N STEP 16 PAINT (X + 10, R + 10), PLAYERC, 7 NEXT R END IF ' Check Diagonals ' Right & Down N = Y + 14 F = X + 20 M = N G = F C = 0 FOR R = N TO 170 STEP 16 C = POINT(F + 10, R + 10) IF C = 7 THEN EXIT FOR IF C = PLAYERC THEN EXIT FOR F = F + 20 NEXT R IF C = PLAYERC AND N <> R THEN VALID = 1 N = R - 14 F = X + 20 FOR R = M TO N STEP 16 PAINT (F + 10, R + 10), PLAYERC, 7 F = F + 20 NEXT R END IF ' Right & Up N = Y - 18 F = X - 20 M = N G = F C = 0 FOR R = N TO 10 STEP -16 C = POINT(F + 10, R + 10) IF C = 7 THEN EXIT FOR IF C = PLAYERC THEN EXIT FOR F = F - 20 NEXT R IF C = PLAYERC AND N <> R THEN VALID = 1 N = R + 16 F = F + 20 FOR R = N TO M STEP 16 PAINT (F + 10, R + 10), PLAYERC, 7 F = F + 20 NEXT R END IF ' Left & Down N = Y + 14 F = X - 20 M = N G = F C = 0 FOR R = N TO 170 STEP 16 C = POINT(F + 10, R + 10) IF C = 7 THEN EXIT FOR IF C = PLAYERC THEN EXIT FOR F = F - 20 NEXT R IF C = PLAYERC AND N <> R THEN VALID = 1 N = R - 14 F = X - 20 FOR R = M TO N STEP 16 PAINT (F + 10, R + 10), PLAYERC, 7 F = F - 20 NEXT R END IF ' Left & Up N = Y - 18 F = X + 20 M = N G = F C = 0 FOR R = N TO 10 STEP -16 C = POINT(F + 10, R + 10) IF C = 7 THEN EXIT FOR IF C = PLAYERC THEN EXIT FOR F = F + 20 NEXT R IF C = PLAYERC AND N <> R THEN VALID = 1 N = R + 16 F = F - 20 FOR R = N TO M STEP 16 PAINT (F + 10, R + 10), PLAYERC, 7 F = F - 20 NEXT R END IF IF VALID = -1 THEN IF PLAYER = 1 AND PLAYERC = 12 THEN ELSE LOCATE 9, 32: COLOR 14: PRINT "ILLEGAL" LOCATE 11, 33: PRINT "MOVE!" SLEEP 1 LOCATE 9, 32: PRINT SPACE$(9) LOCATE 11, 33: PRINT SPACE$(5) END IF RETURN ELSE BOX = BOX + 1 END IF CIRCLE (X + 10, Y + 8), 7, PLAYERC PAINT (X + 10, Y + 8), PLAYERC SWAP PLAYERC, PC PAINT (275, 30), PLAYERC, 0 IF BOX = 100 THEN LOCATE 9, 31: PRINT SPACE$(9): GOTO DECIDEWINNER RETURN DECIDEWINNER: BLUE = 0 RED = 0 LOCATE 20, 31: PRINT SPACE$(9) LOCATE 22, 31: PRINT SPACE$(9) LOCATE 8, 33: COLOR 10: PRINT "FINAL" LOCATE 10, 33: PRINT "SCORE" LOCATE 13, 31: COLOR 9: PRINT "BLUE:" LOCATE 15, 31: COLOR 12: PRINT "RED: " COLOR 15 Y = 24 DO FOR X = 25 TO 220 STEP 20 CL = POINT(X, Y) IF CL = 9 THEN BLUE = BLUE + 1: LOCATE 13, 36: PRINT BLUE IF CL = 12 THEN RED = RED + 1: LOCATE 15, 36: PRINT RED NEXT X Y = Y + 16 LOOP UNTIL Y >= 170 COLOR 14 IF BLUE > RED THEN LOCATE 19, 31: PRINT "BLUE WINS!" IF RED > BLUE THEN LOCATE 19, 31: PRINT "RED WINS!" IF BLUE = RED THEN LOCATE 19, 31: PRINT "IT'S A TIE" LOCATE 25, 1: PRINT "ANOTHER GAME [Y/N] "; : COLOR 12 DO A$ = INPUT$(1) ANS$ = UCASE$(A$) LOOP UNTIL ANS$ = "Y" OR ANS$ = "N" IF UCASE$(A$) = "Y" THEN CLS: GOTO BEGINGAME OTHELLOEND: SCREEN 0, 0, , 0: CLS WIDTH 80, 25