SUDOKU, Fehler korrigiert

Spielprogramme für den Zeitvertreib
Antworten
Benutzeravatar
ein Thüringer
Beiträge: 49
Registriert: 29.08.2021, 11:04

SUDOKU, Fehler korrigiert

Beitrag von ein Thüringer »

Auf einer Klubdiskette wie auch auf der Homepage https://joyce.de/software/spiele/sudoku.htm haben wir das Programm "Das Sudoku-Puzzle". Es stammt von ZX81-Programmierern der Meisterklasse http://zx81.ordi5.free.fr/andre/andre.htm#sudoku und es hat mich damals so beeindruckt, dass ich es für die Joyce umgeschrieben habe. Das Programm löst nicht selbst die Sudokus, es assistiert nur dabei, indem es für jedes Feld die dort noch möglichen Ziffern anzeigt. Damit werden Flüchtigkeitsfehler vermieden.
.
Jetzt habe ich entdeckt, dass ich dabei einen kleinen Fehler hineingebracht hatte (siehe letzte Zeile des unteren Bilds): statt des zweiten Minus stand dort ein Plus, was in einer bestimmten Situation zu einem Fehler in der Ausgabe führte.
.
SUDOKU.png
SUDOKU.png (17.15 KiB) 96 mal betrachtet
.
Hier ist das Listing des korrigierten Programms (wegen der Umlaute sollte der deutsche Zeichensatz eingestellt sein):
.

Code: Alles auswählen

