'===========================================================================
' Subject: CONNECT 4 PB                       Date: 12-28-95 (14:41)       
'  Author: The ABC Programmer                 Code: PB                     
'  Origin: Check GAMES.ABC For QB Version   Packet: PB.ABC
'===========================================================================
'===================================================
' EGA CONNECT FOUR by William Yu  (Converted to PB)
'
' Only a few lines needed to be changed to get this
' up and running, have fun PB users!
'
' INSTRUCTIONS For Game Play:
'   Object of the game is to connect your coloured
'   chips four in a row, horizontally, vertically or
'   diagonally before the other person does.
'===================================================

DEFINT A-Z
DECLARE SUB DrawGrid ()
DECLARE SUB DrawChip (X%, ChipColor%)
DECLARE SUB EraseChip (X%)
DECLARE SUB DropChip (X%, ChipColor%, Valid%)
DECLARE SUB SwitchTurn (X%, ChipColor%, ChipColor2%)
DECLARE SUB CheckForWin (Grid(), Row%, Col%, ChipColor%)
DECLARE SUB WhoWon (ChipColor%)
DECLARE SUB ComputerTurn (ChipColor%, ChipColor2%)

SHARED True,False,Computer,User,Player,Level

DIM Grid(8, 8) AS INTEGER   ' Do not change unless you know what you're doing
	True = 1       ' Define Constants
	False = 0
	Computer = 12  ' Define Colors for Computer/User
	User = 9       ' Computer = Red / User = Blue
				   ' Computer <> User
	Player = 1     ' One or Two Players
				   ' If two players then Player Two = Computer
	Level = 0      ' Level of difficulty against computer
				   ' 0 = Moronic
				   ' 1 = Easy          Please implement
				   ' 2 = Normal        computer difficulty
				   ' 3 = Hard
				   ' 4 = Really Hard

SCREEN 7, 0, 0, 0      ' Change to other screen modes if desired

DrawGrid               ' Call DrawGrid Subroutine (Draws Playing Field)

GoesFirst = True       ' User goes first (Change to False to go second)

IF GoesFirst THEN
  ChipColor = User     ' Using two variables for swapping later
  ChipColor2 = Computer
ELSE
   ChipColor = Computer
   ChipColor2 = User
   ComputerTurn ChipColor, ChipColor2
END IF

X = 144              ' X value changes ¤ 28
					 ' Leftend value  = 60
					 ' Rightend value = 256
Drops = 0            ' Setup Counter  (Max of 64 Drops before grid is filled)

DO
  IF Drops = 64 THEN GOTO TieBreak
  DrawChip X, ChipColor
  DO
	K$ = INKEY$
  LOOP UNTIL K$ <> ""

SELECT CASE K$
	CASE CHR$(0) + "M"          ' User Pressed RIGHT ARROW
		EraseChip X
		IF X < 256 THEN         ' Make sure it's not end of grid
			Incr X, 28
		ELSE                    ' Else go back to beginning
			X = 60
		END IF
	CASE CHR$(0) + "K"          ' User Pressed LEFT ARROW
		EraseChip X
		IF X > 60 THEN            ' Make sure it's not at beginning of grid
			Decr X, 28
		ELSE                      ' Else go to the end of the grid
			X = 256
		END IF
	CASE CHR$(0) + "P", CHR$(13)      ' User Pressed ENTER or DOWN
		DropChip X, ChipColor, Valid  ' Drop the Chip
		IF Valid = True THEN          ' Valid Drop
			SwitchTurn X, ChipColor, ChipColor2
			Incr Drops                ' Increase counter
			Valid = False
			IF Player = 1 AND Drops <> 64 THEN ComputerTurn ChipColor, ChipColor2
		END IF
	CASE CHR$(27)               ' User Pressed ESC  (Quit Program)
		GOTO ProgramEND
END SELECT
LOOP

TieBreak:
  LOCATE 1, 1: COLOR 15: PRINT "It's a tie!"

ProgramEND:
  END

SUB CheckForWin (Grid(), Row, Col, ChipColor)

'              <--- Column --->
'              1 2 3 4 5 6 7 8  XY
'              ----------------+
'              o o o o o o o o | 1
'              o o o o o o o o | 2
'              o o o o o o o o | 3
'              o o o o o o o o | 4
'  Start to -> o o o o o o o o | 5
'   Check      o o o o o o o o | 6
'    Down      o o o o o o o o | 7
'              o o o o o o o o | 8
'
' Here's what is checked first:
'
'   HORIZONTAL then VERTICAL then DIAGONAL
'
' You can change the order if you wish.

Connect = 1

FOR C = Col - 1 TO Col - 3 STEP -1
	IF C = 0 THEN EXIT FOR
	IF Grid(C, Row) = ChipColor THEN Incr Connect ELSE EXIT FOR
NEXT C
IF Connect = 4 THEN WhoWon ChipColor
FOR C = Col + 1 TO Col + 3
	IF C = 9 THEN EXIT FOR
	IF Grid(C, Row) = ChipColor THEN Incr Connect ELSE EXIT FOR
NEXT C
IF Connect = 4 THEN WhoWon ChipColor ELSE Connect = 1

