'===========================================================================
' Subject: OTHELLO REVISED FOR PB             Date: 12-29-95 (12:19)       
'  Author: The ABC Programmer                 Code: PB                     
'  Origin: Check GAMES.ABC For QB Version   Packet: PB.ABC
'===========================================================================
 '==========================================================
 ' 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

