Aus Zufall ausschließen
Übersicht

mic_touchBetreff: Aus Zufall ausschließen |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo
Ich hab dieses Thema hier schon einemal angeschrieben und nun habe ich noch mal eine Frage auf meine Antworten damals. Und zwar habe ich den code bekommen: Code: [AUSKLAPPEN] Graphics 640,480 SeedRnd MilliSecs() Dim zahlen(10) ;Dim Feld erstellen For i = 1 To 10 .again neuezahl= Rnd (1,10) ;Zufällige Zahl For a = 1 To 10 If neuezahl=zahlen(a) ;Falls die Zahl im Dimfeld enthalten ist Print "doppelte zahl gefunden nämlich die "+neuezahl Goto again ;Die ganze Prodzedur nochmal EndIf Next zahlen(i)=neuezahl ;Jetzt da wir uns sicher sind das sie nicht doppelt vorkommt, ins dim speichern Next Print "" For i = 1 To 10 Print "Zahl-"+i+" ="+zahlen(i) ;So können wir testen, von 10 zahlen keine doppelte dabei ;) Next Nun ist meine Frage ob das "i" und das "a" in der Klammer eine bestimme Bedeutung haben oder einfach nur Variablen sind?? |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Klar sind es einfach nur Variablen, die zum auslesen des Arrays (Dim) variabel gehalten werden.
Sprich, anstelle: Code: [AUSKLAPPEN] If neuezahl=zahlen(0) Then ...
If neuezahl=zahlen(1) Then ... If neuezahl=zahlen(2) Then ... If neuezahl=zahlen(3) Then ... ... schreibst du es nur einmal und lässt es durch eine Schleife laufen. |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
mic_touch |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
hat vllt. jemand bock meinen code durch zu schauen.
Des mit dem zufall ausschließen klappt nicht so richtig. Ich würde des dann per E-Mail schicken. (Ich will des kleine spiel hier nicht veröffentlichen) (ist auch nicht sehr viel gute 300 zeilen mit wiederholungen und übersichtilich) |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also, erstmal ist Goto bereits etwas böse, sagt man. Allerdings so wie du es anwendest auf jeden Fall. Denn du unterbrichst einfach eine festgelegte Schleife und fängst promt mal eben wo anders von vorne an. Das führt auf Dauer zu Speicherfehlern etc... Auch würde ich so ein ewiges unterfangen mit ''prüfe nun ob zufälliger Wert schonmal vorkam'' vermeiden. Denn hier kann es bei größeren Speicherfeldern zu ewigen rumgesuche kommen.
Anders sieht folgender Vorschlag aus. Man erstelle jede Zahl nur einmal, indem man sie durchnummeriert und vertauscht sie dann - einmal das ganze Speicherfeld durch - mit jeweils zufällig angelegter Speicherfeldposition. Das ganze sähe dann so aus: Code: [AUSKLAPPEN] Graphics 640,480,0,2
SetBuffer BackBuffer() SeedRnd MilliSecs() Dim Zahlen(9) ;Dim Feld erstellen. Ein Dim-Feld beginnt bei 0 Local Temp Local Pos Local I For I = 0 To 9 Zahlen(I)=I+1 ;Jede Zahl kommt einmal vor, aber durchnummeriert Next For I = 0 To 9 Pos=Rand(0,9) ;Zufällige Speicherposition festlegen Temp=Zahlen(Pos) ;Aus zufälliger Speicherposition den Wert zwischenspeichern Zahlen(Pos)=Zahlen(I) ;Aus Schleifenposition den Wert aus zufälliger Position übertragen Zahlen(I)=Temp ;Den zwischengespeicherten Wert nun an zufälliger Speicherposition speichern Next For I = 0 To 9 Print Zahlen(I) Next WaitKey End - Es ist also ein vereinfachtes Bubbleunsort. |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
mic_touch |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Das war ja nur eine Antwort auf meine frühere Frage, so sieht mein Programm gar nicht aus.
Wahrscheinlich kann ich das auch auf mein Programm übertragen aber da sind für mich ein paar neue sachen dabei. Mein code (vereinfacht) Code: [AUSKLAPPEN] Graphics 800,700,16,2 SeedRnd MilliSecs() Dim zahlen(100) For i = 1 To 3 .nochmal zahl = Rand(1,4) Select zahl Case 1 If zahl=zahlen(a) Goto nochmal EndIf bild1 = LoadImage ("...") DrawImage bild1 zahlen(i)=zahl Cls Case 2 If zahl=zahlen(b) Goto nochmal EndIf bild2 = LoadImage ("...") DrawImage bild2 zahlen(i)=zahl Cls Case 3 If zahl=zahlen(c) Goto nochmal EndIf bild3 = LoadImage ("...") DrawImage bild3 zahlen(i)=zahl Cls End Select Next WaitKey End Ganz vereinfacht sieht das so aus. Ich bitte wieder um produktieve Kritik ![]() |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Meine Kritik ist noch einmal das Goto inmitten irgendwelcher Schleifen oder in diesem Fall jetzt der Case-Abfragen, ohne End Select mal dazwischen durchzuführen. Ich kann auch keine Bestimmung der Variablen a, b und c feststellen, was mir den Sinn vom ganzen ausschliesst. Gerade Anfänger machen oft den Fehler, ganz einfache Sachen total überdreht und kompliziert eine Sache zu lösen. Es wäre sicherlich einfacher für uns alle, wenn du uns ermitteln könntest, was dein Code machen soll. Denn dann können wir vieleicht eine sehr viel bessere Lösung ausarbeiten. Gerade Anfänger haben meisten unbegründet ''Angst'' das jemand ihren Code oder ihre Idee ''klauen'' könnte. Was den Code angeht, kann ich dich wirklich beruhigen, denn da sind schon sehr viel bessere Codes frei verfügbar. Was eine Idee angeht, bleibt jedem selbst überlassen. Jedoch meistens ist der Fall, dass eine als außerordentlich gute Idee sich als Standardidee die jeder schon zu genüge hatte, rausstellt. | ||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
mic_touch |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ok dann stell ich den code halt doch online:
Code: [AUSKLAPPEN] Graphics 800,700,16,2 ;Zufallsgenerator SeedRnd MilliSecs() ;Fonts Font1 = LoadFont("Times New Roman",35,0,0,0) Font2 = LoadFont("Times New Roman",24,0,0,0) Font3 = LoadFont("Times New Roman",50,0,0,0) count = 5 ;Frontpage ;countdown For nix=1 To 5 xf = Rand(0,255) yf = Rand(0,255) zf = Rand(0,255) Color xf,yf,zf Locate 240,0 SetFont font3 Print "Bilder-Rate-Quiz" SetFont font1 Locate 250,500 Print "Das Quiz startet gleich: " vollbild = LoadImage ("vorbereitete bilder\vollbild.bmp") DrawImage vollbild, 150,150 Locate 550,500 Print count Delay 1000 count = count -1 Cls Next .anfang ;Frontpage ende punkte = 0 ;Dim feld erzeugen Dim zahlen(100) Delay 1500 For i = 1 To 3 .nochmal zahl = Rand(1,4) Select zahl Case 1 If zahl=zahlen(1) Goto nochmal EndIf Font1 = LoadFont("Times New Roman",35,0,0,0) Font2 = LoadFont("Times New Roman",20,0,0,0) Locate 0,0 SetFont Font1 Color 243,193,0 Text 0, 0," Bilder-Rate-Quiz Punkte:" + punkte FreeFont Font1 SetFont Font2 Locate 0, 45 Print " Schau dir das Bild genau an. Wenn du weißt was auf dem Bild dargestellt ist," Print " dann trage das Lösungswort in der Zeile ein." Print " Wichig: Schreibe alles in Kleinbuchstaben ! " Print " (sonst erkennt der Computer das Lösungswort nicht)" Delay 2000 bild1 = LoadImage ("vorbereitete bilder\banane1.bmp") DrawImage bild1, 145,130 Locate 0,450 Print " Was ist das? " Write " Eine..." in$ = Input() If in$ = "banane" Then Print " Richtig" punkte = punkte + 2 Else Print " Leider falsch!" Delay 1500 Print " Du bekommst noch einen Versuch!" Print " Also nochmal genau hinschauen, was ist das?" bild2 = LoadImage ("vorbereitete bilder\banane2.bmp") DrawImage bild2, 145,130 b$ = Input (" Eine...") If b$ = "banane" Then Print " Gut jetzt ist es richig." punkte = punkte + 1 Else Print " Leider wieder falsch!" Print " Die richtige Antwort ist: bild3 = LoadImage ("vorbereitete bilder\banane.bmp") DrawImage bild3, 145,130 Print " banane" Delay 5000 EndIf EndIf bild2 = LoadImage ("vorbereitete bilder\banane.bmp") DrawImage bild2, 145,130 Print " Nächstes Bild" Delay 2000 FreeFont font2 zahlen(i)=zahl Cls Case 2 If zahl=zahlen(2) Goto nochmal EndIf Font1 = LoadFont("Times New Roman",35,0,0,0) Font2 = LoadFont("Times New Roman",20,0,0,0) Locate 0,0 SetFont Font1 Color 175,100,75 Text 0, 0," Bilder-Rate-Quiz Punkte:" + punkte FreeFont Font1 SetFont Font2 Locate 0, 45 Print " Schau dir das Bild genau an. Wenn du weißt was auf dem Bild dargestellt ist," Print " dann trage das Lösungswort in der Zeile ein." Print " Wichig: Schreibe alles in Kleinbuchstaben ! " Print " (sonst erkennt der Computer das Lösungswort nicht) Delay 2000 bild1 = LoadImage ("vorbereitete bilder\kiwi1.bmp") DrawImage bild1, 145,130 Locate 0,450 Print " Was ist das? " Write " Eine..." in$ = Input() If in$ = "kiwi" Then Print " Richtig" punkte = punkte + 2 Else Print " Leider falsch!" Delay 1500 Print " Du bekommst noch einen Versuch!" Print " Also nochmal genau hinschauen, was ist das?" bild2 = LoadImage ("vorbereitete bilder\kiwi2.bmp") DrawImage bild2, 145,130 b$ = Input (" Eine...") If b$ = "kiwi" Then Print " Gut jetzt ist es richig." punkte = punkte + 1 Else Print " Leider wieder falsch!" Print " Die richtige Antwort ist: bild3 = LoadImage ("vorbereitete bilder\kiwi.bmp") DrawImage bild3, 145,130 Print " kiwi" Delay 5000 EndIf EndIf bild2 = LoadImage ("vorbereitete bilder\kiwi.bmp") DrawImage bild2, 145,130 Print " Nächstes Bild" FreeFont font2 Delay 2000 Cls zahlen(i)=zahl Case 3 If zahl=zahlen(3) Goto nochmal EndIf Font1 = LoadFont("Times New Roman",35,0,0,0) Font2 = LoadFont("Times New Roman",20,0,0,0) Locate 0,0 SetFont Font1 Color 125,35,35 Text 0, 0," Bilder-Rate-Quiz Punkte:" + punkte FreeFont Font1 SetFont Font2 Locate 0, 45 Print " Schau dir das Bild genau an. Wenn du weißt was auf dem Bild dargestellt ist," Print " dann trage das Lösungswort in der Zeile ein." Print " Wichig: Schreibe alles in Kleinbuchstaben ! " Print " (sonst erkennt der Computer das Lösungswort nicht) Delay 2000 bild1 = LoadImage ("vorbereitete bilder\zwiebel1.bmp") DrawImage bild1, 145,130 Locate 0,450 Print " Was ist das? " Write " Eine..." in$ = Input() If in$ = "zwiebel" Then Print " Richtig" punkte = punkte + 2 Else Print " Leider falsch!" Delay 1500 Print " Du bekommst noch einen Versuch!" Print " Also nochmal genau hinschauen, was ist das?" bild2 = LoadImage ("vorbereitete bilder\zwiebel2.bmp") DrawImage bild2, 145,130 b$ = Input (" Eine...") If b$ = "zwiebel" Then Print " Gut jetzt ist es richig." punkte = punkte + 1 Else Print " Leider wieder falsch!" Print " Die richtige Antwort ist: bild3 = LoadImage ("vorbereitete bilder\zwiebel.bmp") DrawImage bild3, 145,130 Print " zwiebel" Delay 5000 EndIf EndIf bild2 = LoadImage ("vorbereitete bilder\zwiebel.bmp") DrawImage bild2, 145,130 Print " Nächstes Bild" FreeFont font2 Delay 2000 Cls zahlen(i)=zahl Case 4 If zahl=zahlen(4) Goto nochmal EndIf Font1 = LoadFont("Times New Roman",35,0,0,0) Font2 = LoadFont("Times New Roman",20,0,0,0) Locate 0,0 SetFont Font1 Color 230,152,50 Text 0, 0," Bilder-Rate-Quiz Punkte:" + punkte FreeFont Font1 SetFont Font2 Locate 0, 45 Print " Schau dir das Bild genau an. Wenn du weißt was auf dem Bild dargestellt ist," Print " dann trage das Lösungswort in der Zeile ein." Print " Wichig: Schreibe alles in Kleinbuchstaben ! " Print " (sonst erkennt der Computer das Lösungswort nicht) Delay 2000 bild1 = LoadImage ("vorbereitete bilder\sonnenblume1.bmp") DrawImage bild1, 145,130 Locate 0,450 Print " Was ist das? " Write " Eine..." in$ = Input() If in$ = "sonnenblume" Then Print " Richtig" punkte = punkte + 2 Else Print " Leider falsch!" Delay 1500 Print " Du bekommst noch einen Versuch!" Print " Also nochmal genau hinschauen, was ist das?" bild2 = LoadImage ("vorbereitete bilder\sonnenblume2.bmp") DrawImage bild2, 145,130 b$ = Input (" Eine...") If b$ = "sonnenblume" Then Print " Gut jetzt ist es richig." punkte = punkte + 1 Else Print " Leider wieder falsch!" Print " Die richtige Antwort ist: bild2 = LoadImage ("vorbereitete bilder\sonnenblume.bmp") DrawImage bild2, 145,130 Print " sonnenblume" Delay 5000 EndIf EndIf bild3 = LoadImage ("vorbereitete bilder\sonnenblume.bmp") DrawImage bild3, 145,130 Print " Nächstes Bild" FreeFont font2 Delay 2000 Cls zahlen(i)=zahl End Select Next Font1 = LoadFont("Times New Roman",100,0,0,0) Font2 = LoadFont("Times New Roman",50,0,0,0) SetFont Font1 Locate 75,100 Print "Endpunktestand: " + punkte Locate 0,450 SetFont font2 Print " Drücke STRG um noch mal zu spielen." Print " Drücke ESCAPE um das Spiel zu beenden." FreeFont font2 Locate 585,685 Print "Produced by" Repeat If KeyDown(29) Or KeyDown(157) Then Delay 500 Cls Goto anfang EndIf Until KeyDown(1) End Und wie würdest du das jetzt verbessern. Ich hab auch schon gehört das goto böse ist aber ich weiß nich so richtig wie ich des anders machen soll ohne dass ich alles umändern muss. |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Tipp zu ''Wichig: Schreibe alles in Kleinbuchstaben''. Siehe Lower![]() ![]() Tipp zu laufenden LoadImages sollte auch mal FreeImage ![]() Tipp Zeile 28 ''vollbild = LoadImage...'' gehört auf keinen Fall in eine Schleife Generell weiß ich jetzt woran du arbeitest. Grob gesagt kann ich dir ein komplett anderen Lösungsweg unterbreiten, als in den vorhandenen weiter zu arbeiten. Das erste - da die Fragen an sich ein ständig wiederholendes Muster aufweisen - könnten diese in Funktionen untergabracht werden. Es folgt mal eben schnell erstelltes kleines Beispiel, welches auch Alternativantworten erlaubt: Code: [AUSKLAPPEN] Graphics 800,600,0,2
SetBuffer BackBuffer() ;BITTE IMMER MIT ANGEBEN!!!!!!!!!!!!! SeedRnd MilliSecs() Local Timer=CreateTimer(50) Local Image Local Frage Local Gaben$ Local Value Local Zaehlen Local RausHier=0 Const MAX=2 Dim Sachen$(MAX,1) ;FRAGEN Sachen(0,0)="Wie heisst der/die Bundeskanzler/in von Deutschland?" Sachen(1,0)="Welche ist höhstfrequente Farbe die ein Mensch sehen kann?" Sachen(2,0)="Wozu ist ein Haus von nöten?" ;ANTWORTEN Sachen(0,1)="/Angela/Merkel/" Sachen(1,1)="/Blau/Violet/" Sachen(2,1)="/Wohnen/Leben/Schlafen/" Repeat Gaben="" RausHier=0 Frage=Rand(0,MAX) ;Zufällige Frage einstellen FreeImage Image ;Mögliches zuvor geladenes Bild freigeben Image=LoadImage(Str(Frage)+".png") ;Heissen: 0.png, 1.png, 2.png ... Delay 1000 Repeat Text 20,20,"ESC - Programm beenden" Text 20,40,"Frage: "+Sachen(Frage,0) Text 20,60,Gaben+"|" If Image<>0 Then DrawImage Image,20,100 ;Bild wird NUR DANN angezeigt wenn es auch geladen werden konnte Zaehlen=Zaehlen+1 Line 400+Cos(Zaehlen)*100,300+Sin(Zaehlen)*100,400-Cos(Zaehlen)*100,300-Sin(Zaehlen)*100 ;Keys-Abfragen/Zusammenstellen Value=GetKey() If Value=8 Then If Len(Gaben)>0 Then Gaben=Left(Gaben,Len(Gaben)-1) End If Else If Value>31 Then Gaben=Gaben+Chr$(Value) End If End If If KeyHit(28) Then If Instr( Lower(Sachen(Frage,1)), Lower("/"+Gaben+"/")) Then Text 20,80,"Frage richtig beantwortet" RausHier=1 End If End If If KeyHit(1) Then End WaitTimer Timer Flip 0 Cls Until RausHier=1 Forever Ich hoffe es hilft erstmal weiter... Edit1: Die drehende Linie soll symbolisieren, dass das Programm im Hintergrund ganz normal weiter löuft und nicht durch Input unterbrochen wird. |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
mic_touch |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also erst mal danke dafür!!
Aber wenn ich des richtig gesehn habe dann ist des mit dem aus dem zufall ausschließen nicht mit eingebaut. |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nein, aber das sind ja nur ein paar Zeilen Code. Falls du es übernemen solltest, dann solltest du schon den Code auch verstehen. Dazu gehört dann auch, dass einbauen der besagten Codezeilen. Das sollte ja auch nur ein Beispiel für ''sauberes'' programmieren sein. Kein Goto, kein immer fort an ladene Images etc... Inwieweit man den Code noch optimieren kann, hängt vom Anspruch ab. Meiner Meinung nach ist dieser schon auf das wesentliche reduziert. Also im grunde gut für dich ihn besser zu verstehen und die Idee immer wiederkehrende Sachen in logische ''Loops'' unter zu bringen. | ||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group