Better code readability
authorSvjatoslav Agejenko <svjatoslav@svjatoslav.eu>
Wed, 25 Jun 2025 20:56:43 +0000 (23:56 +0300)
committerSvjatoslav Agejenko <svjatoslav@svjatoslav.eu>
Wed, 25 Jun 2025 20:56:43 +0000 (23:56 +0300)
Games/checkers.bas

index de66e46..dd6499a 100755 (executable)
@@ -1,22 +1,42 @@
-' 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)
@@ -25,315 +45,485 @@ LINE (10, 4)-(8, 5)
 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