100 REM SUDOKU 110 REM MJMahon - June 17, 2006 120 REM 130 REM Solver adapted from code 140 REM writen by Scott Hemphill 150 REM 160 REM 07/13/06 - Removed dependence on 80-col firmware 170 REM 07/15/06 - Moved screen drawing to M/L 180 : 190 REM Initialize 200 D$ = CHR$ (4) 210 SOLVER = 8192: REM Load at $2000 220 DRWSCR = SOLVER + 3: REM Draw grid screen 230 CLRBOT = DRWSCR + 3: REM Clear bottom 3 lines 240 PRINT D$"bload sudoku.solver,a"SOLVER 250 KBD = 12 * 4096: REM Keyboard 260 RC = 768: REM Return code: 0 = complete, 1 = inconsistent, 2 = stopped 270 SC = RC + 1: REM Solution count (8 bytes) 280 GD = SC + 8: REM 9x9 digit grid 290 : 300 PRINT CHR$ (21): PRINT D$"pr#0": REM 40-col screen 310 GOSUB 1230: REM Show Help screen 320 X = 1:Y = 1:OX = X:OY = Y 330 GOSUB 1380: REM Clear Grid 340 GOSUB 1420: REM Draw Grid 350 : 360 REM Edit grid loop 370 C$ = " ":D = PEEK (GD + OX - 1 + 9 * (OY - 1)): IF D THEN C$ = CHR$ (D) 380 HTAB 4 * OX: VTAB 2 * OY + 2: PRINT C$; 390 C$ = " ":D = PEEK (GD + X - 1 + 9 * (Y - 1)): IF D THEN C$ = CHR$ (D) 400 HTAB 4 * X: VTAB 2 * Y + 2: INVERSE : PRINT C$;: NORMAL 410 OX = X:OY = Y 420 REM Keyboard loop 430 IF PEEK (KBD) < 128 GOTO 430 440 GET A$:A = ASC (A$) 450 IF A = 8 OR A$ = "J" OR A$ = "j" GOTO 650: REM Left 460 IF A = 21 OR A$ = "K" OR A$ = "k" GOTO 610: REM Right 470 IF A = 10 OR A$ = "M" OR A$ = "m" GOTO 690: REM Down 480 IF A = 11 OR A$ = "I" OR A$ = "i" GOTO 730: REM Up 490 IF "1" < = A$ AND A$ < = "9" THEN POKE GD + X - 1 + 9 * (Y - 1),A: GOTO 610 500 IF A$ = " " OR A$ = "0" THEN POKE GD + X - 1 + 9 * (Y - 1),0: GOTO 610 510 IF A = 24 GOTO 330: REM ctl-X Clear grid 520 IF A$ = "?" OR A$ = "/" THEN GOSUB 1230: GOTO 340: REM Help 530 IF A = 12 GOTO 770: REM ctl-L to load from disk 540 IF A = 19 GOTO 840: REM ctl-S to save to disk 550 IF A = 16 GOTO 900: REM ctl-P to print puzzle 560 IF A = 13 GOTO 1070: REM RETURN to solve 570 IF A = 27 THEN CALL CLRBOT: VTAB 22: END : REM Exit 580 GOTO 370: REM Ignore other keys 590 : 600 REM Cursor right toroidally 610 X = X + 1: IF X > 9 THEN X = 1:Y = Y + 1: IF Y > 9 THEN Y = 1 620 GOTO 370 630 : 640 REM Cursor left toroidally 650 X = X - 1: IF X < 1 THEN X = 9:Y = Y - 1: IF Y < 1 THEN Y = 9 660 GOTO 370 670 : 680 REM Cursor down toroidally 690 Y = Y + 1: IF Y > 9 THEN Y = 1:X = X + 1: IF X > 9 THEN X = 1 700 GOTO 370 710 : 720 REM Cursor up toroidally 730 Y = Y - 1: IF Y < 1 THEN Y = 9:X = X - 1: IF X < 1 THEN X = 9 740 GOTO 370 750 : 760 REM Load grid 770 CALL CLRBOT 780 VTAB 23: INPUT "Load grid (RETURN for CAT): ";F$ 790 IF F$ = "" THEN PRINT D$"cat puzzles": GOTO 770 800 PRINT D$"bload puzzles/"F$",a"GD",L81" 810 GOTO 340 820 : 830 REM Save grid 840 CALL CLRBOT 850 VTAB 23: INPUT "Save grid (RETURN for CAT) as: ";F$ 860 IF F$ = "" THEN PRINT D$"cat puzzles": GOTO 840 870 PRINT D$"bsave puzzles/"F$",a"GD",L81" 880 GOTO 340 890 : 900 REM Print grid 910 CALL CLRBOT 920 VTAB 23: INPUT "Printer slot 1-7 (other to cancel): ";A$ 930 IF A$ < "1" OR A$ > "7" GOTO 340 940 PRINT D$"pr#"A$: REM Select printer 950 FOR J = 1 TO 9 960 V = 9 * (J - 1) 970 FOR I = 1 TO 9 980 G$ = ".":D = PEEK (GD + I - 1 + V): IF D THEN G$ = CHR$ (D) 990 PRINT " "G$; 1000 NEXT I 1010 PRINT 1020 NEXT J 1030 PRINT : PRINT 1040 PRINT D$"pr#0": REM 40-col screen 1050 GOTO 340 1060 : 1070 REM Solve puzzle 1080 CALL CLRBOT: VTAB 23 1090 PRINT "Solving...";: CALL SOLVER 1100 R = PEEK (RC): REM Solver return code 1110 IF R = 1 THEN CALL CLRBOT: VTAB 22: PRINT "Grid is inconsistent.": GOTO 1190 1120 N = PEEK (SC + 1) * 256 + PEEK (SC): REM (Only for N < 65536) 1130 CALL CLRBOT: VTAB 22 1140 IF N = 0 THEN PRINT "No solutions found." 1150 IF R = 0 AND N = 1 THEN PRINT "Unique solution found." 1160 IF R = 2 AND N = 1 THEN PRINT "One solution found." 1170 IF R = 0 AND N > 1 THEN PRINT "All "N" solutions found." 1180 IF R = 2 AND N > 1 THEN PRINT N" solutions found." 1190 PRINT "(Press any key to return to edit.)" 1200 GET A$: GOTO 340: REM Redraw grid 1210 : 1220 REM Help screen 1230 HOME : PRINT " SUDOKU Help": PRINT 1240 PRINT "Use arrows or IJKM to move cursor" 1250 PRINT "1-9 and Space (or 0) to enter data": PRINT 1260 PRINT "ctl-L to Load puzzle" 1270 PRINT "ctl-S to Save puzzle" 1280 PRINT "ctl-P to Print puzzle" 1290 PRINT "ctl-X to clear puzzle" 1300 PRINT "Return to solve puzzle" 1310 PRINT "? or / to display this screen" 1320 PRINT "Escape to exit to BASIC": PRINT 1330 PRINT "" 1340 GET A$ 1350 RETURN 1360 : 1370 REM Clear grid 1380 FOR I = 0 TO 80: POKE GD + I,0: NEXT 1390 RETURN 1400 : 1410 REM Draw grid 1420 HOME : CALL DRWSCR 1430 RETURN