← ST-Computer 09 / 1992

Mischen und Sortieren

Programmierpraxis

Computer sind besonders zum Sortieren von Daten geeignet, aber was ist, wenn man das Gegenteil vor hat; wenn man Daten durcheinanderbringen will? Auch hierzu gibt es Lösungen, eine davon sind Zufallszahlen. Man kann sie gut gebrauchen, um willkĂŒrliche Beispieldaten fĂŒr ein Programm zu erstellen. Auch in Spielen sind Zufallszahlen sehr wichtig.

Ein guter Zufallszahlengenerator sollte eine ungefĂ€hre Gleichverteilung seiner Ergebnisse liefern. Bei dem ersten Programm handelt es sich um ein Testprogramm fĂŒr den Zufallszahlengenerator von Omikron.BASIC. Die beiden obersten Zeilen des Programms dienen der Einstellung Ihrer Bildschirmauflösung. Wenn Sie mit dem monochromen Monitor SM-124 von Atari arbeiten, dann lassen Sie die Einstellungen so, wie sie sind. Die Variable Step enthĂ€lt die horizontale Auflösung des Tests. Kleinere Zahlen bringen hier eine höhere Auflösung. Scale enthĂ€lt die vertikale Auflösung. Auch hier gilt: je kleiner, desto genauer. Die FOR-Schleife am Anfang dient der Erzeugung von Zufallszahlen. Wenn Sie einen selbstgeschriebenen Zufallsgenerator testen wollen, dann mĂŒssen Sie hier den RND-Befehl durch Ihren eigenen Unterprogrammaufruf ersetzen. Der Befehl TEXT HEIGHT = 4 schaltet fĂŒr den TEXT-Befehl auf den 6x6-Systemzeichensatz um. An dieser Stelle ist auch mal ein bißchen AufklĂ€rungsarbeit in Bezug auf den TEXT-Befehl angebracht. Die y-Koordinate in diesem Befehl gibt nicht etwa die obere Ecke fĂŒr die Textausgabe an, sondern die Stelle, an der die Grundlinie des Textes steht. Die Grundlinie ist beim 6x6-Zeichensatz vier Punkte unterhalb der oberen Ecke. Dies ist auch der Grund, weshalb TEXT HEIGHT = 4 auf den 6x6-Zeichensatz umschaltet.

Das zweite Programm ist fĂŒr alle Kartenspieler interessant. In diesem Programm wird ein sortiertes Kartenspiel gemischt und danach wieder sortiert. Die Karten werden dabei durch Zahlen von 0 bis 31 reprĂ€sentiert. Die Farbe einer Karte kann man mit INT(Karte/8) herausbekommen. Man erhĂ€lt einen Wert von 0 bis 3, den man sehr einfach einer Zeichenkette, z.B. „Karo“ zuordnen kann. Die Karte selber erhĂ€lt man durch (Karte MOD 8), also dem Divisionsrest. Etwas schneller und auch „computermĂ€ĂŸiger“ wĂ€re der Ausdruck (Karte AND 7), der zufĂ€lligerweise hier das gleiche Ergebnis liefern wĂŒrde, der dafĂŒr aber schon das VerstĂ€ndnis von bitweisen VerknĂŒpfungen voraussetzen wĂŒrde. Interessant ist vielleicht auch die Methode, wie man ein Kartenspiel mischen kann. Dazu wird einfach jede Karte mit einer beliebigen, zufĂ€lligen anderen Karte vertauscht. Auf diese Weise dĂŒrfte eine bessere Durchmischung gewĂ€hrleistet sein, als man sie durch manuelles Mischen erreichen könnte.

' (c)1992 by MAXON-Computer Xmax%L=640 Ymax%L=400 Sstep%L=20 Scale%L=1 Mhoehe%L=Ymax%L/Scale%L/2 X1%L= INT(Xmax%L/Sstep%L) DIM A%L(X1%L) PRINT "Ich berechne Zufallszahlen..." FOR I%L=0 TO X1%L*Mhoehe%L-1 Zufall%L= RND(X1%L+1) A%L(Zufall%L)=A%L(Zufall%L)+1 IF (I%L AND 511) =511 THEN PRINT "."; NEXT I%L PRINT CLS : PRINT CHR$(27);"f": MODE =0: TEXT HEIGHT =4 FILL COLOR =1: FILL STYLE =2,4: OUTLINE ON : CLIP 0,0,Xmax%L,Ymax%L FOR I%L=0 TO X1%L PBOX I%L*Sstep%L,Ymax%L—A%L(I%L)*Scale%L TO (I%L+1)*Sstep%L,Ymax%L-1 IF Sstep%L>=14 THEN TEXT I%L*Sstep%L+(Sstep%L-12)/2,Ymax%L-5,RIGHT$(STR$(100+I%L),2) A$=MID$(STR$(A%L(I%L)),2) : A1%L= LEN(A$)*6 TEXT I%L*Sstep%L+(Sstep%L-A1%L)/2,Ymax%L-A%L(I%L)*Scale%L-2,A$ ENDIF NEXT I%L ' (c)1992 by MAXON-Computer DIM A%L(31),Farbe$(3),Karte$(7) FOR I%L=0 TO 3: READ Farbe$(I%L): NEXT I%L FOR I%L=0 TO 7: READ Karte$(I%L): NEXT I%L DATA "Karo","Herz","Pik","Kreuz" DATA "Sieben","Acht","Neun","Zehn","Bube","Dame","König","Ass" FOR I%L=0 TO 31 A%L(I%L)=I%L NEXT I%L ' ***Jetzt mischen! FOR I%L=0 TO 31 SWAP A%L(I%L),A%L( RND(32)) NEXT I%L ' ***Gemischt ausgeben Ausgabe ' ***jetzt wieder sortieren SORT A%L(0) ' ***und dann ausgeben Ausgabe END ' '***** Prozeduren ***** ' DEF PROC Ausgabe LOCAL I%L ' ***Automat. Zeilenumbruch einschalten (BASIC ab Version 3.5) PRINT CHR$(27);"v"; FOR I%L=0 TO 31 IF I%L THEN PRINT ", "; PRINT Farbe$( INT(A%L(I%L)/8));" ";Karte$(A%L(I%L) MOD 8); NEXT I%L PRINT PRINT RETURN
Arnd Rosemeier