Pawns do legal moves - Mouse driver. Includes En Passant.

by Pete

DECLARE SUB MAIN ()
DECLARE SUB SNAPTOCENTER (X%, Y%)
DECLARE SUB LEGALCHECK (OLDX%, X%, OLDY%, Y%, PIECE$, COLORIT%, LEGAL%)
DECLARE SUB BOARDMAP (B$, X%, Y%)
DECLARE SUB KEYBOARD (B$, X%, Y%)
DECLARE SUB MDRIVER (EX%, B$, X%, Y%)
TYPE RegType
AX AS INTEGER
BX AS INTEGER
CX AS INTEGER
DX AS INTEGER
BP AS INTEGER
SI AS INTEGER
DI AS INTEGER
FLAGS AS INTEGER
DS AS INTEGER
ES AS INTEGER
END TYPE

DIM SHARED MOUSE$
DIM SHARED Registers AS RegType
DIM SHARED LB%, RB%, MB%, DX%, CY%
DIM SHARED LM%, TM%, ENPASSANT$
CALL MAIN

SYSTEM


SUB BOARDMAP (B$, X%, Y%)
XX = CSRLIN: YY = POS(1)
LOCATE 25, 55: PRINT "Mouse Position: "; : PRINT SPACE$(80 - POS(1));
REM MAP FORMULA

IF (X% - TM%) >= 0 AND (X% - TM%) < 16 AND Y% >= LM% AND Y% - LM% < 40 THEN
NUMBERY$ = LTRIM$(STR$(8 - INT((X% - TM% + 1) / 2.1)))
ALPHAX$ = LCASE$(CHR$(65 + INT((Y% - LM% + 1) / 5.1)))
LOCATE 25, 72: PRINT ALPHAX$; " "; NUMBERY$;
ELSE
B$ = "OUTOFBOUNDS"
END IF

LOCATE XX, YY
END SUB

SUB KEYBOARD (B$, X%, Y%)
EX% = 1: CALL MDRIVER(EX%, B$, X%, Y%)
DO
B$ = INKEY$
EX% = 2: CALL MDRIVER(EX%, B$, X%, Y%)
IF B$ = "OUTOFBOUNDS" THEN B$ = ""
LOOP UNTIL B$ <> ""
EX% = -1: CALL MDRIVER(EX%, B$, X%, Y%)
END SUB

SUB LEGALCHECK (OLDX%, X%, OLDY%, Y%, PIECE$, COLORIT%, LEGAL%)
HOLDCOLORIT% = COLORIT%
DO
IF COLORIT% = 23 THEN MARKER% = -1 ELSE MARKER% = 1
OLDPOSX% = 8 - INT((OLDX% - TM% + 1) / 2.1)
NEWPOSX% = 8 - INT((X% - TM% + 1) / 2.1)

SELECT CASE PIECE$
CASE "P"
REM PAWNS
IF ENPASSANT$ <> "" THEN
IF VAL(ENPASSANT$) < 0 AND MARKER% > 0 OR VAL(ENPASSANT$) > 0 AND MARKER% < 0 THEN
IF ABS(OLDPOSX% - NEWPOSX%) = 1 AND X% = VAL(MID$(ENPASSANT$, 2, INSTR(ENPASSANT$, "|") - 1)) AND Y% = VAL(MID$(ENPASSANT$, INSTR(ENPASSANT$, "|") + 1)) THEN
COLORIT% = SCREEN(X% + 1, Y%, 1): COLOR COLORIT% MOD 16, COLORIT% \ 16
LOCATE OLDX%, Y% - 1
PRINT SPACE$(3);
LEGAL% = 0
EXIT DO
END IF
END IF
END IF
IF OLDPOSX% = 2 AND COLORIT% = 96 OR OLDPOSX% = 7 AND COLORIT% = 23 THEN
REM FIRST MOVE ALLOW ONE OR TWO SPACES
IF MARKER% = 1 THEN
IF OLDPOSX% - NEWPOSX% < -2 OR OLDPOSX% - NEWPOSX% > -1 THEN LEGAL% = -1
ELSE
IF OLDPOSX% - NEWPOSX% > 2 OR OLDPOSX% - NEWPOSX% < 1 THEN LEGAL% = -1
END IF
ELSE
REM LIMIT PAWN TO ONE MOVE FORWARD UNLESS CAPTURING
IF NEWPOSX% - OLDPOSX% <> 1 * MARKER% THEN LEGAL% = -1
END IF
REM CHECK FOR BLOCK
IF LEGAL% = 0 THEN
IF ABS(OLDPOSX% - NEWPOSX%) = 1 THEN
IF SCREEN(X%, Y%) <> 32 AND Y% = OLDY% THEN LEGAL% = -1
ELSE
IF SCREEN(X%, Y%) <> 32 OR SCREEN(X% + MARKER% * 2, Y%) <> 32 THEN LEGAL% = -1
END IF
END IF
IF LEGAL% = 0 THEN
REM CHECK IF IN-LINE OR CAPTURING
IF Y% <> OLDY% THEN
IF ABS(OLDPOSX% - NEWPOSX%) > 1 THEN LEGAL% = -1
IF SCREEN(X%, Y%) = 32 THEN LEGAL% = -1
IF SCREEN(X%, Y%, 1) = SCREEN(OLDX%, OLDY%, 1) THEN LEGAL% = -1
END IF
END IF
IF LEGAL% = 0 AND ABS(OLDPOSX% - NEWPOSX%) = 2 THEN
L% = Y% - 5: R% = Y% + 5
IF L% > 0 THEN IF CHR$(SCREEN(X%, L%)) = "P" THEN ENPASSANT$ = LTRIM$(STR$(X% + (2 * MARKER%))) + "|" + LTRIM$(STR$(Y%))
IF R% < 80 THEN IF CHR$(SCREEN(X%, R%)) = "P" THEN ENPASSANT$ = LTRIM$(STR$(X% + (2 * MARKER%))) + "|" + LTRIM$(STR$(Y%))
IF ENPASSANT$ <> "" THEN IF MARKER% < 0 THEN ENPASSANT$ = "-" + ENPASSANT$: EXIT DO ELSE ENPASSANT$ = "+" + ENPASSANT$: EXIT DO
END IF
REM CHECK EN PASSANT

