Die Suche ergab 49 Treffer

von ein Thüringer
31.10.2025, 11:38
Forum: Spiele
Thema: SUDOKU, Fehler korrigiert
Antworten: 0
Zugriffe: 120

SUDOKU, Fehler korrigiert

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) 120 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!
von ein Thüringer
21.09.2025, 10:11
Forum: Verschiedenes
Thema: JOYCE Klubtreffen 2025 in Philippinenburg
Antworten: 1
Zugriffe: 10295

JOYCE Klubtreffen 2025 in Philippinenburg

In Hessen steppte wieder der Bär!

Am neuen Veranstaltungsort machte es nicht weniger Spaß als in den vorangegangenen Jahren.

.
KT_2025.png
KT_2025.png (358.53 KiB) 10295 mal betrachtet
.


.

KT__2025.png
KT__2025.png (325.55 KiB) 10294 mal betrachtet

.


Modell.JPG
Modell.JPG (777.83 KiB) 10189 mal betrachtet

.

Auf bewährte Weise hier wieder eine Fotoserie in Joyce-Form, zu betrachten mit Bernds Programm PBMREAD 3.4 .
2025.zip
(536.26 KiB) 674-mal heruntergeladen
von ein Thüringer
10.08.2025, 17:59
Forum: Programmierung
Thema: BASICODE in Java
Antworten: 62
Zugriffe: 358497

ein Spiel aus den 80ern

Große Ereignisse werfen ihre Schatten voraus.

Auf unserem diesjährigen Treffen in Phillipinenburg wird Michael seinen Java-Bascoder präsentieren, also nicht mehr viel Zeit, ihm Bugs oder Änderungswünsche mitzuteilen...

Hier soll ein Spiel vorgestellt werden, das vom atemberaubenden Tempo dieses Bascoders profitiert. Es stammt von Thomas Mäurer, der auf dem 16-Bit-Atari aktiv war - ich habe wieder die Erweiterung auf die Verwendung von Farben beigesteuert.

Auf den Originalmaschinen der 80er läuft es nicht schnell genug, um den Spielspaß genießen zu können, ich habe es interessehalber auf dem Amstrad CPC probiert. Das liegt daran, dass unter BasiCode kein Rechteck- und kein Füll-Befehl zur Verfügung stehen. Somit dauert das Zeichnen der rechteckigen Felder zu lange.

_SENSO.png
_SENSO.png (45.83 KiB) 11586 mal betrachtet
SENSO.ZIP
in .BAS umbenennen
(5.7 KiB) 789-mal heruntergeladen
Viel Spaß beim Testen des Kurzzeitgedächtnisses!
von ein Thüringer
18.02.2025, 21:15
Forum: Programmierung
Thema: BASICODE in Java
Antworten: 62
Zugriffe: 358497

BASICODE in Java

Bei aller Begeisterung für BasiCode muss ich ehrlicherweise einräumen, dass die Programme recht langsam arbeiten. Ein Basic-Interpreter ist natürlich nicht fesselnd schnell — und hier werden zu allem Übel noch (eigentlich vorhandene) Befehle durch GOSUB-Aufrufe ersetzt …

Doch nun fällt dieser Nachteil weg: Michaels in Java geschriebener Interpreter arbeitet wirklich irrsinnig schnell! Anlässlich der Veröffentlichung von Version 0.12 https://github.com/mhaupt/basicode/releases/tag/v0.12 Anfang dieser Woche möchte ich das an zwei Programmen demonstrieren.

https://github.com/robhagemans/basicode ... vlucht.bc3 wurde, wie man den Informationen am Programm-Ende

Code: Alles auswählen

30000 REM RONDVLUCHT V1.0
30010 REM
30020 REM WEERGAVE VAN EEN
30030 REM VOORWERP OF GEBOUW
30040 REM IN PERSPECTIEF.
30050 REM
32000 REM GESCHREVEN DOOR
32010 REM
32020 REM HENK VAN DEELEN
32030 REM
32040 REM (C) HVD OKT 1989
32050 REM
32060 REM TROS-RADIO dd 900321




entnehmen kann, im Herbst 1989 fertiggestellt und im Frühjahr 1990 über den Rundfunk ausgesendet und schließlich auf die "BASICODE-3 Verzamelcassette" Nr. 7 (von insgesamt 9) übernommen.
RONDVLU1.ZIP
das erste "Rundflug"-Programm (in .BAS umbennen)
(8.65 KiB) 11204-mal heruntergeladen
Ein perspektivisch dargestellter Körper kann auf unterschiedlichste Weise gedreht, verschoben und in der Größe verändert werden.

