-' Game of checkers. Created by Svjatoslav Agejenko in 1998.
+' Game of checkers.
+' By Svjatoslav Agejenko.
+' Email: svjatoslav@svjatoslav.eu
+' Homepage: http://www.svjatoslav.eu
+'
+' Changelog:
+' 1998, Initial version
+' 2025, Improved program readability
'
' Usage:
' keys: w a z s - move around
' ENTER key - pick piece on the desk and place it to new location
-DECLARE SUB look ()
-DECLARE SUB motleb ()
-DECLARE SUB mang ()
-DECLARE SUB sisend ()
-DECLARE SUB asend ()
+DECLARE SUB CheckPossibleMoves()
+DECLARE SUB HandleMovement()
+DECLARE SUB GameLoop()
+DECLARE SUB HandleInput()
+DECLARE SUB UpdateDisplay()
DEFINT A-Z
-DIM SHARED nu(-100 TO 300) AS INTEGER
-DIM SHARED kaik AS INTEGER
-DIM SHARED looma AS INTEGER
-DIM SHARED hiir(1000)
-DIM SHARED ax1, ax2
+
+DIM SHARED boardState(-100 TO 300) AS INTEGER
+' 0 - black piece
+' 1 - white piece
+' 3 - Empty square that piece is allowed to move to
+' 4 - Empty square that is not reachable according to the game rules
+'
+' Cell address calculation (row 1--10, col 1--10):
+' cell address = ((row - 1) * 20) + col
+
+
+DIM SHARED moveMade AS INTEGER
+DIM SHARED hasMove AS INTEGER
+DIM SHARED cursorImage(1000)
+DIM SHARED cursorX, cursorY
SCREEN 2
+
+
CLS
+' Draw cursor image and store it into array for quick drawing on the screen
LINE (1, 1)-(10, 1)
LINE (1, 1)-(1, 5)
LINE (10, 1)-(6, 2)
LINE (8, 5)-(4, 3)
LINE (4, 3)-(1, 5)
PAINT (2, 2), 1
-GET (1, 1)-(10, 5), hiir
+GET (1, 1)-(10, 5), cursorImage
+
CLS
-FOR a = 0 TO 10
- LINE ((a * 40) + 20, 10)-((a * 40) + 20, 189), 1
-NEXT a
+' Draw the checkerboard grid
+FOR col = 0 TO 10
+ LINE ((col * 40) + 20, 10)-((col * 40) + 20, 189), 1
+NEXT col
-FOR a = 0 TO 20
- LINE (20, (a * 18) + 9)-(420, (a * 18) + 9), 1
-NEXT a
+FOR row = 0 TO 20
+ LINE (20, (row * 18) + 9)-(420, (row * 18) + 9), 1
+NEXT row
-FOR a = 1 TO 200
- nu(a) = 4
-NEXT a
+' Initialize the board state to empty squares
+FOR cell = 1 TO 200
+ boardState(cell) = 4
+NEXT cell
' Draw the initial checkerboard pattern.
' (alternating squares to create the checkerboard)
-FOR a = 2 TO 10 STEP 2
- FOR b = 1 TO 10 STEP 2
- PAINT ((b * 40) + 5, (a * 18) + 5)
- NEXT b
-NEXT a
-
-FOR a = 1 TO 10 STEP 2
- FOR b = 2 TO 10 STEP 2
- PAINT ((b * 40) + 5, (a * 18) + 5)
- NEXT b
-NEXT a
-
-' Place the initial pieces on the board
-FOR a = 2 TO 4 STEP 2
- FOR b = 1 TO 10 STEP 2
- nu(((a - 1) * 20) + b) = 1
- NEXT b
-NEXT a
-
-FOR a = 1 TO 4 STEP 2
- FOR b = 2 TO 10 STEP 2
- nu(((a - 1) * 20) + b) = 1
- NEXT b
-NEXT a
-
-FOR a = 8 TO 10 STEP 2
- FOR b = 1 TO 10 STEP 2
- nu(((a - 1) * 20) + b) = 0
- NEXT b
-NEXT a
-
-FOR a = 7 TO 10 STEP 2
- FOR b = 2 TO 10 STEP 2
- nu(((a - 1) * 20) + b) = 0
- NEXT b
-NEXT a
-
-FOR b = 2 TO 10 STEP 2
- nu(80 + b) = 3
-NEXT b
-
-FOR b = 1 TO 10 STEP 2
- nu(100 + b) = 3
-NEXT b
-
-asend
-kaik = 1
-mang
-
-SUB asend
+FOR row = 2 TO 10 STEP 2
+ FOR col = 1 TO 10 STEP 2
+ PAINT ((col * 40) + 5, (row * 18) + 5)
+ NEXT col
+NEXT row
+
+FOR row = 1 TO 10 STEP 2
+ FOR col = 2 TO 10 STEP 2
+ PAINT ((col * 40) + 5, (row * 18) + 5)
+ NEXT col
+NEXT row
+
+' Place the white pieces on the board
+FOR row = 2 TO 4 STEP 2
+ FOR col = 1 TO 10 STEP 2
+ boardState(((row - 1) * 20) + col) = 1
+ NEXT col
+NEXT row
+
+FOR row = 1 TO 4 STEP 2
+ FOR col = 2 TO 10 STEP 2
+ boardState(((row - 1) * 20) + col) = 1
+ NEXT col
+NEXT row
+
+' Place the black pieces on the board
+FOR row = 8 TO 10 STEP 2
+ FOR col = 1 TO 10 STEP 2
+ boardState(((row - 1) * 20) + col) = 0
+ NEXT col
+NEXT row
+
+FOR row = 7 TO 10 STEP 2
+ FOR col = 2 TO 10 STEP 2
+ boardState(((row - 1) * 20) + col) = 0
+ NEXT col
+NEXT row
+
+FOR col = 2 TO 10 STEP 2
+ boardState(80 + col) = 3
+NEXT col
+
+FOR col = 1 TO 10 STEP 2
+ boardState(100 + col) = 3
+NEXT col
+
+UpdateDisplay
+moveMade = 1
+GameLoop
+
+SUB UpdateDisplay
' Draw the pieces on the board
- FOR b = 1 TO 10
- FOR a = 1 TO 10
- v = nu(((b - 1) * 20) + a)
- SELECT CASE v
+ FOR row = 1 TO 10
+ FOR col = 1 TO 10
+ pieceType = boardState(((row - 1) * 20) + col)
+ SELECT CASE pieceType
CASE 1
- CIRCLE (a * 40, b * 18), 17, 1
- PAINT (a * 40, b * 18), 1
- CIRCLE (a * 40, b * 18), 17, 0
- CIRCLE (a * 40, b * 18), 16, 0
- LINE ((a * 40) - 16, b * 18)-((a * 40) + 16, b * 18), 0
+ CIRCLE (col * 40, row * 18), 17, 1
+ PAINT (col * 40, row * 18), 1
+ CIRCLE (col * 40, row * 18), 17, 0
+ CIRCLE (col * 40, row * 18), 16, 0
+ LINE ((col * 40) - 16, row * 18)-((col * 40) + 16, row * 18), 0
CASE 0
- CIRCLE (a * 40, b * 18), 17, 0
- PAINT (a * 40, b * 18), 0
- CIRCLE (a * 40, b * 18), 17, 1
- CIRCLE (a * 40, b * 18), 15, 1
- CIRCLE (a * 40, b * 18), 3, 1
- CIRCLE (a * 40, b * 18), 7, 1
- LINE ((a * 40) - 16, b * 18)-((a * 40) + 16, b * 18), 0
+ CIRCLE (col * 40, row * 18), 17, 0
+ PAINT (col * 40, row * 18), 0
+ CIRCLE (col * 40, row * 18), 17, 1
+ CIRCLE (col * 40, row * 18), 15, 1
+ CIRCLE (col * 40, row * 18), 3, 1
+ CIRCLE (col * 40, row * 18), 7, 1
+ LINE ((col * 40) - 16, row * 18)-((col * 40) + 16, row * 18), 0
CASE 3
- PAINT (a * 40, b * 18), 1
+ PAINT (col * 40, row * 18), 1
END SELECT
- NEXT a
- NEXT b
+ NEXT col
+ NEXT row
END SUB
-SUB look
- ' checks if there are any possible moves on the board
- looma = 0
- FOR a = 1 TO 200
- IF nu(a) = 0 AND nu(a - 21) = 1 AND nu(a - 42) = 3 THEN looma = 1
- IF nu(a) = 0 AND nu(a - 19) = 1 AND nu(a - 38) = 3 THEN looma = 1
- IF nu(a) = 0 AND nu(a + 21) = 1 AND nu(a + 42) = 3 THEN looma = 1
- IF nu(a) = 0 AND nu(a + 19) = 1 AND nu(a + 38) = 3 THEN looma = 1
- NEXT a
+SUB CheckPossibleMoves
+ ' Checks if there are any possible moves on the board
+ hasMove = 0
+ FOR cell = 1 TO 200
+ ' Check for possible jumps in all directions
+ IF boardState(cell) = 0 AND boardState(cell - 21) = 1 AND boardState(cell - 42) = 3 THEN hasMove = 1
+ IF boardState(cell) = 0 AND boardState(cell - 19) = 1 AND boardState(cell - 38) = 3 THEN hasMove = 1
+ IF boardState(cell) = 0 AND boardState(cell + 21) = 1 AND boardState(cell + 42) = 3 THEN hasMove = 1
+ IF boardState(cell) = 0 AND boardState(cell + 19) = 1 AND boardState(cell + 38) = 3 THEN hasMove = 1
+ NEXT cell
END SUB
-SUB mang
+SUB GameLoop
4
- sisend
- motleb
- look
- IF looma = 1 THEN SOUND 1234, 2
+ HandleInput
+ HandleMovement
+ CheckPossibleMoves
+ IF hasMove = 1 THEN SOUND 1234, 2
GOTO 4
END SUB
-SUB motleb
+SUB HandleMovement
3
-' Check for possible jumps (double eating)
-FOR a = 1 TO 200
- IF nu(a) = 1 AND nu(a + 21) = 0 AND nu(a + 42) = 3 AND nu(a + 61) = 0 AND nu(a + 80) = 3 THEN nu(a) = 3: nu(a + 21) = 3: nu(a + 42) = 1: kaik = 1: asend: GOTO 3
- IF nu(a) = 1 AND nu(a + 21) = 0 AND nu(a + 42) = 3 AND nu(a + 23) = 0 AND nu(a + 4) = 3 THEN nu(a) = 3: nu(a + 21) = 3: nu(a + 42) = 1: kaik = 1: asend: GOTO 3
- IF nu(a) = 1 AND nu(a + 19) = 0 AND nu(a + 38) = 3 AND nu(a + 59) = 0 AND nu(a + 80) = 3 THEN nu(a) = 3: nu(a + 19) = 3: nu(a + 38) = 1: kaik = 1: asend: GOTO 3
- IF nu(a) = 1 AND nu(a + 19) = 0 AND nu(a + 38) = 3 AND nu(a + 17) = 0 AND nu(a - 4) = 3 THEN nu(a) = 3: nu(a + 19) = 3: nu(a + 38) = 1: kaik = 1: asend: GOTO 3
- IF nu(a) = 1 AND nu(a + 21) = 0 AND nu(a + 42) = 3 AND nu(a + 63) = 0 AND nu(a + 84) = 3 THEN nu(a) = 3: nu(a + 21) = 3: nu(a + 42) = 1: kaik = 1: asend: GOTO 3
- IF nu(a) = 1 AND nu(a + 19) = 0 AND nu(a + 38) = 3 AND nu(a + 57) = 0 AND nu(a + 76) = 3 THEN nu(a) = 3: nu(a + 19) = 3: nu(a + 38) = 1: aiki = 1: asend: GOTO 3
-
- IF nu(a) = 1 AND nu(a - 21) = 0 AND nu(a - 42) = 3 AND nu(a - 61) = 0 AND nu(a - 80) = 3 THEN nu(a) = 3: nu(a - 21) = 3: nu(a - 42) = 1: kaik = 1: asend: GOTO 3
- IF nu(a) = 1 AND nu(a - 21) = 0 AND nu(a - 42) = 3 AND nu(a - 23) = 0 AND nu(a - 4) = 3 THEN nu(a) = 3: nu(a - 21) = 3: nu(a - 42) = 1: kaik = 1: asend: GOTO 3
- IF nu(a) = 1 AND nu(a - 19) = 0 AND nu(a - 38) = 3 AND nu(a - 59) = 0 AND nu(a - 80) = 3 THEN nu(a) = 3: nu(a - 19) = 3: nu(a - 38) = 1: kaik = 1: asend: GOTO 3
- IF nu(a) = 1 AND nu(a - 19) = 0 AND nu(a - 38) = 3 AND nu(a - 17) = 0 AND nu(a + 4) = 3 THEN nu(a) = 3: nu(a - 19) = 3: nu(a - 38) = 1: kaik = 1: asend: GOTO 3
- IF nu(a) = 1 AND nu(a - 21) = 0 AND nu(a - 42) = 3 AND nu(a - 63) = 0 AND nu(a - 84) = 3 THEN nu(a) = 3: nu(a - 21) = 3: nu(a - 42) = 1: kaik = 1: asend: GOTO 3
- IF nu(a) = 1 AND nu(a - 19) = 0 AND nu(a - 38) = 3 AND nu(a - 57) = 0 AND nu(a - 76) = 3 THEN nu(a) = 3: nu(a - 19) = 3: nu(a - 38) = 1: aiki = 1: asend: GOTO 3
-NEXT a
+' Check for possible jumps where a AI can eat 2 pieces at once
+FOR cell = 1 TO 200
+ IF boardState(cell) = 1 AND boardState(cell + 21) = 0 AND boardState(cell + 42) = 3 AND boardState(cell + 61) = 0 AND boardState(cell + 80) = 3 THEN
+ boardState(cell) = 3: boardState(cell + 21) = 3: boardState(cell + 42) = 1
+ moveMade = 1
+ UpdateDisplay
+ GOTO 3
+ END IF
+ IF boardState(cell) = 1 AND boardState(cell + 21) = 0 AND boardState(cell + 42) = 3 AND boardState(cell + 23) = 0 AND boardState(cell + 4) = 3 THEN
+ boardState(cell) = 3: boardState(cell + 21) = 3 : boardState(cell + 42) = 1
+ moveMade = 1
+ UpdateDisplay
+ GOTO 3
+ END IF
+ IF boardState(cell) = 1 AND boardState(cell + 19) = 0 AND boardState(cell + 38) = 3 AND boardState(cell + 59) = 0 AND boardState(cell + 80) = 3 THEN
+ boardState(cell) = 3: boardState(cell + 19) = 3 : boardState(cell + 38) = 1
+
+ moveMade = 1
+ UpdateDisplay
+ GOTO 3
+ END IF
+ IF boardState(cell) = 1 AND boardState(cell + 19) = 0 AND boardState(cell + 38) = 3 AND boardState(cell + 17) = 0 AND boardState(cell - 4) = 3 THEN
+ boardState(cell) = 3: boardState(cell + 19) = 3 : boardState(cell + 38) = 1
+
+ moveMade = 1
+ UpdateDisplay
+ GOTO 3
+ END IF
+ IF boardState(cell) = 1 AND boardState(cell + 21) = 0 AND boardState(cell + 42) = 3 AND boardState(cell + 63) = 0 AND boardState(cell + 84) = 3 THEN
+ boardState(cell) = 3: boardState(cell + 21) = 3 : boardState(cell + 42) = 1
+
+ moveMade = 1
+ UpdateDisplay
+ GOTO 3
+ END IF
+ IF boardState(cell) = 1 AND boardState(cell + 19) = 0 AND boardState(cell + 38) = 3 AND boardState(cell + 57) = 0 AND boardState(cell + 76) = 3 THEN
+ boardState(cell) = 3: boardState(cell + 19) = 3 : boardState(cell + 38) = 1
+
+ moveMade = 1
+ UpdateDisplay
+ GOTO 3
+ END IF
+
+ IF boardState(cell) = 1 AND boardState(cell - 21) = 0 AND boardState(cell - 42) = 3 AND boardState(cell - 61) = 0 AND boardState(cell - 80) = 3 THEN
+ boardState(cell) = 3: boardState(cell - 21) = 3 : boardState(cell - 42) = 1
+
+ moveMade = 1
+ UpdateDisplay
+ GOTO 3
+ END IF
+ IF boardState(cell) = 1 AND boardState(cell - 21) = 0 AND boardState(cell - 42) = 3 AND boardState(cell - 23) = 0 AND boardState(cell - 4) = 3 THEN
+ boardState(cell) = 3: boardState(cell - 21) = 3 : boardState(cell - 42) = 1
+
+ moveMade = 1
+ UpdateDisplay
+ GOTO 3
+ END IF
+ IF boardState(cell) = 1 AND boardState(cell - 19) = 0 AND boardState(cell - 38) = 3 AND boardState(cell - 59) = 0 AND boardState(cell - 80) = 3 THEN
+ boardState(cell) = 3: boardState(cell - 19) = 3 : boardState(cell - 38) = 1
+
+ moveMade = 1
+ UpdateDisplay
+ GOTO 3
+ END IF
+ IF boardState(cell) = 1 AND boardState(cell - 19) = 0 AND boardState(cell - 38) = 3 AND boardState(cell - 17) = 0 AND boardState(cell + 4) = 3 THEN
+ boardState(cell) = 3: boardState(cell - 19) = 3 : boardState(cell - 38) = 1
+
+ moveMade = 1
+ UpdateDisplay
+ GOTO 3
+ END IF
+ IF boardState(cell) = 1 AND boardState(cell - 21) = 0 AND boardState(cell - 42) = 3 AND boardState(cell - 63) = 0 AND boardState(cell - 84) = 3 THEN
+ boardState(cell) = 3: boardState(cell - 21) = 3 : boardState(cell - 42) = 1
+
+ moveMade = 1
+ UpdateDisplay
+ GOTO 3
+ END IF
+ IF boardState(cell) = 1 AND boardState(cell - 19) = 0 AND boardState(cell - 38) = 3 AND boardState(cell - 57) = 0 AND boardState(cell - 76) = 3 THEN
+ boardState(cell) = 3: boardState(cell - 19) = 3 : boardState(cell - 38) = 1
+
+ moveMade = 1
+ UpdateDisplay
+ GOTO 3
+ END IF
+NEXT cell
' Check for possible single moves (single eating)
-FOR a = 1 TO 200
- IF nu(a) = 1 AND nu(a + 21) = 0 AND nu(a + 42) = 3 THEN nu(a) = 3: nu(a + 21) = 3: nu(a + 42) = 1: GOTO 2
- IF nu(a) = 1 AND nu(a + 19) = 0 AND nu(a + 38) = 3 THEN nu(a) = 3: nu(a + 19) = 3: nu(a + 38) = 1: GOTO 2
- IF nu(a) = 1 AND nu(a - 21) = 0 AND nu(a - 42) = 3 THEN nu(a) = 3: nu(a - 21) = 3: nu(a - 42) = 1: GOTO 2
- IF nu(a) = 1 AND nu(a - 19) = 0 AND nu(a - 38) = 3 THEN nu(a) = 3: nu(a - 19) = 3: nu(a - 38) = 1: GOTO 2
-NEXT a
-
-' Check for possible captures (to protect your pieces)
-FOR a = 1 TO 200
- IF nu(a) = 1 AND nu(a + 19) = 3 AND nu(a + 21) = 3 AND nu(a + 40) = 1 AND nu(a + 38) = 3 AND nu(a + 61) = 0 THEN nu(a) = 3: nu(a + 19) = 1: GOTO 2
- IF nu(a) = 1 AND nu(a + 19) = 3 AND nu(a + 21) = 0 AND nu(a + 40) = 1 AND nu(a + 38) = 3 AND nu(a + 61) = 0 THEN nu(a) = 3: nu(a + 19) = 1: GOTO 2
- IF nu(a) = 1 AND nu(a + 19) = 3 AND nu(a + 21) = 3 AND nu(a + 40) = 1 AND nu(a + 38) = 1 AND nu(a + 61) = 0 THEN nu(a) = 3: nu(a + 19) = 1: GOTO 2
- IF nu(a) = 1 AND nu(a + 19) = 3 AND nu(a + 21) = 0 AND nu(a + 40) = 1 AND nu(a + 38) = 1 AND nu(a + 61) = 0 THEN nu(a) = 3: nu(a + 19) = 1: GOTO 2
-
- IF nu(a - 2) = 1 AND nu(a + 19) = 3 AND nu(a) = 3 AND nu(a + 40) = 1 AND nu(a + 38) = 3 AND nu(a + 61) = 0 THEN nu(a - 2) = 3: nu(a + 19) = 1: GOTO 2
- IF nu(a - 2) = 1 AND nu(a + 19) = 3 AND nu(a) = 1 AND nu(a + 40) = 1 AND nu(a + 38) = 3 AND nu(a + 61) = 0 THEN nu(a - 2) = 3: nu(a + 19) = 1: GOTO 2
- IF nu(a - 2) = 1 AND nu(a + 19) = 3 AND nu(a) = 3 AND nu(a + 40) = 1 AND nu(a + 38) = 1 AND nu(a + 61) = 0 THEN nu(a - 2) = 3: nu(a + 19) = 1: GOTO 2
- IF nu(a - 2) = 1 AND nu(a + 19) = 3 AND nu(a) = 1 AND nu(a + 40) = 1 AND nu(a + 38) = 1 AND nu(a + 61) = 0 THEN nu(a - 2) = 3: nu(a + 19) = 1: GOTO 2
-NEXT a
-
-' Check for possible moves to the edge
-FOR a = 1 TO 200
- IF nu(a) = 1 AND nu(a + 2) = 4 AND nu(a + 21) = 3 THEN nu(a) = 3: nu(a + 21) = 1: GOTO 2
- IF nu(a) = 1 AND nu(a - 2) = 4 AND nu(a + 19) = 3 THEN nu(a) = 3: nu(a + 19) = 1: GOTO 2
-NEXT a
+FOR cell = 1 TO 200
+ IF boardState(cell) = 1 AND boardState(cell + 21) = 0 AND boardState(cell + 42) = 3 THEN
+ boardState(cell) = 3: boardState(cell + 21) = 3 : boardState(cell + 42) = 1
+
+ GOTO 2
+ END IF
+ IF boardState(cell) = 1 AND boardState(cell + 19) = 0 AND boardState(cell + 38) = 3 THEN
+ boardState(cell) = 3: boardState(cell + 19) = 3 : boardState(cell + 38) = 1
+
+ GOTO 2
+ END IF
+ IF boardState(cell) = 1 AND boardState(cell - 21) = 0 AND boardState(cell - 42) = 3 THEN
+ boardState(cell) = 3: boardState(cell - 21) = 3 : boardState(cell - 42) = 1
+
+ GOTO 2
+ END IF
+ IF boardState(cell) = 1 AND boardState(cell - 19) = 0 AND boardState(cell - 38) = 3 THEN
+ boardState(cell) = 3: boardState(cell - 19) = 3 : boardState(cell - 38) = 1
+
+ GOTO 2
+ END IF
+NEXT cell
+
+' Check for possible defensive moves (to protect own pieces)
+FOR cell = 1 TO 200
+ IF boardState(cell) = 1 AND boardState(cell + 19) = 3 AND boardState(cell + 21) = 3 AND boardState(cell + 40) = 1 AND boardState(cell + 38) = 3 AND boardState(cell + 61) = 0 THEN
+ boardState(cell) = 3: boardState(cell + 19) = 1
+
+ GOTO 2
+ END IF
+ IF boardState(cell) = 1 AND boardState(cell + 19) = 3 AND boardState(cell + 21) = 0 AND boardState(cell + 40) = 1 AND boardState(cell + 38) = 3 AND boardState(cell + 61) = 0 THEN
+ boardState(cell) = 3: boardState(cell + 19) = 1
+
+ GOTO 2
+ END IF
+ IF boardState(cell) = 1 AND boardState(cell + 19) = 3 AND boardState(cell + 21) = 3 AND boardState(cell + 40) = 1 AND boardState(cell + 38) = 1 AND boardState(cell + 61) = 0 THEN
+ boardState(cell) = 3: boardState(cell + 19) = 1
+
+ GOTO 2
+ END IF
+ IF boardState(cell) = 1 AND boardState(cell + 19) = 3 AND boardState(cell + 21) = 0 AND boardState(cell + 40) = 1 AND boardState(cell + 38) = 1 AND boardState(cell + 61) = 0 THEN
+ boardState(cell) = 3: boardState(cell + 19) = 1
+
+ GOTO 2
+ END IF
+
+ IF boardState(cell - 2) = 1 AND boardState(cell + 19) = 3 AND boardState(cell) = 3 AND boardState(cell + 40) = 1 AND boardState(cell + 38) = 3 AND boardState(cell + 61) = 0 THEN
+ boardState(cell - 2) = 3: boardState(cell + 19) = 1
+
+ GOTO 2
+ END IF
+ IF boardState(cell - 2) = 1 AND boardState(cell + 19) = 3 AND boardState(cell) = 1 AND boardState(cell + 40) = 1 AND boardState(cell + 38) = 3 AND boardState(cell + 61) = 0 THEN
+ boardState(cell - 2) = 3: boardState(cell + 19) = 1
+
+ GOTO 2
+ END IF
+ IF boardState(cell - 2) = 1 AND boardState(cell + 19) = 3 AND boardState(cell) = 3 AND boardState(cell + 40) = 1 AND boardState(cell + 38) = 1 AND boardState(cell + 61) = 0 THEN
+ boardState(cell - 2) = 3: boardState(cell + 19) = 1
+
+ GOTO 2
+ END IF
+ IF boardState(cell - 2) = 1 AND boardState(cell + 19) = 3 AND boardState(cell) = 1 AND boardState(cell + 40) = 1 AND boardState(cell + 38) = 1 AND boardState(cell + 61) = 0 THEN
+ boardState(cell - 2) = 3: boardState(cell + 19) = 1
+
+ GOTO 2
+ END IF
+NEXT cell
+
+' Check for possible moves to the board edges (to protect own pieces)
+FOR cell = 1 TO 200
+ IF boardState(cell) = 1 AND boardState(cell + 2) = 4 AND boardState(cell + 21) = 3 THEN
+ boardState(cell) = 3: boardState(cell + 21) = 1
+
+ GOTO 2
+ END IF
+ IF boardState(cell) = 1 AND boardState(cell - 2) = 4 AND boardState(cell + 19) = 3 THEN
+ boardState(cell) = 3: boardState(cell + 19) = 1
+
+ GOTO 2
+ END IF
+NEXT cell
' Check for possible moves to the corner (safe moves)
-FOR a = 1 TO 200
- IF nu(a) = 1 AND nu(a + 19) = 3 AND nu(a + 38) = 3 AND nu(a + 40) = 3 THEN nu(a) = 3: nu(a + 19) = 1: GOTO 2
- IF nu(a) = 1 AND nu(a + 21) = 3 AND nu(a + 42) = 3 AND nu(a + 40) = 3 THEN nu(a) = 3: nu(a + 21) = 1: GOTO 2
+FOR cell = 1 TO 200
+ IF boardState(cell) = 1 AND boardState(cell + 19) = 3 AND boardState(cell + 38) = 3 AND boardState(cell + 40) = 3 THEN
+ boardState(cell) = 3: boardState(cell + 19) = 1
+
+ GOTO 2
+ END IF
+ IF boardState(cell) = 1 AND boardState(cell + 21) = 3 AND boardState(cell + 42) = 3 AND boardState(cell + 40) = 3 THEN
+ boardState(cell) = 3: boardState(cell + 21) = 1
+
+ GOTO 2
+ END IF
- IF nu(a) = 1 AND nu(a + 19) = 3 AND nu(a + 38) = 1 AND nu(a + 40) = 3 THEN nu(a) = 3: nu(a + 19) = 1: GOTO 2
- IF nu(a) = 1 AND nu(a + 21) = 3 AND nu(a + 42) = 1 AND nu(a + 40) = 3 THEN nu(a) = 3: nu(a + 21) = 1: GOTO 2
+ IF boardState(cell) = 1 AND boardState(cell + 19) = 3 AND boardState(cell + 38) = 1 AND boardState(cell + 40) = 3 THEN
+ boardState(cell) = 3: boardState(cell + 19) = 1
- IF nu(a) = 1 AND nu(a + 19) = 3 AND nu(a + 38) = 3 AND nu(a + 40) = 1 THEN nu(a) = 3: nu(a + 19) = 1: GOTO 2
- IF nu(a) = 1 AND nu(a + 21) = 3 AND nu(a + 42) = 3 AND nu(a + 40) = 1 THEN nu(a) = 3: nu(a + 21) = 1: GOTO 2
+ GOTO 2
+ END IF
+ IF boardState(cell) = 1 AND boardState(cell + 21) = 3 AND boardState(cell + 42) = 1 AND boardState(cell + 40) = 3 THEN
+ boardState(cell) = 3: boardState(cell + 21) = 1
- IF nu(a) = 1 AND nu(a + 19) = 3 AND nu(a + 38) = 1 AND nu(a + 40) = 1 THEN nu(a) = 3: nu(a + 19) = 1: GOTO 2
- IF nu(a) = 1 AND nu(a + 21) = 3 AND nu(a + 42) = 1 AND nu(a + 40) = 1 THEN nu(a) = 3: nu(a + 21) = 1: GOTO 2
-NEXT a
+ GOTO 2
+ END IF
-' Check for possible moves to the middle (useless moves)
-FOR a = 1 TO 200
- IF nu(a) = 1 AND nu(a + 21) = 3 THEN nu(a) = 3: nu(a + 21) = 1: GOTO 2
- IF nu(a) = 1 AND nu(a + 19) = 3 THEN nu(a) = 3: nu(a + 19) = 1: GOTO 2
-NEXT a
+ IF boardState(cell) = 1 AND boardState(cell + 19) = 3 AND boardState(cell + 38) = 3 AND boardState(cell + 40) = 1 THEN
+ boardState(cell) = 3: boardState(cell + 19) = 1
+
+ GOTO 2
+ END IF
+ IF boardState(cell) = 1 AND boardState(cell + 21) = 3 AND boardState(cell + 42) = 3 AND boardState(cell + 40) = 1 THEN
+ boardState(cell) = 3: boardState(cell + 21) = 1
+
+ GOTO 2
+ END IF
+
+ IF boardState(cell) = 1 AND boardState(cell + 19) = 3 AND boardState(cell + 38) = 1 AND boardState(cell + 40) = 1 THEN
+ boardState(cell) = 3: boardState(cell + 19) = 1
+
+ GOTO 2
+ END IF
+ IF boardState(cell) = 1 AND boardState(cell + 21) = 3 AND boardState(cell + 42) = 1 AND boardState(cell + 40) = 1 THEN
+ boardState(cell) = 3: boardState(cell + 21) = 1
+
+ GOTO 2
+ END IF
+NEXT cell
+
+' Check for any remaining moves that can be made
+FOR cell = 1 TO 200
+ IF boardState(cell) = 1 AND boardState(cell + 21) = 3 THEN
+ boardState(cell) = 3: boardState(cell + 21) = 1
+
+ GOTO 2
+ END IF
+ IF boardState(cell) = 1 AND boardState(cell + 19) = 3 THEN
+ boardState(cell) = 3: boardState(cell + 19) = 1
+
+ GOTO 2
+ END IF
+NEXT cell
LOCATE 4, 5
-PRINT " S I N U V O I T"
+PRINT " Y O U W O N !"
END
GOTO 3
2
-asend
+UpdateDisplay
9
END SUB
-SUB sisend
- DIM asdf(1000)
+SUB HandleInput
+ DIM tempImage(1000)
- p = 1
+ inputPhase = 1
5
- a = ax1
- b = ax2
+ cursorX = ax1
+ cursorY = ax2
7
- IF p = 1 THEN
- LOCATE 1, 70
- PRINT "Kust !"
+ IF inputPhase = 1 THEN
+ LOCATE 1, 60
+ PRINT "From where ?"
END IF
- IF p = 2 THEN
- LOCATE 1, 70
- PRINT "kuhu !"
+ IF inputPhase = 2 THEN
+ LOCATE 1, 60
+ PRINT "To where ? "
END IF
- LOCATE 2, 60
- qw = (((b \ 18) - 1) * 20) + (a \ 40)
- PRINT qw
+ selectedCell = (((cursorY \ 18) - 1) * 20) + (cursorX \ 40)
+ 'LOCATE 2, 60
+ 'PRINT selectedCell
- GET (a, b)-(a + 10, b + 10), asdf
- PUT (a, b), hiir, PSET
+ GET (cursorX, cursorY)-(cursorX + 10, cursorY + 10), tempImage
+ PUT (cursorX, cursorY), cursorImage, PSET
- a$ = INPUT$(1)
- PUT (a, b), asdf, PSET
+ key$ = INPUT$(1)
+ PUT (cursorX, cursorY), tempImage, PSET
- IF p = 2 AND a$ = CHR$(13) THEN
- a2 = qw
- ax1 = a
- ax2 = b
+ IF inputPhase = 2 AND key$ = CHR$(13) THEN
+ destinationCell = selectedCell
+ cursorX = ax1
+ cursorY = ax2
GOTO 8
END IF
- IF p = 1 AND a$ = CHR$(13) THEN
- a1 = qw
- p = 2
+ IF inputPhase = 1 AND key$ = CHR$(13) THEN
+ sourceCell = selectedCell
+ inputPhase = 2
END IF
- IF a$ = "q" THEN
+ IF key$ = "q" THEN
END
END IF
- IF a$ = "s" THEN
- a = a + 40
+ IF key$ = "s" THEN
+ cursorX = cursorX + 40
END IF
- IF a$ = "a" THEN
- a = a - 40
+ IF key$ = "a" THEN
+ cursorX = cursorX - 40
END IF
- IF a$ = "w" THEN
- b = b - 18
+ IF key$ = "w" THEN
+ cursorY = cursorY - 18
END IF
- IF a$ = "z" THEN
- b = b + 18
+ IF key$ = "z" THEN
+ cursorY = cursorY + 18
END IF
- IF a < 1 THEN
- a = 1
+ IF cursorX < 1 THEN
+ cursorX = 1
END IF
- IF b < 1 THEN
- b = 1
+ IF cursorY < 1 THEN
+ cursorY = 1
END IF
GOTO 7
8
- kaik = 1
-
- LOCATE 3, 60
+ moveMade = 1
- PRINT a1; "-"; a2
+ 'LOCATE 3, 60
+ 'PRINT sourceCell; "-"; destinationCell
10
' This section controls the movement of pieces on the board
- IF a1 = a2 + 19 AND nu(a1) = 0 AND nu(a2) = 3 THEN
+ IF sourceCell = destinationCell + 19 AND boardState(sourceCell) = 0 AND boardState(destinationCell) = 3 THEN
BEEP
- SWAP nu(a1), nu(a2)
+ SWAP boardState(sourceCell), boardState(destinationCell)
END IF
- IF a1 = a2 + 21 AND nu(a1) = 0 AND nu(a2) = 3 THEN
+ IF sourceCell = destinationCell + 21 AND boardState(sourceCell) = 0 AND boardState(destinationCell) = 3 THEN
BEEP
- SWAP nu(a1), nu(a2)
+ SWAP boardState(sourceCell), boardState(destinationCell)
END IF
- zxcv = 0
+ captureMade = 0
- IF a1 = a2 + 42 AND nu(a1) = 0 AND nu(a2) = 3 AND nu(a2 + 21) = 1 THEN
+ IF sourceCell = destinationCell + 42 AND boardState(sourceCell) = 0 AND boardState(destinationCell) = 3 AND boardState(destinationCell + 21) = 1 THEN
BEEP
- SWAP nu(a1), nu(a2)
- nu(a2 + 21) = 3
- zxcv = 1
+ SWAP boardState(sourceCell), boardState(destinationCell)
+ boardState(destinationCell + 21) = 3
+ captureMade = 1
END IF
- IF a1 = a2 + 38 AND nu(a1) = 0 AND nu(a2) = 3 AND nu(a2 + 19) = 1 THEN
+ IF sourceCell = destinationCell + 38 AND boardState(sourceCell) = 0 AND boardState(destinationCell) = 3 AND boardState(destinationCell + 19) = 1 THEN
BEEP
- SWAP nu(a1), nu(a2)
- nu(a2 + 19) = 3
- zxcv = 1
+ SWAP boardState(sourceCell), boardState(destinationCell)
+ boardState(destinationCell + 19) = 3
+ captureMade = 1
END IF
- IF a1 = a2 - 42 AND nu(a1) = 0 AND nu(a2) = 3 AND nu(a2 - 21) = 1 THEN
+ IF sourceCell = destinationCell - 42 AND boardState(sourceCell) = 0 AND boardState(destinationCell) = 3 AND boardState(destinationCell - 21) = 1 THEN
BEEP
- SWAP nu(a1), nu(a2)
- nu(a2 - 21) = 3
- zxcv = 1
+ SWAP boardState(sourceCell), boardState(destinationCell)
+ boardState(destinationCell - 21) = 3
+ captureMade = 1
END IF
- IF a1 = a2 - 38 AND nu(a1) = 0 AND nu(a2) = 3 AND nu(a2 - 19) = 1 THEN
+ IF sourceCell = destinationCell - 38 AND boardState(sourceCell) = 0 AND boardState(destinationCell) = 3 AND boardState(destinationCell - 19) = 1 THEN
BEEP
- SWAP nu(a1), nu(a2)
- nu(a2 - 19) = 3
- zxcv = 1
+ SWAP boardState(sourceCell), boardState(destinationCell)
+ boardState(destinationCell - 19) = 3
+ captureMade = 1
END IF
- asend
+ UpdateDisplay
- IF zxcv = 1 THEN
- look
- IF looma = 1 THEN
+ IF captureMade = 1 THEN
+ CheckPossibleMoves
+ IF hasMove = 1 THEN
SOUND 1234, 1
- p = 2
- a1 = a2
+ inputPhase = 2
+ sourceCell = destinationCell
GOTO 5
END IF
END IF