' Dots.iwb
' Compile as Windows.exe
'
'  Written by Bill K. Haesslein
'    Started on 2016-08-21

autodefine "OFF"

DEF BLACK, RED, GREEN, BLUE, YELLOW, CYAN, PINK, GREY, MAGENTA:UINT
DEF LBLUE, LYELLOW, WHITE, PURPLE, PURPLE2, GOLD, SILVER, BROWN:UINT

GOLD    = RGB(255,215,0)
YELLOW  = RGB(255,255,0)
LYELLOW = RGB(255,255,125)
GREEN   = RGB(0,255,0)
BLUE    = RGB(0,0,255)
RED     = RGB(255,0,0)
CYAN    = RGB(0,255,255)
PINK    = RGB(255,192,203)
GREY    = RGB(127,127,127)
LBLUE   = RGB(0,125,255)
MAGENTA = 0x8D38C9
PURPLE  = RGB(128,0,128)
PURPLE2 = RGB(230,25,230)
BROWN   = 0x60A4F4
SILVER  = RGB(128,128,128)
WHITE   = RGB(255,255,255)
BLACK   = RGB(0,0,0)

def desW, desH:INT
DEF w1:WINDOW
DEF c, cp, fi, fj, i, j, l, m, mx, my, pi, pj, px, p1, p2, wi, wj, wx:INT
DEF xbox[8,8,5], ybox[8,8,5], matrix[50,9]:int
def ostr:string

desW = 520
desH = 580

ENUM ControlIDs
	W1_B1 = 500
	W1_B2
	W1_S1
	W1_S2
	W1_E1
	W1_E2
	W1_E3
ENDENUM

OPENWINDOW w1,0,0,desW,desH,0x80C80080,0,"  Dots Game",&w1_handler

CONTROL w1,@BUTTON,"Undo",40,10,50,25,0x50000000,W1_B1
CONTROL w1,@BUTTON,"Exit",430,10,50,25,0x50000000,W1_B2
control w1,@STATIC,"Player 1",150,10,60,20,@CTEDITCENTER,W1_S1
control w1,@STATIC,"Player 2",230,10,60,20,@CTEDITCENTER,W1_S2
CONTROL w1,@EDIT,"0",150,35,45,20,0x50800000,W1_E1
CONTROL w1,@EDIT,"0",230,35,45,20,0x50800000,W1_E2
CONTROL w1,@EDIT,"Player 1",320,10,95,35,0x50800000,W1_E3

SETCONTROLCOLOR w1,W1_B1,BLACK,GREEN
SETCONTROLCOLOR w1,W1_B2,CYAN,RED

SETCONTROLCOLOR w1,W1_S1,BLACK,GREEN
SETCONTROLCOLOR w1,W1_S2,BLACK,CYAN

SETCONTROLCOLOR w1,W1_E3,BLACK,GREEN
SETFONT w1,"Tahoma",14,400,0,W1_E3

SETFONT w1,"Tahoma",14,400,0,W1_B1
SETFONT w1,"Tahoma",14,400,0,W1_B2

'load matrix
for I = 0 to 49
	for J = 0 to 7
		GETDATA matrixdata, l
		matrix[i,j] = l
	next j
next i

i = 40
j = 80

for m = 0 to 7
	FOR l = 0 to 7
		RECT w1,i,j,20,20,BLACK,BLACK
		IF l < 7
			RECT w1,i+20,j,40,20,BLACK,WHITE
			ybox[m,l,0] = i+21
			ybox[m,l,1] = i+59
			ybox[m,l,2] = j+1
			ybox[m,l,3] = j+19
			ybox[m,l,4] = 0
		endif
		if m < 7
			rect w1,i,j+20,20,40,BLACK,WHITE
			xbox[m,l,0] = i+1
			xbox[m,l,1] = i+19
			xbox[m,l,2] = j+21
			xbox[m,l,3] = j+59
			xbox[m,l,4] = 0
		endif
		i = i + 60
	next l
	j = j + 60
	i = 40
next m

cp = 0

WAITUNTIL w1 = 0
END

SUB w1_handler(),int
SELECT @MESSAGE
	CASE @IDCREATE
		CENTERWINDOW w1
	CASE @IDCLOSEWINDOW
	CASE& @IDDESTROY
		CLOSEWINDOW w1
	CASE @IDLBUTTONDN
		mx = @mousex
		my = @mousey
		c = check()
		if c = 1
			checkwin()
		endif
	CASE @IDCONTROL
		SELECT @CONTROLID
			CASE W1_B1
				IF @NOTIFYCODE = 0
					if px > 0
						SELECT px
							CASE 1
								FLOODFILL w1,fi,fj,WHITE
								xbox[pi,pj,4] = 0
								px = 0
							CASE 2
								FLOODFILL w1,fi,fj,WHITE
								ybox[pi,pj,4] = 0
								px = 0
						ENDSELECT
						player()
					ENDIF
				ENDIF
			CASE W1_B2
				IF @NOTIFYCODE = 0
					CLOSEWINDOW w1
					w1 = 0
				ENDIF
		ENDSELECT
ENDSELECT
RETURN 0
ENDSUB