Der Autor arbeitete an dem Programm weiter, doch BasiCode büßte rasant an Popularität ein, es gab keine Rundfunkausstrahlungen mehr, stattdessen kam das Internet auf und Henk konnte seine Fortschritte 1992 auf www.nostalgia8.nl präsentieren.

In der Zwischenzeit kann das Paket nur noch unter http://web.archive.org/web/201701031528 ... c3logo.zip gefunden werden. Als Sahnehäubchen enthält es ein Programm, das die Sprache LOGO simuliert, zumindest die Steuerung der "Schildkröte" zum Zeichnen von Linien. Allerdings muss man sich dafür erst an die niederländischen Befehle gewöhnen... vgl. https://www.robotrontechnik.de/bilder/U ... ld_0g7.png , http://www.robotrontechnik.de/bilder/Up ... ld_4w5.png und http://forum.system-cfg.com/viewtopic.p ... 12#p243712 .


Aus dem Paket, das (für die Joyce) hier bereits hier https://joyce.de/basicode/joyce/bc3logo.htm vorgestellt wurde, greife ich ANIMATIO.BC3
ANIMATION.zip
das Programm und drei Datensätze
(8.46 KiB) 11533-mal heruntergeladen
heraus. Einzelbilder werden hier zusammengestellt und als Film abgespielt. Mit mehrfachem Drücken von “-“ kann das Tempo wenigstens etwas gedrosselt werden (erwähnte ich schon das irrwitzige Tempo des Java-Interpreters :lol: ?), mit “P“ kann angehalten und eine Zwischenphase betrachtet werden und “E“ beendet das Programm. Zur Auswahl gibt es LOGOFL, RONDFL und ANIMAFL.


In einem Artikel von 1985 schätzte ein gewisser Bill Bolton, CP/M-Nutzer aus Australien, ein “… BASICODE was really an idea whose time had yet to come“. Diese Programme bestätigen es, sie waren ihrer Zeit deutlich voraus, sinnvoll nutzen konnte man sie mit damaliger Technik (Größe des Arbeitsspeichers, Geschwindigkeit des Prozessors) noch nicht.

Screenshots der beiden Programme
Screenshots der beiden Programme
ANIMATIE.png (23.07 KiB) 47220 mal betrachtet
von ein Thüringer
27.01.2025, 14:17
Forum: Programmierung
Thema: BASICODE in Java
Antworten: 62
Zugriffe: 358497

BASICODE in Java

Kurz vor Jahresende veröffentlichte Michael eine neue Version seines BasiCode-Interpreters in Java: https://github.com/mhaupt/basicode/releases/tag/v0.11 . Eines der Programme, die nun auch laufen, ist "Notenbalk", ein Programm, das wir auf der Diskette zum Klubtreffen 2020 haben. Mich begeistert es, weil es (bis auf Drucken und die Nutzung von acht Farben) alle Features der aktuellsten Version von BasiCode ausnutzt: die hochauflösende Grafik, das Nachladen von Daten und das Abspielen von Musik. Beim online-Browser von Rob Hagemans finden wir das Programm auch https://robhagemans.github.io/basicode/ ... enbalk.bc3 , die drei Beispielsdatensätze liegen aber nicht mit unter dem Reiter Programme, sondern können hier heruntergeladen werden: https://github.com/robhagemans/basicode ... omboot.dat https://github.com/robhagemans/basicode ... erkens.dat https://github.com/robhagemans/basicode ... Moskou.dat , ich habe sie hier
MUZDATA.zip
drei Beispielsdatensätze zum Programm
(945 Bytes) 11166-mal heruntergeladen
zusammengefasst.

vier Screenshots des Programms
vier Screenshots des Programms
NOTENBAL.png (27.01 KiB) 48797 mal betrachtet
Für die damalige Zeit ist es ein recht aufwendiges Projekt, erstaunlich, dass es auf den unterschiedlichsten Computern funktioniert. Im Java-Bascoder wollte es zunächst zwar nicht laufen - doch mit einiger Knobelei fanden wir das verursachende Problem heraus. Zu den für BasiCode zulässigen Befehlen (die also nicht durch ein GOSUB zeilennummer ersetzt werden müssen) zählt VAL(stringausdruck), also das Umwandeln einer Zeichenkette in eine Zahl. Beinhaltet die Zeichenkette nur Vorzeichen, Dezimalpunkt und Ziffern, gibt es keine Schwierigkeiten. Sind jedoch auch Buchstaben enthalten, reagieren die Interpreter unterschiedlich. Manche reagieren mit einer Errormeldung, andere wandeln wenigstens die Zeichen vor dem ersten Buchstaben um bzw. erzeugen den Wert 0, wenn schon an erster Stelle ein Buchstabe steht. In Zeile 5020 des Programms stand bisher IF NO$(N)="" THEN 5040. Ändern wir es so ab, wie rechts unten im Bild zu sehen ist, läuft es auch im Java-Bascoder.

