'TIC TAC TOE BOT
_TITLE "TICTACTOE BOT"
RANDOMIZE TIMER
SCREEN _NEWIMAGE(250, 350, 32)
DIM SHARED col&
col& = _RGB(255, 255, 255)

'Load Position Data
DIM SHARED posx(9)
DIM SHARED posy(9)

restart:
'DRAW BOARD
'Horizontal
CLS
LINE (50, 100)-(200, 100), col&
LINE (50, 150)-(200, 150), col&
'Vertical
LINE (100, 50)-(100, 200), col&
LINE (150, 50)-(150, 200), col&

'DRAW INSTRUCTIONS
'Horizontal
LINE (25, 275)-(100, 275), col&
LINE (25, 300)-(100, 300), col&
'Vertical
LINE (50, 250)-(50, 325), col&
LINE (75, 250)-(75, 325), col&

x = 25
y = 255
FOR n = 1 TO 9
    _PRINTSTRING (x, y), STR$(n)
    x = x + 27
    IF n = 3 OR n = 6 THEN
        y = y + 27
        x = 25
    END IF
NEXT n
x = 0
y = 0

n = 0
m = 70
FOR i = 1 TO 3
    FOR x = 1 TO 3
        n = n + 1
        posx(n) = m
        m = m + 50
    NEXT x
    m = 70
NEXT i

n = 0
m = 75
FOR i = 1 TO 3
    FOR y = 1 TO 3
        n = n + 1
        posy(n) = m
    NEXT y
    m = m + 50
NEXT i


'Test Loaded Pos Data  (Remove commment)
'TestLoadData


'Test PvB
dat$ = "000000000"
prevdat$ = "000000000"
pturn = 1

