' One Check is a program by David Ahl from his book: "Basic Computer Games Microcomputer Edition"
' As found at https://archive.org/details/Basic_Computer_Games_Microcomputer_Edition_1978_Creative_Computing
' This BASIC Anywhere Machine port, significantly modded, by Charlie
' is based on another version of David Ahl's program found at https://hwiegman.home.xs4all.nl/gw-games/1CHECK.BAS.html
' MODS:
' * Code significanly reorganized to use GOSUB subroutines instead of GOTO
' * Modified to use mouse/touch to choose checker pieces and move destinations
' * Modified to use character-based graphics and colour
' NOTE: Any remaining line numbers are breadcrumps to the original source code
' ' This program exported from BASIC Anywhere Machine (Version [5.2.3].[2024.07.14.16.44]) on 2024.09.03 at 00:36 (Coordinated Universal Time)
GOSUB 💦IntroScreen➔
' 🔶🔶🔶🔶 Declarations
SCREEN _NEWIMAGE(192,80,0)
LETCHR$ (1, _
REPLACE$(" . . . . . . . . ", " ", "") + _
REPLACE$(" . X X X X X X . ", " ", "") + _
REPLACE$(" X X X . . X X X ", " ", "") + _
REPLACE$(" X . X X X X . X ", " ", "") + _
REPLACE$(" X . X X X X . X ", " ", "") + _
REPLACE$(" X X X . . X X X ", " ", "") + _
REPLACE$(" . X X X X X X . ", " ", "") + _
REPLACE$(" . . . . . . . . ", " ", "") )
68 DIM AS STRING A(64)
' 🔶🔶🔶🔶 Main Program
GOSUB 🆕ResetTheGame➔
DO
WHILE NOT _MOUSEBUTTON : WEND
WHILE _MOUSEBUTTON : xpos = _MOUSEX : ypos = _MOUSEY : WEND
selected_pos = ( xpos DIV 24 ) + 1 + (ypos DIV 8) * 8
IF BETWEEN(selected_pos,1,64) THEN
IF A(selected_pos)=CHR$(1) THEN F = selected_pos : GOSUB 🎨PrintTheBoard➔
IF BETWEEN(F,1,64) AND A(selected_pos)=" " THEN T = selected_pos : GOSUB ✅CheckLegalityOfMove➔
END IF
IF BETWEEN(selected_pos,73,76) THEN GOSUB 📊EndGameSummary➔
LOOP
' 🔶🔶🔶🔶 Subroutines
✅CheckLegalityOfMove➔:
118 REM *** CHECK LEGALITY OF MOVE
120 F1=INT((F-1)/8)
130 F2=F-8*F1
140 T1=INT((T-1)/8)
150 T2=T-8*T1
160 IF F1>7 THEN 230
170 IF T1>7 THEN 230
180 IF F2>8 THEN 230
190 IF T2>8 THEN 230
200 IF ABS(F1-T1)<>2 THEN 230
210 IF ABS(F2-T2)<>2 THEN 230
212 IF A((T+F)/2)=" " THEN 230
215 IF A(F)=" " THEN 230
220 IF A(T)=CHR$(1) THEN 230
225 GOSUB 🔃UpdateTheBoard➔
F = 0 : T = 0 : GOTO 240
230 ALERT( "ILLEGAL MOVE. TRY AGAIN..." )
240
RETURN
🔃UpdateTheBoard➔:
245 REM *** UPDATE BOARD
250 A(T)=CHR$(1)
260 A(F)=" "
270 A((T+F)/2)=" "
290 M=M+1
' This subroutine flows into PrintTheBoard
🎨PrintTheBoard➔:
310 REM *** PRINT BOARD
CLS
340 FOR J=1 TO 57 STEP 8
IF ODD THEN ODD = FALSE ELSE ODD = TRUE
IF ODD THEN pos_color = 0 ELSE pos_color = 6
350 FOR I=J TO J+7
IF A(I) = CHR$(1) AND I = F THEN forecolor = 14 ELSE forecolor = 15
COLOR forecolor, pos_color
360 PRINT " " + A(I) + " ";
IF pos_color = 0 THEN pos_color = 6 ELSE pos_color = 0
370 NEXT I
380 ' PRINT
390 NEXT J
COLOR 7
400 PRINT STRING$(24, CHR$(205)) + "DONE";
RETURN
📊EndGameSummary➔:
490 REM *** END GAME SUMMARY
500 S=0
510 FOR I=1 TO 64
520 S=S+ABS(A(I) = CHR$(1))
530 NEXT I
ALERT("YOU MADE " + M + " JUMPS AND HAD " + S + " PIECES REMAINING ON THE BOARD. ")
F = 0 : T = 0
GOSUB 🆕ResetTheGame➔
RETURN
🆕ResetTheGame➔:
80 FOR J=1 TO 64
82 A(J)=CHR$(1)
84 NEXT J
86 FOR J=19 TO 43 STEP 8
88 FOR I=J TO J+3
90 A(I)=" "
92 NEXT I
94 NEXT J
96 M=0
GOSUB 🎨PrintTheBoard➔
RETURN
💦IntroScreen➔:
SCREEN 12
COLOR 14
5 PRINT
PRINT "SOLITAIRE CHECKER PUZZLE"
PRINT
PRINT "ORIGINAL CODE LOGIC BY DAVID AHL"
PRINT "ADAPTED BY CHARLIE VENIOT FOR BASIC ANYWHERE MACHINE"
20 PRINT "48 CHECKERS ARE PLACED ON THE 2 OUTSIDE SPACES OF A"
25 PRINT "STANDARD 64-SQUARE CHECKERBOARD. THE OBJECT IS TO"
30 PRINT "REMOVE AS MANY CHECKERS AS POSSIBLE BY DIAGONAL JUMPS"
35 PRINT "(AS IN STANDARD CHECKERS)."
PRINT "SELECT A CHECKER TO MOVE BY CLICKING/TOUCHING IT."
PRINT "THEN SELECT THE DESTINATION TILE THE CHECKER WILL LAND ON"
PRINT "AFTER JUMPING OVER ANOTHER CHECKER."
50 PRINT "WHEN YOU HAVE NO POSSIBLE JUMPS REMAINING,"
60 PRINT "CLICK/TOUCH 'DONE'"
62 PRINT
PRINT "PRESS ANY KEY TO CONTINUE"
SLEEP
RETURN