Aus Zufall ausschließen

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

mic_touch

Betreff: Aus Zufall ausschließen

BeitragDo, Dez 18, 2008 18:17
Antworten mit Zitat
Benutzer-Profile anzeigen
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??

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Dez 18, 2008 18:21
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Dez 18, 2008 18:28
Antworten mit Zitat
Benutzer-Profile anzeigen
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)

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Dez 18, 2008 18:51
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Dez 18, 2008 19:06
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Dez 18, 2008 19:16
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Dez 18, 2008 19:25
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Dez 18, 2008 20:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Tipp zu ''Wichig: Schreibe alles in Kleinbuchstaben''. Siehe Lower und ggf. Trim

Tipp zu laufenden LoadImages sollte auch mal FreeImage in betracht gezogen werden

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

BeitragDo, Dez 18, 2008 21:17
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Dez 18, 2008 21:26
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group