'===========================================================================
' Subject: OTHELLO REVISION                   Date: Year of 1995 (00:00:00)
'  Author: The ABC Programmer                 Code: QB, QBasic             
'  Origin: OTHELLO,REVISION,EGA,VGA         Packet: GAMES.ABC
'===========================================================================
' Othello Revision by William Yu 1995
' This game requires EGA or VGA
' You can modify this so it can run on any screen mode you wish
' I haven't documented this game because I'm too lazy, and besides
'   that, I don't know what half of my program means! :)
' To change user/computer colors you have to change the variables
'   PC and PLAYERC and modify some of the other code to match up
'   with your selected color.
' Enjoy this game, the computer does random moves so it'll be a snap
'  to kick its butt.  Modify it so the computer at least has a chance.
'  I don't know much on strategy so I don't know how to make the computer
'  think for itself.
' I always program things in a rush, so don't expect too much from it.

DEFINT A-Z
CLS
PRINT "Othello Revision by William Yu 1995": PRINT
PRINT "Select Video Type"
PRINT
PRINT "1. EGA"
PRINT "2. VGA"
LOCATE , , 1
DO
  G$ = INPUT$(1)
LOOP UNTIL G$ = "1" OR G$ = "2"
IF G$ = "1" THEN SCREEN 7
IF G$ = "2" THEN SCREEN 13

BEGINGAME:
X = 0: Y = 0: W = 230: Z = 190
IF G$ = "2" THEN
FOR C = 16 TO 31
  LINE (X, Y)-(W, Z), C, B
  X = X + 1: Y = Y + 1: W = W - 1: Z = Z - 1
NEXT C
ELSE
  LINE (15, 15)-(215, 175), 15, B
  LINE (14, 14)-(216, 176), 7, B
  LINE (13, 13)-(217, 177), 8, B
END IF
IF G$ = "2" THEN PAINT (150, 100), 7, 31 ELSE 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
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 LEFT
    IF V$ = CHR$(0) + "M" THEN GOSUB RIGHT
    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

LEFT:
  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

RIGHT:
  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
DO
  V$ = INKEY$
  IF V$ = CHR$(27) THEN GOTO DECIDEWINNER
  RANDOMIZE TIMER
  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