'Start Loop
DO
    IF pturn = 1 THEN
        pturn = 0
        'Players Turn
        DO
            SELECT CASE INKEY$
                CASE "1"
                    IF MID$(dat$, 1, 1) = "0" THEN
                        placepos = 1
                        GOTO exitloop
                    END IF
                CASE "2"
                    IF MID$(dat$, 2, 1) = "0" THEN
                        placepos = 2
                        GOTO exitloop
                    END IF
                CASE "3"
                    IF MID$(dat$, 3, 1) = "0" THEN
                        placepos = 3
                        GOTO exitloop
                    END IF
                CASE "4"
                    IF MID$(dat$, 4, 1) = "0" THEN
                        placepos = 4
                        GOTO exitloop
                    END IF
                CASE "5"
                    IF MID$(dat$, 5, 1) = "0" THEN
                        placepos = 5
                        GOTO exitloop
                    END IF
                CASE "6"
                    IF MID$(dat$, 6, 1) = "0" THEN
                        placepos = 6
                        GOTO exitloop
                    END IF
                CASE "7"
                    IF MID$(dat$, 7, 1) = "0" THEN
                        placepos = 7
                        GOTO exitloop
                    END IF
                CASE "8"
                    IF MID$(dat$, 8, 1) = "0" THEN
                        placepos = 8
                        GOTO exitloop
                    END IF
                CASE "9"
                    IF MID$(dat$, 9, 1) = "0" THEN
                        placepos = 9
                        GOTO exitloop
                    END IF
            END SELECT
        LOOP
        exitloop:
    ELSE
        'Bots Turn
        pturn = 1
        FOR n = 1 TO 9
            IF VAL(MID$(dat$, n, 1)) - VAL(MID$(prevdat$, n, 1)) = 1 THEN
                move = n
            END IF
        NEXT n

        'Rules
        'Horizontal
        '110
        FOR m = 1 TO 3
            IF MID$(dat$, m, 1) = "1" AND MID$(dat$, m + 1, 1) = "1" THEN
                IF MID$(dat$, m + 2, 1) = "0" THEN
                    placepos = m + 2
                END IF
            END IF
        NEXT m

        '101
        FOR m = 1 TO 3
            IF MID$(dat$, m, 1) = "1" AND MID$(dat$, m + 2, 1) = "1" THEN
                IF MID$(dat$, m + 1, 1) = "0" THEN
                    placepos = m + 1
                END IF
            END IF
        NEXT m

        '011
        FOR m = 1 TO 3
            IF MID$(dat$, m + 1, 1) = "1" AND MID$(dat$, m + 2, 1) = "1" THEN
                IF MID$(dat$, m, 1) = "0" THEN
                    placepos = m
                END IF
            END IF
        NEXT m

        'Vertical
        '110
        FOR m = 1 TO 3
            IF MID$(dat$, m, 1) = "1" AND MID$(dat$, m + 3, 1) = "1" THEN
                IF MID$(dat$, m + 6, 1) = "0" THEN
                    placepos = m + 6
                END IF
            END IF
        NEXT m

        '101
        FOR m = 1 TO 3
            IF MID$(dat$, m, 1) = "1" AND MID$(dat$, m + 6, 1) = "1" THEN
                IF MID$(dat$, m + 3, 1) = "0" THEN
                    placepos = m + 3
                END IF
            END IF
        NEXT m

        '011
        FOR m = 1 TO 3
            IF MID$(dat$, m + 3, 1) = "1" AND MID$(dat$, m + 6, 1) = "1" THEN
                IF MID$(dat$, m, 1) = "0" THEN
                    placepos = m
                END IF
            END IF
        NEXT m

        'Diagonal
        'Left Down
        '110
        IF MID$(dat$, 1, 1) = "1" AND MID$(dat$, 5, 1) = "1" THEN
            IF MID$(dat$, 9, 1) = "0" THEN
                placepos = 9
            END IF
        END IF

        '101
        IF MID$(dat$, 1, 1) = "1" AND MID$(dat$, 9, 1) = "1" THEN
            IF MID$(dat$, 5, 1) = "0" THEN
                placepos = 5
            END IF
        END IF

        '011
        IF MID$(dat$, 5, 1) = "1" AND MID$(dat$, 9, 1) = "1" THEN
            IF MID$(dat$, 1, 1) = "0" THEN
                placepos = 1
            END IF
        END IF

        'Right Down
        '110
        IF MID$(dat$, 3, 1) = "1" AND MID$(dat$, 5, 1) = "1" THEN
            IF MID$(dat$, 7, 1) = "0" THEN
                placepos = 7
            END IF
        END IF

        '101
        IF MID$(dat$, 3, 1) = "1" AND MID$(dat$, 7, 1) = "1" THEN
            IF MID$(dat$, 5, 1) = "0" THEN
                placepos = 5
            END IF
        END IF

        '011
        IF MID$(dat$, 5, 1) = "1" AND MID$(dat$, 7, 1) = "1" THEN
            IF MID$(dat$, 3, 1) = "0" THEN
                placepos = 3
            END IF
        END IF


        IF move = 1 OR move = 3 OR move = 7 OR move = 9 THEN
            IF MID$(dat$, 5, 1) = "0" THEN
                placepos = 5
                GOTO endturn
            ELSE

            END IF
        END IF

        DO UNTIL MID$(dat$, placepos, 1) = "0"
            placepos = INT(RND * 9) + 1
        LOOP
    END IF

    endturn:
    IF MID$(dat$, placepos, 1) = "0" THEN
        IF pturn = 1 THEN
            prevdat$ = dat$
            MID$(dat$, placepos, 1) = "2"
        ELSE
            prevdat$ = dat$
            MID$(dat$, placepos, 1) = "1"
        END IF
    END IF

    'Print X and Os
    FOR i = 1 TO 9
        IF (MID$(dat$, i, 1) = "1") THEN
            _PRINTSTRING (posx(i), posy(i)), "X"
        ELSEIF (MID$(dat$, i, 1) = "2") THEN
            _PRINTSTRING (posx(i), posy(i)), "O"
        END IF
    NEXT i

    'Check for winner!
    'Check Horizontal Win
    FOR n = 1 TO 9 STEP 3
        IF (MID$(dat$, n, 3) = "111") THEN
            PRINT "X WINS"
            GOTO gamefinish
        ELSEIF MID$(dat$, n, 3) = "222" THEN
            PRINT "O WINS"
            GOTO gamefinish
        END IF
    NEXT n

    'Check for Vertical Win
    FOR n = 1 TO 3
        IF MID$(dat$, n, 1) = "1" AND MID$(dat$, n + 3, 1) = "1" AND MID$(dat$, n + 6, 1) = "1" THEN
            PRINT "X WINS"
            GOTO gamefinish
        ELSEIF MID$(dat$, n, 1) = "2" AND MID$(dat$, n + 3, 1) = "2" AND MID$(dat$, n + 6, 1) = "2" THEN
            PRINT "O WINS"
            GOTO gamefinish
        END IF
    NEXT n

    'Check for Diagonal Win
    IF MID$(dat$, 1, 1) = "1" AND MID$(dat$, 5, 1) = "1" AND MID$(dat$, 9, 1) = "1" THEN
        PRINT "X WINS"
        GOTO gamefinish
    ELSEIF MID$(dat$, 1, 1) = "2" AND MID$(dat$, 5, 1) = "2" AND MID$(dat$, 9, 1) = "2" THEN
        PRINT "O WINS"
        GOTO gamefinish
    END IF

    IF MID$(dat$, 3, 1) = "1" AND MID$(dat$, 5, 1) = "1" AND MID$(dat$, 7, 1) = "1" THEN
        PRINT "X WINS"
        GOTO gamefinish
    ELSEIF MID$(dat$, 3, 1) = "2" AND MID$(dat$, 5, 1) = "2" AND MID$(dat$, 7, 1) = "2" THEN
        PRINT "O WINS"
        GOTO gamefinish
    END IF

    'Check for Draw
    checkdraw = 0
    FOR n = 1 TO 9
        IF MID$(dat$, n, 1) = "0" THEN
        ELSE
            checkdraw = checkdraw + 1
        END IF
    NEXT n
    IF checkdraw = 9 THEN
        PRINT "Draw :)"
        GOTO gamefinish
    END IF
LOOP

gamefinish:
PRINT "Press any key to replay..."
DO UNTIL INKEY$ <> ""
LOOP
GOTO restart





SUB TestLoadData
    FOR i = 1 TO 9
        _PRINTSTRING (posx(i), posy(i)), "X"
    NEXT i
    _DELAY 1
    CLS

    'DRAW BOARD
    'Horizontal
    LINE (50, 100)-(200, 100), col&
    LINE (50, 150)-(200, 150), col&
    'Vertical
    LINE (100, 50)-(100, 200), col&
    LINE (150, 50)-(150, 200), col&

END SUB





