Pawns do legal moves - Mouse driver. Includes En Passant.by PeteDECLARE 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 from IP address 68.6.85.9 |
| Response Title | Author and Date |
| Needed to exchange white/black pieces. I posted a finished phase 1 here URL: | Pete on Dec 20 |