'===========================================================================
' Subject: MEANDER                            Date: 05-11-99 (21:04)       
'  Author: Nigel Traves                       Code: QB, QBasic, PDS        
'  Origin: tarot@ihalliwell.freeserve.co.u  Packet: GAMES.ABC
'===========================================================================
REM MEANDER
REM Original Game and Algorithm written by Keith David of Sussex, England
REM Originally for Dragon32 (Tandy CoCo clone)
REM
REM (Incomplete!) Conversion By Nigel Traves (Graphics need re-scaling!)
REM
REM Public Domain - Use at own risk - No warranties etc.

REM INITIALISATION AND TITLES

DEFINT A-Z
DECLARE SUB CenterPRINT (ThisLine%, ThisText$)

CONST FALSE% = 0
CONST TRUE% = NOT FALSE%
CONST WinningX1 = 198
CONST WinningY1 = 162
CONST MyColour = 15

WordsNeeded = (4 + INT(((20 + 1) + 7) / 8) * 4 * (20 + 1)) \ 2

DIM EmptyCell(WordsNeeded), X(WordsNeeded), Y(WordsNeeded), Z(WordsNeeded), A(0 TO 9, 0 TO 9)
P1$ = "BM229,122;R2NR2U14G2"
P2$ = "BM227,122;NR8U5E2R4E2U3H2L"
SCREEN 12
CLS
COLOR MyColour
CenterPRINT 2, STRING$(11, "*")
CenterPRINT 3, "* MEANDER *"
CenterPRINT 4, STRING$(11, "*")
SLEEP 2
CenterPRINT 6, "DO YOU WANT INSTRUCTIONS? (Y/N)"
DO
    I$ = INPUT$(1)
    QI = INSTR("YyNn", I$)
LOOP WHILE QI = 0
IF QI < 3 THEN                       '| INSTRUCTIONS
    Q = 9
    CenterPRINT Q, "The object of 'MEANDER' is to complete a continuous line from"
    CenterPRINT Q + 1, "the top-left corner of the board to the bottom-right corner or"
    CenterPRINT Q + 2, "to force your opponent to carry the line off the edge of the board."
    CenterPRINT Q + 4, "Simply type in the letter of the piece that you wish to play to"
    CenterPRINT Q + 5, "continue the line."
    CenterPRINT Q + 7, "The first piece will be placed on the second square of the top line,"
    CenterPRINT Q + 8, "so placing piece 'Y' will automatically LOSE the game :-)."
    CenterPRINT 24, ">> PRESS ANY KEY TO PLAY. <<"
    I$ = INPUT$(1)
END IF

REM DRAW BOARD

DO
    CLS
    FOR Y = 12 TO 112 STEP 50
        LINE (8, Y)-(28, Y + 20), MyColour, B
    NEXT Y
    GET (8, 12)-(28, 32), EmptyCell
    DRAW "BM18,12;D10NL10NR10ND10"
    CIRCLE (28, 82), 10, MyColour, 1.570796327#, 3.141592654#
    CIRCLE (8, 62), 10, MyColour, 4.71238898#, 0
    CIRCLE (8, 132), 10, MyColour, 0, 1.570796327#
    CIRCLE (28, 112), 10, MyColour, 3.141592654#, 4.71238898#
    DRAW "BM14,36;M22,48;BM14,48;M22,36"
    DRAW "BM14,86;M18,92;ND6;M22,86"
    DRAW "BM14,136;R8;M14,148;R8"
    GET (8, 12)-(28, 32), X
    GET (8, 62)-(28, 82), Y
    GET (8, 112)-(28, 132), Z
    FOR X = 48 TO 208 STEP 20
        LINE (X, 12)-(X, 172), MyColour
    NEXT X
    LINE (46, 10)-(210, 174), MyColour, B
    FOR Y = 12 TO 172 STEP 20
        LINE (48, Y)-(208, Y), MyColour
    NEXT Y
    PUT (48, 12), X, PSET
    PUT (188, 152), X, PSET
    DRAW "BM228,22;U10R6D5L6"
    DRAW "BM228,36;NU10R6"
    DRAW "BM228,50;U5NR6U4E1R4F1D9"
    DRAW "BM231,64;U5NM228,54;M234,54"
    DRAW "BM228,78;NR6U5NR4U5R6"
    DRAW "BM228,92;U10R5F1D3G1NL5M234,92"
    LINE (221, 105)-(241, 125), MyColour, B