' Check Vertical, only if dropped chip is high enough to count downwards
' If not, forget checking

IF Row < 6 THEN
	FOR C = Row + 1 TO Row + 3
		IF Grid(Col, C) = ChipColor THEN Incr Connect ELSE EXIT FOR
	NEXT C
END IF
IF Connect = 4 THEN WhoWon ChipColor ELSE Connect = 1


' Diagonal Check (Left Up/Down)

BackRow = Row
FOR C = Col - 1 TO Col - 3 STEP -1
	IF C = 0 THEN EXIT FOR
	IF Row = 1 THEN EXIT FOR
	Decr Row
	IF Grid(C, Row) = ChipColor THEN Incr Connect ELSE EXIT FOR
NEXT C
IF Connect = 4 THEN WhoWon ChipColor
Row = BackRow
FOR C = Col + 1 TO Col + 3
	IF C = 9 THEN EXIT FOR
	IF Row = 8 THEN EXIT FOR
	Incr Row
	IF Grid(C, Row) = ChipColor THEN Incr Connect ELSE EXIT FOR
NEXT C
IF Connect = 4 THEN WhoWon ChipColor ELSE Connect = 1


' Diagonal Check (Right Up/Down)

Row = BackRow
FOR C = Col + 1 TO Col + 3
	IF C = 9 THEN EXIT FOR
	IF Row = 1 THEN EXIT FOR
	Decr Row
	IF Grid(C, Row) = ChipColor THEN Incr Connect ELSE EXIT FOR
NEXT C
IF Connect = 4 THEN WhoWon ChipColor
Row = BackRow
FOR C = Col - 1 TO Col - 3 STEP -1
	IF C = 0 THEN EXIT FOR
	IF Row = 8 THEN EXIT FOR
	Incr Row
	IF Grid(C, Row) = ChipColor THEN Incr Connect ELSE EXIT FOR
NEXT C
IF Connect = 4 THEN WhoWon ChipColor ELSE Connect = 1

END SUB

SUB ComputerTurn (ChipColor, ChipColor2)

SELECT CASE Level
	CASE 0
	  DO
		RANDOMIZE TIMER
		Col = INT(RND * 8) + 1
		X = 60 + ((Col - 1) * 28)
		DropChip X, ChipColor, Valid
	  LOOP UNTIL Valid = True
	CASE 1
	CASE 2
	CASE 3
	CASE 4
END SELECT

SwitchTurn X, ChipColor, ChipColor2

END SUB

SUB DrawChip (X, ChipColor)

CIRCLE (X, 7), 8, ChipColor
PAINT (X, 7), ChipColor

END SUB

SUB DrawGrid

LINE (45, 20)-(270, 180), 14, BF
LINE (51, 17)-(275, 17), 14
LINE (275, 17)-(275, 175), 14
LINE (51, 17)-(45, 20), 14
LINE (275, 17)-(270, 20), 14
LINE (275, 175)-(270, 180), 14
PAINT (273, 100), 6, 14
LINE (45, 181)-(270, 181), 12
LINE (276, 175)-(290, 189), 12
LINE (45, 181)-(31, 195), 12
LINE (270, 181)-(284, 195), 12
LINE (31, 195)-(284, 195), 12
LINE (290, 189)-(284, 195), 12
LINE (275, 176)-(270, 181), 12
PAINT (150, 185), 12
PAINT (282, 184), 4, 12

FOR Y = 30 TO 170 STEP 20
	FOR X = 60 TO 260 STEP 28
		CIRCLE (X, Y), 8, 0
		PAINT (X, Y), 0, 0
		CIRCLE (X, Y), 6, 14, 4.6, .1
	NEXT X
NEXT Y

END SUB

SUB DropChip (X, ChipColor, Valid) SHARED

Col = (X - 60) / 28 + 1        ' Calculates the Column (1-8)

FOR C = 8 TO 2 STEP -1
	IF Grid(Col, C) = False THEN EXIT FOR
NEXT C

IF Grid(Col, C) = False THEN     ' Empty Holder, place your chip here
	Grid(Col, C) = ChipColor     ' Make it filled
	Row = ((C - 1) * 20) + 30    ' Calculate the Row
	CIRCLE (X, Row), 8, 8        ' Make Chip border color Dark Grey
	PAINT (X, Row), ChipColor, 8 ' Fill chip color
	Valid = True
	CheckForWin Grid(), C, Col, ChipColor
END IF

END SUB

SUB EraseChip (X)

PAINT (X, 7), 0

END SUB

SUB SwitchTurn (X, ChipColor, ChipColor2)

EraseChip X
SWAP ChipColor, ChipColor2    ' Swap the two variables
X = 144                       ' Reset X Coordinates
DrawChip X, ChipColor

END SUB

SUB WhoWon (ChipColor)

' Check who wins
' Do whatever you want for the closing screen

IF ChipColor = User THEN
	IF Player = 1 THEN PRINT "You Win!" ELSE PRINT "Player One Wins!"
ELSE
	IF Player = 1 THEN PRINT "Computer Wins!" ELSE PRINT "Player Two Wins!"
END IF

END

END SUB