Sind jemandem bei irgendwelchen Programmen andere Inkompatibilitäten untergekommen? Michael freut sich über solche Hinweise, sie helfen ihm, den Interpreter weiter zu perfektionieren.

Hier noch die nötigsten Bedienhinweise für nicht-Niederländer ;-) :

Im Titel-Screen (links oben) zweimal * drücken, nach dem ersten Mal werden vier leere Notenlinien gezeichnet, nach dem zweiten sehen wir das Menü (rechts unten). Hier wählen wir den Punkt 7 und geben den Namen (z.B. MUZDAT1) ein. Dann werden wieder die Notenlinien gezeichnet und die Noten usw. eingezeichnet. Mit S kann nun die Musik abgespielt werden, mit * wird ins Menü zurückgekehrt.
  • Übersetzung der Anleitung

    An den Anfang kannst du als Kennzeichnung ein # oder b schreiben und mit / und zwei Ziffern eine Taktangabe.

    Gib die Noten wie folgt ein: erst einen der Buchstaben ABCDEFGabcdefg - nach Änderung laut EDIT AHCDEFGahcdefg - (Höhe), danach ggf. ein # oder ein b (dann wird statt C-Dur G-Dur bzw. F-Dur verwendet), danach die Länge mit EINER Ziffer 1 2 4 8 oder 6 für eine 1/1, 1/2, 1/4, 1/8 oder 1/16 Note.

    Danach kann noch ein Punkt (Vergrößerung der Notenlänge um die Hälfte) oder ein M (= Taktstrich) eingegeben werden, sonst gib ein Leerzeichen ein. Ein + macht einen Bindebogen.

    Der CURSOR geht von allein an die nächste Position. Der Cursor kann auch mit den Cursortasten bewegt werden.

    Eine PAUSE wird mit einem R und einer Ziffer 1 2 4 8 6 gesetzt. Das M setzt einen Taktstrich.

    Das S lässt die Musik spielen und das T frischt die Zeichnung auf.

    Die Lautstärke der Musik kannst du mit V und einer Ziffer von 1 bis 7 ändern, sie gilt für alle danach eingegebenen Noten.

    MIT EINEM * ERHÄLTST DU DAS MENÜ MIT DEN ANWEISUNGEN FÜR DAS SPEICHERN UND LADEN DER MUSIK NACH ODER VON KASSETTE ODER DISKETTE.

    Mit W kannst du eine Note löschen, die du mit dem Cursor auswählst.

    Mit I kannst du Platz schaffen, um eine Note einzufügen und mit U kannst du eine Note löschen und alles, was danach in der Zeile steht, nach links aufrücken. So kannst du nachträglich die Musik noch bequem ändern.

Es können auch eigene Musikstücke eingegeben und auch gespeichert werden - hierfür gibt es mehrere Seiten Hinweise, wenn ganz am Anfang J, im Menü 1 oder im Screen mit dem Notenlinien H (bzw. B, siehe EDIT) eingegeben wird.


EDIT 14. Februar ‘25:. Mich hat ziemlich irritiert, dass das (weil niederländische) Programm “B“ verwendet, wo wir “H“ gewohnt sind. Abhilfe schaffen diese paar Zeilen:

Code: Alles auswählen

 1180 IF IN=66 THEN GOSUB 8120:IN=84
 1205 IF IN=72 THEN IN=66:IN$=CHR$(ASC(IN$)-6)
 8590 PRINT"DIT KOMT WEER ALS JE EEN B TIKT"
 8600 GOSUB 210:IF IN=66 THEN 8120
Sie vertauschen die Verwendung von B (jetzt Beschreibung) und H (vorher Hilfe).

EDIT 18. Februar '25: Nachdem ich die Benennung der Noten “eingedeutscht“ hatte, habe ich nun alle Bildschirmausgaben auf Deutsch umgestellt. Hier ist die sonst funktional gleiche Version:
NOTENB_D.ZIP
das Programm mit deutscher Bedienung (in .BAS umbennen)
(16.25 KiB) 11672-mal heruntergeladen