1 Y$="00D`I```F`E````G`````CHB`IAD```F`A`E`````E`D`````D`H`C```HEC`ABI`````F````B`A```D`H"
3 PRINT CHR$(27)"b"CHR$(9)
4 DEF FNC$(X,Y)=CHR$(27)+"Y"+CHR$(32+X)+CHR$(32+Y):PRINT CHR$(27)"f"
5 PRINT CHR$(27)"E"
10 GOTO 9000
30 I$=INKEY$:IF I$="" THEN 30
35 RETURN
100 REM:FAST 
110 LET N$="123456789"
120 LET L=16
130 FOR X=1 TO 9
140 IF A(X,X1) THEN MID$(N$,A(X,X1),1)="0"
150 IF A(Y1,X) THEN MID$(N$,A(Y1,X),1)="0"
160 NEXT X
170 FOR R=Y2 TO Y2+2
180 FOR C=X2 TO X2+2
190 IF A(R,C) THEN MID$(N$,A(R,C),1)="0"
200 NEXT C
210 NEXT R
220 FOR X=1 TO 9
230 IF MID$(N$,X,1)="0" THEN LET L=L-1
240 NEXT X
250 IF L=7 THEN PRINT FNC$(21,7);"      NICHTS       "
260 REM SLOW 
270 IF L=7 THEN RETURN 
280 PRINT FNC$(21,7);E$;FNC$(21,24-L);
290 FOR X=1 TO 9
300 IF MID$(N$,X,1)>"0" THEN PRINT MID$(N$,X,1);" ";
310 NEXT X
320 RETURN 
400 PRINT FNC$(21,7);"  AUGENBLICK BITTE " 
410 LET Y=1
420 FOR X=6 TO 16
430 IF X=9 OR X=13 THEN LET X=X+1
440 PRINT FNC$(X,10);
450 FOR B=1 TO 7 STEP 3
460 PRINT CHR$(27)"C";
461 IF A(Y,B)=0 THEN PRINT " "; ELSE PRINT CHR$(A(Y,B)+48);
463 IF A(Y,B+1)=0 THEN PRINT " "; ELSE PRINT CHR$(A(Y,B+1)+48);
465 IF A(Y,B+2)=0 THEN PRINT " "; ELSE PRINT CHR$(A(Y,B+2)+48);
470 NEXT B
480 LET Y=Y+1
490 NEXT X
500 RETURN 
1000 LET ER1=0
1010 FOR C=1 TO 9
1020 PRINT FNC$(21,7);"    PR]FE ZEILEN   "
1030 IF A(Y1,C)=K THEN GOTO 1300
1040 NEXT C
1050 FOR R=1 TO 9
1060 PRINT FNC$(21,7);"   PR]FE SPALTEN   "
1070 IF A(R,X1)=K THEN GOTO 1400
1080 NEXT R
1090 PRINT FNC$(21,7);"   PR]FE 3X3-FELD  "
1100 FOR C=X2 TO X2+2
1110 FOR R=Y2 TO Y2+2
1120 IF A(R,C)=K THEN GOTO 1200
1130 NEXT R
1140 NEXT C
1150 RETURN 
1200 PRINT FNC$(21,7);"ZWEI";K;FNC$(21,13);"EN IM 3ERFELD"
1210 LET R=-(R>3)-(R>6)+R+5
1220 LET C=-(C>3)-(C>6)+C+10
1230 FOR X=1 TO 9
1240 PRINT FNC$(R,C);CHR$(27)"p";CHR$(K+48);CHR$(27)"q";FNC$(R,C);CHR$(K+48);FNC$(RD,CD);CHR$(27)"p";CHR$(K+48);CHR$(27)"q";FNC$(RD,CD);CHR$(K+48)
1250 NEXT X
1260 LET ER1=-1
1270 RETURN 
1300 PRINT FNC$(21,7);" DOPPELTE IN ZEILE "
1310 LET R=RD
1320 GOTO 1220
1400 PRINT FNC$(21,7);"DOPPELTE IN SPALTE "
1410 LET R=-(R>3)-(R>6)+R+5
1420 LET C=CD
1430 GOTO 1230
1610 IF CD=13 OR CD=17 THEN LET X2=X2+3
1612 LET CD=-(CD=13 OR CD=17)+CD+1
1614 LET X1=X1+1
1615 LET K=0
1616 PRINT FNC$(RD,CD);CHR$(27)"p";:IF NOT A(Y1,X1) THEN PRINT " ";CHR$(27)"q"; ELSE PRINT CHR$(A(Y1,X1)+48);CHR$(27)"q";
1617 PRINT FNC$(RD,CD);:IF NOT A(Y1,X1) THEN PRINT " "; ELSE PRINT CHR$(A(Y1,X1)+48);
1618 IF CD<21 AND K=6 THEN GOTO 1610
1620 RETURN 
1630 IF CD=15 OR CD=19 THEN LET X2=X2-3
1632 LET CD=CD+(CD=15 OR CD=19)-1
1634 LET X1=X1-1
1635 LET K=0
1636 PRINT FNC$(RD,CD);CHR$(27)"p";:IF NOT A(Y1,X1) THEN PRINT " ";CHR$(27)"q"; ELSE PRINT CHR$(A(Y1,X1)+48);CHR$(27)"q";
1637 PRINT FNC$(RD,CD);:IF NOT A(Y1,X1) THEN PRINT " "; ELSE PRINT CHR$(A(Y1,X1)+48);
1638 IF CD>11 AND K=1 THEN GOTO 1630
1640 RETURN 
1650 IF RD=10 OR RD=14 THEN LET Y2=Y2-3
1652 LET RD=RD+(RD=10 OR RD=14)-1
1654 LET Y1=Y1-1
1655 LET K=0
1656 PRINT FNC$(RD,CD);CHR$(27)"p";:IF NOT A(Y1,X1) THEN PRINT " ";CHR$(27)"q"; ELSE PRINT CHR$(A(Y1,X1)+48);CHR$(27)"q";
1657 PRINT FNC$(RD,CD);:IF NOT A(Y1,X1) THEN PRINT " "; ELSE PRINT CHR$(A(Y1,X1)+48);
1658 IF RD>6 AND K=31 THEN GOTO 1650
1660 RETURN 
1670 IF RD=8 OR RD=12 THEN LET Y2=Y2+3
1672 LET RD=-(RD=8 OR RD=12)+RD+1
1674 LET Y1=Y1+1
1675 LET K=0
1676 PRINT FNC$(RD,CD);CHR$(27)"p";:IF NOT A(Y1,X1) THEN PRINT " ";CHR$(27)"q"; ELSE PRINT CHR$(A(Y1,X1)+48);CHR$(27)"q";
1677 PRINT FNC$(RD,CD);:IF NOT A(Y1,X1) THEN PRINT " "; ELSE PRINT CHR$(A(Y1,X1)+48);
1678 IF RD<16 AND K=30 THEN GOTO 1670
1680 RETURN 
2000 IF T=1 THEN GOTO 2007
2006 WON=0:FOR V=1 TO 9:FOR U=1 TO 9:X=ASC(MID$(Y$,(V-1)*9+U+2)):MID$(Z$(V),U,1)=CHR$(32-44*(X<94)):A(V,U)=X-96-32*(X<96):WON=WON-(A(V,U)>0):NEXT U:NEXT V
2007 T=0
2008 GOSUB 400
2009 LET GO=-1
2010 REM LET GO=-1
2015 GOSUB 100
2020 MID$(U$,2,1)=CHR$(A(Y1,X1)+48)
2030 PRINT FNC$(RD,CD);CHR$(27)"p";:IF A(Y1,X1) THEN PRINT MID$(U$,2,1);CHR$(27)"q" ELSE PRINT MID$(U$,1,1);CHR$(27)"q":REM U$(-(A(Y1,X1)>0)+1)
2035 PRINT FNC$(RD,CD);:IF A(Y1,X1) THEN PRINT MID$(U$,2,1); ELSE PRINT MID$(U$,1,1);:REM U$(-(A(Y1,X1)>0)+1)
2040 LET K$=INKEY$
2050 IF K$="" THEN GOTO 2030
2060 LET K=ASC(K$)
2070 IF K=6 THEN GOSUB 1618
2080 IF K=1 THEN GOSUB 1638
2090 IF K=31 THEN GOSUB 1658
2100 IF K=30 THEN GOSUB 1678
2110 IF K=83 OR K=115 THEN GOTO 9400
2120 IF GO THEN IF (K=73 OR K=105) THEN GOSUB 9500
2125 LET K=K-48
2130 IF K<0 OR K>9 THEN GOTO 2010
2140 IF K AND NOT A(Y1,X1) THEN PRINT FNC$(RD,CD);CHR$(27)"p"CHR$(K+48)CHR$(27)"q"
2150 IF MID$(Z$(Y1),X1,1)="L" THEN PRINT FNC$(21,7);" "CHR$(27)"p-*"CHR$(27)"q "CHR$(27)"pBLOCKIERT "CHR$(27)"q "CHR$(27)"p*-"CHR$(27)"q ";FNC$(21,7);E$;:GOSUB 100
2160 IF NOT GO THEN RETURN 
2200 IF A(Y1,X1) AND K OR MID$(Z$(Y1),X1,1)="L" THEN GOTO 2020
2210 IF K=0 AND A(Y1,X1)=0 THEN GOTO 2020
2220 IF K=0 THEN GOTO 2260
2230 GOSUB 1000
2240 IF ER1 THEN GOTO 2010
2250 LET WON=WON+1
2260 IF K=0 THEN LET WON=WON-1
2270 LET A(Y1,X1)=K
2280 IF WON<=80 THEN GOTO 2010
6000 PRINT FNC$(RD,CD);CHR$(A(Y1,X1)+48);FNC$(21,7);"  DU BIST FERTIG!  ";:GOSUB 30:PRINT FNC$(21,7);"   "CHR$(27)"pS"CHR$(27)"qPIELEN  "CHR$(27)"pE"CHR$(27)"qNDE   "
6010 IF UPPER$(INKEY$)="S" THEN RUN 
6020 IF UPPER$(INKEY$)<>"E" THEN GOTO 6010
6030 GOTO 9800
7000 PRINT FNC$(21,7)CHR$(27)"pS"CHR$(27)"qTART  /  "CHR$(27)"pE"CHR$(27)"qINGEBEN  "
7010 LET C$=INKEY$
7020 IF UPPER$(C$)="S" THEN GOTO 2000
7025 IF C$=" " THEN PRINT CHR$(27)"1";:RETURN
7030 IF UPPER$(C$)<>"E" THEN GOTO 7010
7035 T=1
7040 LET GO=0
7100 GOSUB 2010
7110 IF K AND MID$(Z$(Y1),X1,1)="L" THEN GOTO 7100
7120 PRINT FNC$(21,7);"  "CHR$(27)"pF"CHR$(27)"qERTIG /  B"CHR$(27)"pL"CHR$(27)"qOCKEN ";:IF A(Y1,X1)=0 AND K=0 THEN PRINT FNC$(21,19);:PRINT CHR$(27)"pZ"CHR$(27)"qUR]CK ";
7130 IF MID$(Z$(Y1),X1,1)="L" AND NOT K THEN PRINT ;FNC$(21,7);" "CHR$(27)"pF"CHR$(27)"qERTIG /  "CHR$(27)"pL"CHR$(27)"q\SEN   ";
7140 GOSUB 30:IF UPPER$(I$)="Z" THEN GOTO 7100
7150 IF UPPER$(I$)="F" THEN GOTO 7000
7160 IF UPPER$(I$)<>"L" THEN GOTO 7140
7170 IF A(Y1,X1)=0 AND K=0 THEN GOTO 7100
7200 IF K THEN PRINT FNC$(21,7);" "CHR$(27)"p-*"CHR$(27)"q "CHR$(27)"p BLOCKIERT"CHR$(27)"q "CHR$(27)"p*-"CHR$(27)"q ";FNC$(21,7);E$
7210 LET WON=-(K<>0)+WON+(K=0)
7220 LET A(Y1,X1)=K
7230 IF K THEN MID$(Z$(Y1),X1,1)="L" ELSE MID$(Z$(Y1),X1,1)=" "
7240 GOTO 7100
9000 REM POKE 16418,0
9005 PRINT CHR$(27)+"X"+CHR$(35)+CHR$(60)+CHR$(56)+CHR$(63);
9010 REM DIM A$(4,14)
9012 LET A$(1)="–šššžšššžšššœ"
9014 LET A$(2)="•   •   •   •#"
9016 LET A$(3)="—šššŸšššŸššš#"
9017 LET A$(4)="“ššš›ššš›ššš™#"
9018 LET A$(5)=" "+STRING$(13,"#")
9020 PRINT "    ";CHR$(27);"p";STRING$(25,32);CHR$(27);"q":PRINT "    ";CHR$(27);"p ** DAS SUDOKU-PUZZLE ** ";CHR$(27);"q";CHR$(35):PRINT "    ";CHR$(27);"p";STRING$(25,32);CHR$(27);"q";CHR$(35):PRINT "     ";STRING$(25,35)		
9025 PRINT:PRINT TAB(11);A$(1)
9030 FOR I=1 TO 11
9040 PRINT TAB(11);A$(-((I=4 OR I=8))+2)
9050 NEXT I
9055 PRINT TAB(11);A$(4):PRINT TAB(11);A$(5)
9060 PRINT FNC$(20,0);"     –";STRING$(21,"š");"œ":PRINT TAB(6);"•"STRING$(21,32);"•#":PRINT TAB(6);"“";STRING$(21,"š");"™#":PRINT TAB(6);" ";STRING$(23,35)
9100 DIM A(9,9)
9110 FOR I=1 TO 9:LET Z$(I)=STRING$(9,32):NEXT I
9120 LET Y1=5
9130 LET X1=Y1
9140 LET Y2=4
9150 LET X2=Y2
9160 LET RD=11
9170 LET CD=16
9180 LET GO=0
9190 LET ER1=GO
9200 LET WON=GO
9210 LET U$="  "
9220 LET E$=STRING$(19,32)
9230 LET L$=STRING$(22,35)
9240 LET SAVED=GO
9250 GOSUB 9500
9260 GOTO 7000
9400 FOR V=1 TO 9:FOR U=1 TO 9:POKE &H7A98+V*9+U,A(V,U)+96+32*(MID$(Z$(V),U,1)="L"):NEXT U:NEXT V
9401 NR=10*(PEEK(&H7AA0)-48)+PEEK(&H7AA1)-47:POKE &H7AA0,INT(NR*0.1)+48:POKE &H7AA1,(NR MOD 10)+48
9410 PRINT FNC$(21,6);CHR$(27)"pSAVED AS SUDOKU"+LEFT$(Y$,2)+".BAS"CHR$(27)"q";
9415 SAVE "SUDOKU"+LEFT$(Y$,2)+".BAS"
9418 PRINT FNC$(21,6);"                     ";
9420 GOTO 7000
9500 PRINT FNC$(5,0)"     –"STRING$(21,"š")"œ":PRINT "     •   SUDOKU ANLEITUNG  •#":PRINT "     •  .................  •#"
9501 PRINT "     •"STRING$(21,32)"•#":PRINT "     • JEDES SUDOKU HAT 9  •#":PRINT "     •ZEILEN UND 9 SPALTEN •#"
9502 PRINT "     •UND HAT AUCH 9 FELDER•#":PRINT "     •  MIT JE 9 PL[TZEN.  •#":PRINT "     • SETZE DIE ZAHLEN 1  •#"
9503 PRINT "     •BIS 9 IN JEDE ZEILE, •#":PRINT "     •SPALTE UND JEDES FELD•#":PRINT "     •OHNE WIEDERHOLUNGEN. •#"
9504 PRINT "     “"STRING$(21,"š")"™#":PRINT "      "STRING$(23,35)
9505 PRINT FNC$(21,7)" DR]CKE EINE TASTE "
9510 IF INKEY$<>"" THEN GOTO 9510
9520 IF INKEY$="" THEN GOTO 9520
9600 PRINT FNC$(6,1)"    •     PFEILTASTEN:  "CHR$(27)"pŽ"CHR$(27)"q •#":PRINT "     •ZUM BEWEGEN    "CHR$(27)"p "CHR$(27)"q: "CHR$(27)"p<"CHR$(27)"q "CHR$(27)"p>"CHR$(27)"q•#":PRINT "     •"STRING$(19,32)CHR$(27)"pv"CHR$(27)"q •#"
9601 PRINT "     •DR]CKE "CHR$(34)"S"CHR$(34)" F]R SAVEN •#":PRINT "     •"STRING$(21,32)"•#":PRINT "     •DR]CKE "CHR$(34)"I"CHR$(34)" F]R INFO  •#"
9602 PRINT "     •"STRING$(21,32)"•#":PRINT "     •"STRING$(21,32)"•#":PRINT "     •  GESCHRIEBEN VON:   •#"
9603 PRINT "     •STAFFORD WHITE / 2006•#":PRINT "     •  GE[NDERT:  "CHR$(27)"pANDR"CHR$(193)CHR$(27)"q***•#"
9605 PRINT FNC$(21,7)"  TASTE F]R START  "
9610 IF INKEY$<>"" THEN GOTO 9610
9620 IF INKEY$="" THEN GOTO 9620
9630 PRINT FNC$(17,5)"     ";A$(4);"     ":PRINT "          ";A$(5);"      "
9640 FOR X=16 TO 6 STEP -1
9650 PRINT FNC$(X,5);L$:PRINT FNC$(X,5);"     ";A$(-((X=9) OR (X=13))+2);"     "
9660 NEXT X
9670 PRINT FNC$(5,5);L$:PRINT FNC$(5,5);"     ";A$(1);"     "
9680 IF NOT GO THEN RETURN 
9690 GOTO 400
9800 PRINT CHR$(27)"E"CHR$(27)"H"; 
9990 PRINT "9990"CHR$(27)"p>"CHR$(27)"qSAVE "CHR$(34)"SUDOK"CHR$(27)"pU"CHR$(27)"q"CHR$(34)"  2006/10 (C)":PRINT " –ššššššššššššššššššššššššššššœ –™   IDEE VON STAFFORD WHITE  “œ•  GRAFIK VON STAFFORD WHITE   ••PROGRAMM VON STAFFORD WHITE   •"
9991 PRINT CHR$(27)"A•     UND VON "CHR$(27)"pANDR"CHR$(193)CHR$(27)"q***         •":PRINT CHR$(27)"A"CHR$(149)"  DEUTSCH: JOYCE-USER-AG E.V. "CHR$(149):PRINT CHR$(27)"A• –šššššššššœ                  •"
9992 PRINT CHR$(27)"A•–™         “œ WILLST DU MEHR? ••• F"CHR$(27)"pR"CHR$(27)"qE"CHR$(27)"pE"CHR$(27)"q-"CHR$(27)"pW"CHR$(27)"qA"CHR$(27)"pR"CHR$(27)"qE •                 •":PRINT CHR$(27)"A•“œ         –™ HOL DIR MEHR... •"
9993 PRINT CHR$(27)"A• “ššššššššš™                  ••     SPEICHERN: RUN 9990      •":PRINT CHR$(27)"A•  "CHR$(27)"p  PROGRAMM  NICHT [NDERN  "CHR$(27)"q  •":PRINT CHR$(27)"A•       STARTEN: RUN           •"
9994 PRINT CHR$(27)"A• STAFFORDWHITE2002"CHR$(166)"YAHOO.COM  •":PRINT CHR$(27)"A“œ      ZX81AB"CHR$(166)"GMAIL.COM      –™ “šššššššššššššššššššššššššššš™ 9992 RUN":PRINT:PRINT:PRINT CHR$(27)"pK"CHR$(27)"q"
9995 PRINT CHR$(27)"1"
9996 A$=INKEY$:IF A$="" THEN 9996
9998 PRINT CHR$(27)"e"CHR$(27)"b"CHR$(0)CHR$(27)"H"CHR$(27)"J"
9999 STOP
10000 Y$="00B````I``FADC```````F`HB`````````C`H```G`E`D```I`B`````````IF`E```````CBGD``G````H"
10001 Y$="00````H`D```DFG``I``C``B```H`E`CADB`I`BI`FGH`EC`H`CEIF`B`B```G``H``G``EBA```H`B````"
10002 Y$="00`I`CH`FB`B``A```IG````I`A````DHC``G`CEH`B`DAF`A``DFC````B`G````HC```I``A`GI`AH`F`"
10003 Y$="00H````G```FB`````HC```HFD`B`DEH``B`F````E`H````G`F``EIH`I`DAF```BD`````AE```G````I"
10004 Y$="00`B`FA`ED````B```FH``H`D`B````BIC``A`FCD`B`HIE`G``HFD````G`E`C``EA```B````HF`IC`E`"
10005 Y$="00``EA`DHIF```BH`````A``E`D``B`I```AH``C`````B``HA```F`C``B`D``E`````BC```IDCH`EB``"
10006 Y$="00DH``I```E```E``G`B`E`D`F`````E```HB`B```````F`CH```E`````F`D`G`I`D``H```H```E``CD"
10007 Y$="00````G```CH``C`B``EEB`FIH``AD`F`HC`B``C`I`D`A``A`BE`C`DA``GDF`CBG``E`A``FC```B````"
10008 Y$="00I`CE```F`AG````EC`D```G``BH`````BGIC``````F`A`I`F``BD`ECAB`````B````E`A```IA`GD`B"
10009 Y$="00B````I``FADC```````F`HB`````````C`H```G`E`D```I`B`````````IF`E```````CBGD``G````H"
.
Als “Radiergummi“ fungiert die 0, damit können Ziffern wieder gelöscht werden: im Eingabe-Modus jede, aber im Spiel-Modus nur die, die nicht geblockt sind. Beim Eingeben muss Sorgfalt walten – hier wird noch nicht überprüft, ob eine Ziffer in Zeile, Spalte oder 9erfeld bereits gesetzt wurde und es wird später im Spiel-Modus auch nicht erkannt.
.
Als Bonus habe ich zehn Rätsel ergänzt - die Zuweisung in Zeile 1 muss durch eine aus den Zeilen ab 10000 ersetzt werden. Ihr könnt auch eigene Aufgaben codieren: das "`" steht für ein leeres Feld, die Buchstaben A bis I für die Ziffern 1 bis 9.
.
Viel Spaß beim Knobeln!
Antworten