CASE ELSE
END SELECT

IF LEGAL% = -1 THEN
REM ILLEGAL MOVE
A$ = CHR$(SCREEN(X%, Y%))
COLORIT% = SCREEN(X%, Y%, 1)
LOCATE X%, Y%: COLOR 14 + 16, 4: PRINT "X"; : SLEEP 1
LOCATE X%, Y%: COLOR COLORIT% MOD 16, COLORIT% \ 16: PRINT A$;
COLOR 7, 1
END IF
IF LEGAL% = 0 THEN ENPASSANT$ = ""
EXIT DO
LOOP
COLORIT% = HOLDCOLORIT%
END SUB

SUB MAIN
COLOR 7, 1: CLS
LM% = 3: TM% = 3: LEVEL% = 1
LOCATE TM%, LM%, 0
FOR H = 1 TO 8
FOR J = 1 TO 2
FOR I = 1 TO 8
IF H / 2 = H \ 2 THEN
IF I / 2 = I \ 2 THEN COLOR 0, 7 ELSE COLOR 7, 0
ELSE
IF I / 2 = I \ 2 THEN COLOR 7, 0 ELSE COLOR 0, 7
END IF
PRINT SPACE$(5);
NEXT I
IF H = 8 AND J = 2 THEN ELSE PRINT : LOCATE , LM%
NEXT J
NEXT H
FOR J = 1 TO 2
IF J = 1 THEN COLOR 7, 1 ELSE COLOR 0, 6: LEVEL% = 15

X = 1
A$ = "RNBKQBNR"
FOR I = 1 TO 8
LOCATE TM% + LEVEL%, X + LM%: PRINT " " + MID$(A$, I, 1) + " ";
X = X + 5
NEXT I
X = 1
FOR I = 1 TO 8
IF J = 1 THEN LOCATE TM% + LEVEL% + 2, X + LM% ELSE LOCATE TM% + LEVEL% - 2, X + LM%
PRINT " P ";
X = X + 5
NEXT I
NEXT J

REM OPTIONAL BORDER
'COLOR 7, 4: REM RED (A BIT TOO MUCH?)
COLOR 7, 0
LOCATE TM% - 1, LM% - 1
PRINT CHR$(218); STRING$(40, 196); CHR$(191)
LOCATE , LM% - 1
FOR I = 1 TO 17
PRINT CHR$(179)
LOCATE , LM% - 1
NEXT I
LOCATE TM%, LM% - 1
FOR I = 1 TO 17
LOCATE , 40 + LM%
PRINT CHR$(179)
NEXT I
LOCATE TM% - 2 + 18, LM% - 1
PRINT CHR$(192); STRING$(40, 196); CHR$(217)

REM NUMBERING
LOCATE TM% + 17: COLOR 7, 1
LOCATE , LM% + 2
FOR I = 1 TO 8
PRINT LCASE$(CHR$(64 + I)) + SPACE$(4);
NEXT I

LOCATE TM% + 1, 40 + LM% + 2
FOR I = 1 TO 8
PRINT CHR$(57 - I);
LOCATE CSRLIN + 2, 40 + LM% + 2
NEXT I

LOCATE 25, 1: PRINT "Press Esc to end";

