.
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.
. .
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!