EDIT 17. März '25: Hier https://joyce.de/basicode/diesunddas/notenblatt.htm gibt es das Programm mit einem weiteren Extra: wenn das gewünschte Stück zu hohe Töne enthält, notiert man es eine Oktave tiefer und spielt es über die neue Funktion Korrektur höher ab. Dann stimmt zwar die Optik nicht, aber man erreicht auch Töne über dem g. Ebenso kann über die neue Funktion das Abspieltempo verändert werden.

Viel Spaß damit!
von ein Thüringer
21.10.2024, 17:21
Forum: Programmierung
Thema: Raytracing
Antworten: 10
Zugriffe: 206668

Re: Raytracing v3.0

Durch Variieren der x-Position der Kamera in Schritten der Größe 0.2 habe ich eine Serie
serie.png
(84.18 KiB) Noch nie heruntergeladen
von Bildern errechnen lassen. Man kann nun zwei davon nebeneinander 1) stellen (oder wie hier viewtopic.php?p=1015#p1015 erwähnt übereinander) und kann dann mit dem Schielblick die Szene plastisch sehen. Tipp: das Smartphone quer halten und das Bild auf Screenbreite ziehen ergibt ein annehmbares Resultat.

Danke an Bernd für dieses schöne Stück Software!


paar.png
paar.png (107.7 KiB) 40960 mal betrachtet
3dKugeln.zip
(481.86 KiB) 5796-mal heruntergeladen
1) links ein Bild von weiter links aus der Serie, rechts eins mehr oder weniger weiter rechts davon, am besten das unmittelbar benachbarte, sonst könnte das Betrachten zu anstrengend werden
von ein Thüringer
07.10.2024, 16:27
Forum: Programmierung
Thema: Raytracing
Antworten: 10
Zugriffe: 206668

Re: Raytracing

Fabelhaft, Bernd! Ich werde es heute abend probieren, im Moment bin ich AFK.

Ich freue mich auch schon auf Version 3.0 (ich habe ein Faible für die Stereoskopie).
von ein Thüringer
28.09.2024, 12:58
Forum: Programmierung
Thema: Raytracing
Antworten: 10
Zugriffe: 206668

Raytracing

In der Theorie stimmt es auf jeden Fall. Ein Halbbild hätten wir schon, wenn Bernd noch ein zweites mit leicht veränderter Sicht kreieren würde, könnte das klappen.

Bei nebeneinander ist der Nachteil, dass die Breite auf 65 mm beschränkt bleibt (Abstand der Pupillen), aber inzwischen haben findige Köpfe das KMQ-Verfahren entwickelt, da werden die Halbbilder übereinander angeordnet und können dann auch deutlich breiter sein. https://www.perspektrum.de/i/kmq-verfahren
von ein Thüringer
25.09.2024, 22:28
Forum: Programmierung
Thema: Raytracing
Antworten: 10
Zugriffe: 206668

Raytracing

Als einen möglichen Weg hat Bernd ins Auge gefasst, das Programm noch um eine Abspeicherung als PBM zu erweitern. Ich habe hier mal (auf anderen Wegen) jeweils eine normale und eine invertierte Version der Grafik für die Joyce und für Windows erzeugt. Die invertierte Joyce-Version sollte dann auf dem Drucker mit dunklen Schatten ankommen. Die beiden Joyce-Versionen können mit dem aktuellen PBMREAD-Programm betrachtet werden (die Windows-Versionen mit den Vorgängern, die die Windows-Bilder noch in der Höhe stauchen).

RAYTR.zip
(18.62 KiB) 109881-mal heruntergeladen
von ein Thüringer
25.09.2024, 11:01
Forum: Programmierung
Thema: Raytracing
Antworten: 10
Zugriffe: 206668

Raytracing

Irrsinnig, was Bernd da wieder auf der Joyce möglich gemacht hat! Ich habe es auf dem Treffen auf einer realen Joyce gesehen, natürlich läuft es dort recht langsam, brauchte wohl anderthalb Stunden. Gut, dass wir die CPM-Box und dort die F11-Taste haben!


unten: Bildröhre, oben: Papier
unten: Bildröhre, oben: Papier
Raytr.png (61.3 KiB) 165689 mal betrachtet

Den fertigen Screen druckten wir in Nothfelden auch gleich aus, dabei werden bekanntermaßen, in dem Fall leider, die Helligkeitswerte vertauscht. Es gab den Vorschlag (von Olli?), weißes Farbband auf schwarzem Papier zu nutzen ;) , aber wie wir Bernd kennen, wird es nicht bei Version 1.0 bleiben und er wird auch dieses Problem lösen.