DO
CALL KEYBOARD(B$, X%, Y%)
IF B$ = "L-CLICK" THEN
CALL SNAPTOCENTER(X%, Y%)
IF MOVESTAT% = 0 THEN
LOCATE X%, Y%
OLDX% = X%: OLDY% = Y%
PIECE$ = CHR$(SCREEN(X%, Y%))
IF PIECE$ = CHR$(32) THEN
B$ = "": REM DO OVER EMPTY SQUARE
ELSE
COLORIT% = SCREEN(X%, Y%, 1)
COLOR COLORIT% MOD 16 + 16, COLORIT% \ 16
PRINT PIECE$;
COLOR 7, 1: B$ = ""
IF COLORIT% = 23 THEN MOVESTAT% = 1 ELSE MOVESTAT% = -1
END IF
ELSE
IF OLDX% = X% AND OLDY% = Y% THEN
REM CANCEL MOVE
LOCATE X%, Y%
COLOR COLORIT% MOD 16, COLORIT% \ 16
PRINT PIECE$;
COLOR 7, 1
MOVESTAT% = 0
B$ = ""
ELSE
REM ********************Evaluate legal move here!
HOLDCOLORIT% = COLORIT%
CALL LEGALCHECK(OLDX%, X%, OLDY%, Y%, PIECE$, COLORIT%, LEGAL%)
IF LEGAL% = 0 THEN
MOVESTAT% = 0
COLORIT% = SCREEN(OLDX% - 1, OLDY%, 1)
COLOR COLORIT% MOD 16, COLORIT% \ 16
LOCATE OLDX%, OLDY% - 1
PRINT SPACE$(3);
COLORIT% = HOLDCOLORIT%
COLOR COLORIT% MOD 16, COLORIT% \ 16
LOCATE X%, Y% - 1
IF PIECE$ = "P" THEN
REM PAWN - QUEEN
IF 8 - INT((X% - TM% + 1) / 2.1) = 8 OR 8 - INT((X% - TM% + 1) / 2.1) = 1 THEN PIECE$ = "Q"
END IF
PRINT " " + PIECE$ + " ";
COLOR 7, 1
ELSE
LEGAL% = 0: REM ILLEGAL MOVE, TRY AGAIN
END IF
B$ = ""
END IF
END IF
END IF
IF B$ = CHR$(27) THEN EXIT DO
LOOP

END SUB

SUB MDRIVER (EX%, B$, X%, Y%)
STATIC MOUSEACT%
OLDX% = X%: OLDY% = Y%

REM INITIATE MOUSE
IF MOUSEACT% = 0 THEN
Registers.AX = 0: GOSUB CALLI
MOUSEACT% = 1
END IF

IF EX% = -1 THEN
REM HIDES MOUSE IF A KEY WAS PRESSED FOR NEXT MOUSE LOOP
LB1 = 0
Registers.AX = 2: GOSUB CALLI
EX% = 2
EXIT SUB
END IF

IF EX% = 1 THEN Registers.AX = 1: GOSUB CALLI

Registers.AX = 3: GOSUB CALLI

REM MOUSE LOCATION (USES X% AND Y% TO CONVERT TO 25 * 80 SCREEN SIZE)
DX% = Registers.DX%
CX% = Registers.CX%
X% = DX% \ 8 + 1: Y% = CX% \ 8 + 1

IF X% <> OLDX% OR Y% <> OLDY% THEN
CALL BOARDMAP(B$, X%, Y%)
END IF

REM MOUSE BUTTONS
LB% = Registers.BX% AND 1
RB% = (Registers.BX% AND 2) \ 2
MB% = (Registers.BX% AND 4) \ 4
IF LB% <> 0 THEN
CALL BOARDMAP(B$, X%, Y%)
REM PLACE OTHER MOUSE FEATURES HERE
IF B$ = "OUTOFBOUNDS" THEN B$ = "" ELSE B$ = "L-CLICK": REM LEFT MOUSE CLICK
END IF

REM DELAY TO SMOOTH THINGS OUT.
IF LB1 <> -1 AND LB% <> 0 THEN
DO
REGISTER.AX% = 3: GOSUB CALLI
LB% = Registers.BX% AND 1
RB% = (Registers.BX% AND 2) \ 2
MB% = (Registers.BX% AND 4) \ 4
IF LB% = 0 THEN EXIT DO
LOOP
END IF

EXIT SUB

CALLI:
CALL INTERRUPT(&H33, Registers, Registers)
RETURN

END SUB

SUB SNAPTOCENTER (X%, Y%)
CNTY% = Y% - LM%
Y% = Y% - (3 - (5 - CNTY% MOD 5))
IF X% \ 2 <> X% / 2 THEN X% = X% + 1
END SUB

------------------------------------------

There is no alternating of turns yet. Functions:

1) Left Click on a pawn.

2) Left click on a space.

3) If legal, it will move there. If not, red X.

- 2 or 1 space first move, diagonal capture, en passant, Q if in last row. Did I miss anything?

All other pieces can be moved, but only the pawns are checked for legal moves.

The biggest obstacle I see is making a function to see if the king is in check. Everything else is pretty freakin' simple.

Pete

Posted on Dec 19, 2005, 11:04 PM
from IP address 68.6.85.9

Respond to this message   

Return to Index


Response TitleAuthor and Date
Needed to exchange white/black pieces. I posted a finished phase 1 here URL:Pete on Dec 20