sub check(),int
for i = 0 to 7
	for j = 0 to 7
		if mx > xbox[i,j,0] and mx < xbox[i,j,1]
			if my > xbox[i,j,2] and my < xbox[i,j,3]
				if xbox[i,j,4] = 0
					IF cp = 0
						FLOODFILL w1,mx,my,GREEN
					else
						FLOODFILL w1,mx,my,BLUE
					endif
					xbox[i,j,4] = 1
					wi = i
					wj = j
					wx = 1
					pi = i
					pj = j
					px = 1
					fi = mx
					fj = my
					SETCONTROLTEXT w1,W1_E3,ostr
					return 1
				else
					return 0
				endif
			endif
		endif
		if mx > ybox[i,j,0] and mx < ybox[i,j,1]
			if my > ybox[i,j,2] and my < ybox[i,j,3]
				if ybox[i,j,4] = 0
					if cp = 0
						FLOODFILL w1,mx,my,GREEN
					else
						FLOODFILL w1,mx,my,LBLUE
					endif
					ybox[i,j,4] = 1
					wi = i
					wj = j
					wx = 2
					pi = i
					pj = j
					px = 2
					fi = mx
					fj = my
					SETCONTROLTEXT w1,W1_E3,ostr
					return 1
				else
					return 0
				endif
			endif
		endif
	next j
next i
return 0
endsub

sub checkwin()
c = 0
for l = 0 to 49
	if matrix[l,8] = 0
		c = 0
		if matrix[l,0] = wi and matrix[l,1] = wj and wx = 2 then c++
		IF matrix[l,2] = wi and matrix[l,3] = wj and wx = 1 then c++
		IF matrix[l,4] = wi and matrix[l,5] = wj and wx = 1 then c++
		IF matrix[l,6] = wi and matrix[l,7] = wj and wx = 2 then c++
		if c > 0
			c = 0
			if ybox[matrix[l,0],matrix[l,1],4] = 1 then c++
			if xbox[matrix[l,2],matrix[l,3],4] = 1 then c++
			if xbox[matrix[l,4],matrix[l,5],4] = 1 then c++
			if ybox[matrix[l,6],matrix[l,7],4] = 1 then c++
			if c = 4
				px = 0
				matrix[l,8] = 1
				i = matrix[l,0]
				j = matrix[l,1]
				if cp = 0
					p1++
					SETCONTROLTEXT w1,W1_E1,STR$(p1)
					floodfill w1,ybox[i,j,0]+10,ybox[i,j,3]+12,GREEN
				else
					p2++
					SETCONTROLTEXT w1,W1_E2,STR$(p2)
					floodfill w1,ybox[i,j,0]+10,ybox[i,j,3]+12,CYAN
				endif
			endif
		endif
	endif
next l
player()
return
endsub

SUB player()
cp = 1 - cp
if cp = 0
	SETCONTROLTEXT w1,W1_E3,"Player 1"
	SETCONTROLCOLOR w1,W1_E3,BLACK,GREEN
else
	SETCONTROLTEXT w1,W1_E3,"Player 2"
	SETCONTROLCOLOR w1,W1_E3,BLACK,CYAN
endif
RETURN
ENDSUB

DATABEGIN matrixdata
	DATA 0,0,0,0,0,1,1,0
	DATA 0,1,0,1,0,2,1,1
	DATA 0,2,0,2,0,3,1,2
	DATA 0,3,0,3,0,4,1,3
	DATA 0,4,0,4,0,5,1,4
	DATA 0,5,0,5,0,6,1,5
	DATA 0,6,0,6,0,7,1,6
	DATA 1,0,1,0,1,1,2,0
	DATA 1,1,1,1,1,2,2,1
	DATA 1,2,1,2,1,3,2,2
	DATA 1,3,1,3,1,4,2,3
	DATA 1,4,1,4,1,5,2,4
	DATA 1,5,1,5,1,6,2,5
	DATA 1,6,1,6,1,6,2,6
	DATA 2,0,2,0,2,1,3,0
	DATA 2,1,2,1,2,2,3,1
	DATA 2,2,2,2,2,3,3,2
	DATA 2,3,2,3,2,4,3,3
	DATA 2,4,2,4,2,5,3,4
	DATA 2,5,2,5,2,6,3,5
	DATA 2,6,2,6,2,7,3,6
	DATA 3,0,3,0,3,1,4,0
	DATA 3,1,3,1,3,2,4,1
	DATA 3,2,3,2,3,3,4,2
	DATA 3,3,3,3,3,4,4,3
	DATA 3,4,3,4,3,5,4,4
	DATA 3,5,3,5,3,6,4,5
	DATA 3,6,3,6,3,7,4,6
	DATA 4,0,4,0,4,1,5,0
	DATA 4,1,4,1,4,2,5,1
	DATA 4,2,4,2,4,3,5,2
	DATA 4,3,4,3,4,4,5,3
	DATA 4,4,4,4,4,5,5,4
	DATA 4,5,4,5,4,6,5,5
	DATA 4,6,4,6,4,7,5,6
	DATA 5,0,5,0,5,1,6,0
	DATA 5,1,5,1,5,2,6,1
	DATA 5,2,5,2,5,3,6,2
	DATA 5,3,5,3,5,4,6,3
	DATA 5,4,5,4,5,5,6,4
	DATA 5,5,5,5,5,6,6,5
	DATA 5,6,5,6,5,7,6,6
	DATA 6,0,6,0,6,1,7,0
	DATA 6,1,6,1,6,2,7,1
	DATA 6,2,6,2,6,3,7,2
	DATA 6,3,6,3,6,4,7,3
	DATA 6,4,6,4,6,5,7,4
	DATA 6,5,6,5,6,6,7,5
	DATA 6,6,6,6,6,7,7,6
DATAEND