REM PLAY

    FOR X = 0 TO 9
        FOR Y = 0 TO 9
            A(X, Y) = 0
        NEXT Y
    NEXT X
    A(1, 1) = 1
    A(8, 8) = 1
    X = 58
    Y = 22
    x1 = 78
    Y1 = 22
    P = 1
    GameWon = FALSE%
    DO
        IF x1 > 208 OR x1 < 48 OR Y1 > 172 OR Y1 < 12 THEN
            EXIT DO
        END IF
        IF P = 1 THEN
            PUT (221, 105), EmptyCell, PSET
            DRAW "C15" + P1$
            P = 2
        ELSE
            PUT (221, 105), EmptyCell, PSET
            DRAW "C15" + P2$
            P = 1
        END IF
        DO
            I$ = INPUT$(1)
            QI = INSTR("XxYyZz", I$)
        LOOP WHILE QI = 0
        SELECT CASE (ASC(UCASE$(I$)) - 87)
            CASE 1
                PUT (x1 - 10, Y1 - 10), X, PSET
                A((Y1 - 2) / 20, (x1 - 38) / 20) = 1
            CASE 2
                PUT (x1 - 10, Y1 - 10), Y, PSET
                A((Y1 - 2) / 20, (x1 - 38) / 20) = 2
            CASE 3
                PUT (x1 - 10, Y1 - 10), Z, PSET
                A((Y1 - 2) / 20, (x1 - 38) / 20) = 3
            CASE DEFAULT
        END SELECT

REM SEARCH FOR END OF LINE

        DO
            SELECT CASE A((Y1 - 2) / 20, (x1 - 38) / 20)
                CASE 1
                    IF x1 = X + 20 THEN
                        X = x1
                        Y = Y1
                        x1 = X + 20
                    ELSEIF x1 = X - 20 THEN
                        X = x1
                        Y = Y1
                        x1 = X - 20
                    ELSEIF Y1 = Y - 20 THEN
                        X = x1
                        Y = Y1
                        Y1 = Y - 20
                    ELSEIF Y1 = Y + 20 THEN
                        X = x1
                        Y = Y1
                        Y1 = Y + 20
                    END IF
                CASE 2
                    IF x1 = X + 20 THEN
                        X = x1
                        Y = Y1
                        Y1 = Y - 20
                    ELSEIF x1 = X - 20 THEN
                        X = x1
                        Y = Y1
                        Y1 = Y + 20
                    ELSEIF Y1 = Y - 20 THEN
                        X = x1
                        Y = Y1
                        x1 = X + 20
                    ELSEIF Y1 = Y + 20 THEN
                        X = x1
                        Y = Y1
                        x1 = X - 20
                    END IF
                CASE 3
                    IF x1 = X + 20 THEN
                        X = x1
                        Y = Y1
                        Y1 = Y + 20
                    ELSEIF x1 = X - 20 THEN
                        X = x1
                        Y = Y1
                        Y1 = Y - 20
                    ELSEIF Y1 = Y - 20 THEN
                        X = x1
                        Y = Y1
                        x1 = X - 20
                    ELSEIF Y1 = Y + 20 THEN
                        X = x1
                        Y = Y1
                        x1 = X + 20
                    END IF
                CASE DEFAULT
            END SELECT

            IF x1 = WinningX1 AND Y1 = WinningY1 THEN
                GameWon = TRUE%
            END IF
        LOOP UNTIL ((A((Y1 - 2) / 20, (x1 - 38) / 20) = 0) OR GameWon)
    LOOP WHILE ((A((Y1 - 2) / 20, (x1 - 38) / 20) = 0) AND NOT GameWon)

REM END TITLES

    IF GameWon THEN
        FOR Index = 1 TO 20
            SOUND 100, 1
            SOUND 150, 1
        NEXT Index
        CLS
        IF P = 2 THEN
            CenterPRINT 5, "PLAYER 1 WINS!"
        ELSE
            CenterPRINT 5, "PLAYER 2 WINS!"
        END IF
    ELSE
        FOR Index = 1 TO 20
            SOUND 100, 1
            SOUND 150, 1
        NEXT Index
        CLS
        IF P = 2 THEN
            CenterPRINT 5, "PLAYER 1 LOSES BY GOING OFF THE EDGE!"
        ELSE
            CenterPRINT 5, "PLAYER 2 LOSES BY GOING OFF THE EDGE!"
        END IF
    END IF
    SLEEP 5
    CenterPRINT 24, ">> PRESS SPACEBAR FOR ANOTHER GAME <<"
    I$ = INPUT$(1)
LOOP WHILE I$ = " "
END

SUB CenterPRINT (ThisLine%, ThisText$)
    IF ThisText$ = "" THEN
        EXIT SUB
    END IF
    IF (ThisLine% < 1) OR (ThisLine% > 25) THEN
        EXIT SUB
    END IF
    ThisColumn% = ((80 - LEN(ThisText$)) \ 2)
    LOCATE ThisLine%, ThisColumn%
    PRINT ThisText$;
END SUB
