Delphi-PRAXiS
Seite 5 von 7   « Erste     345 67      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Zufallszahl ziehen ohne wiederholung (https://www.delphipraxis.net/128822-zufallszahl-ziehen-ohne-wiederholung.html)

_frank_ 7. Feb 2009 21:06

Re: Zufallszahl ziehen ohne wiederholung
 
schöner Spaghetti-code :( und massig units...wozu die 3 leeren units (2-4)?
nachdem ich deine projektdatei geöffnet habe, vermute ich, dass die units auch nicht die richtigen sind (anderer Ordner).
lagere mal bitte die fragen+antworten in eine externe Datei (ini,xml,etc) aus, damit das Codesegment universeller und besser lesbarer wird.
36 Schwierigkeitsgrade? ich denke 3 reichen...ist sicher nur unglückliches benamen der variablen.

als kleiner tipp am rande...folgendes lässt sich auch entscheidend verkürzen:
Delphi-Quellcode:
      Case Loesung of
        1:begin
          Panel2.Color:=clgreen;
          Panel3.Visible:=false;
          Panel4.Visible:=false;
          Panel5.Visible:=false;
          end;
        2:begin
          Panel3.Color:=clgreen;
          Panel2.Visible:=false;
          Panel4.Visible:=false;
          Panel5.Visible:=false;
          end;
        3:begin
          Panel4.Color:=clgreen;
          Panel2.Visible:=false;
          Panel3.Visible:=false;
          Panel5.Visible:=false;
          end;
        4:begin
          Panel5.Color:=clgreen;
          Panel2.Visible:=false;
          Panel4.Visible:=false;
          Panel3.Visible:=false;
          end;
z.b. so:
Delphi-Quellcode:
var panel:TPanel
Panel2.Visible:=false;
Panel3.Visible:=false;
Panel4.Visible:=false;
Panel5.Visible:=false;
panel:=findcomponent('Panel'+IntToStr(Loesung+1));
if assigned(panel) then
begin
  panel.visible:=true;
  panel.color:=clGreen;
end;
oder
Delphi-Quellcode:
  case ZS of
    1:
    begin
      with mediaplayer1 do
      begin
        Filename:=Pfad+'\Mediendateien\richtigeAntwort\1.wav';
        mediaplayer1.Open;
        mediaplayer1.Play;
      end;
    end;
... //obiger code noch 3x und das bei jedem panelclick.
einfach so:
Delphi-Quellcode:
with mediaplayer1 do
begin
  Filename:=Pfad+'\Mediendateien\richtigeAntwort\'+IntToStr(ZS)+'.wav';
  mediaplayer1.Open;
  mediaplayer1.Play;
end;
du kannst mehreren Panels auch die gleiche Click-Prozedur zuweisen...so sparst du redundaten code...
wenn du die paar sachen machst und noch eine bessere Einrückung :) dann wird dein code schonmal viel besser lesbar.warum eigentlich 4 mediaplayer?

den Vergleich, ob frage schon gefragt wurde hab ich noch nicht gefunden...

Gruß Frank

jaenicke 7. Feb 2009 21:22

Re: Zufallszahl ziehen ohne wiederholung
 
Sag mal, kann das sein, dass da die falschen Dateien dabei sind? In dem Quelltext nimmst du ja noch eine beliebige Zufallszahl. Im Projekt wird verwiesen auf ein Verzeichnis '..\das was net ging\Delphi Projekt', aber diese Dateien sind leider nicht dabei...

Zum Konzept: Wie wäre es, wenn du die Fragen aus einer Datei lädst oder zumindest konstante Arrays benutzt? So ist das doch viel zu umständlich, wenn du Fragen hinzufügst, etc.

// EDIT:
Zur Frage "Wo ist der Sitz des Bundeshauses?":
Der Sitz des Bundestages ist Berlin und das Bundeshaus steht immer noch in Bonn, wird aber anderweitig verwendet.

walli18 7. Feb 2009 21:43

Re: Zufallszahl ziehen ohne wiederholung
 
Das habe ich auch schon gerade festgestellt, ich werde gleich noch mal die richtigen hochladen

jaenicke 7. Feb 2009 21:46

Re: Zufallszahl ziehen ohne wiederholung
 
Da reichen aber die Quelltextdateien, und die kannst du auch hier in den Anhang legen, wer die anderen Dateien dazu will, der kann ja den Link oben benutzen.

walli18 7. Feb 2009 22:18

Re: Zufallszahl ziehen ohne wiederholung
 
So das hab ich jetzt auch gemacht! Hier ist der Quelltext!
http://rapidshare.com/files/19529755...lli18.rar.html
Sorry, ich hätts auch hier hochladen können, is mir aber zu spät eingefallen!


Das Problem bleibt immer noch:
1. ich muss den Quelltext redundanter gestalten
2. wieso er in der unit 5 bei button 1 click das mit der zufallszahl z super macht und in der listbox dokumentiert aber genau dasselbe bei form5.button 2. click nicht macht und immer gleich die if bedingung erfüllt was dazu führt, dass er schreibt, sie haben das spiel erfolgreich beendet

jaenicke 7. Feb 2009 22:32

Re: Zufallszahl ziehen ohne wiederholung
 
Zitat:

Delphi-Quellcode:
procedure TForm5.Button2Click(Sender: TObject);

var p,z,i:integer;

    liste: string;
begin
////////////////////////////////////////////////////////////////////////
  Randomize;
 // liste:='';
  //for i:=1 to gesamt do
    //liste:=liste+chr(i);
if length(liste)<=gesamt-anzahl then
  begin
    showmessage('Sie haben das Spiel erfolgreich beendet!');
    exit;
  end;

Erstens hast du eine lokale Variable liste, deine globale gleichnamige Variable wird also gar nicht benutzt... :roll:
Zweitens ist der Quelltext auskommentiert, der die Variable füllt...

So geht es bei mir:
Delphi-Quellcode:
procedure TForm5.Button2Click(Sender: TObject);

var p,z,i:integer;

    //liste: string;
begin
////////////////////////////////////////////////////////////////////////
  Randomize;
  liste:='';
  for i:=1 to gesamt do
    liste:=liste+chr(i);
if length(liste)<=gesamt-anzahl then

walli18 7. Feb 2009 22:46

Re: Zufallszahl ziehen ohne wiederholung
 
Danke jaenicke! Ich bin einen großen Schritt weiter!
Es funktioniert jetzt! Ich hab nur noch das Problem, dass ich ja immer wieder wenn ich eine neue zufallszahl will und die brauche ich 15 mal auf button 2 clicke!
und mit dieser variante kommen dann die zufallszahlen doppelt vor, das möchte ich ja aber nicht, da ich keine doppelten fragen haben möchte! Ich denke das liegt daran, dass diese liste immer beim klicken auf button 2 neu erstellt wird, aber wie muss ich den quelltext ändern, damit die ersten 15 zufallszahlen nicht doppelt vorkommen??
Ich hab auch noch nen button für neues spiel, dabei sollten wieder neue zufallszahlen kommen! Was muss ich da eigeben??

jaenicke 7. Feb 2009 22:58

Re: Zufallszahl ziehen ohne wiederholung
 
Ach ja, die Initialisierung brauchst du da ja nicht. Die brauchst du dann aber für ein neues Spiel, womit deine zweite Frage beantwortet ist. ;-)
Delphi-Quellcode:
procedure TForm5.Button2Click(Sender: TObject);

var p,z,i:integer;

begin
////////////////////////////////////////////////////////////////////////
  Randomize;
if length(liste)<=gesamt-anzahl then
Und einen Fehler: Wenn ich auf Weiter statt eine Antwort klicke wird trotzdem weitergezählt...

walli18 7. Feb 2009 23:06

Re: Zufallszahl ziehen ohne wiederholung
 
dankeschön, soweit habe ich das auch jetzt endlich hinbekommen! Es bleibt noch eine frage! mit neues spiel starten klappt! Das problem ist nur, dass ich button2. click in form5 habe und neues spiel starten in form6 habe! Der quelltext funktioniert (ich hab ihn mal zum neuen Spiel starten in form5 gehauen) aber in form6 kann ich die liste aus form5 net löschen! Was muss ich dafür tun??

Danke für die Antwort!

jaenicke 7. Feb 2009 23:08

Re: Zufallszahl ziehen ohne wiederholung
 
Weil du die Variable Liste in der implementation Sektion deklariert hast. Damit ist diese nur innerhalb dieser Unit sichtbar. Du kannst die Variable unter public deklarieren, dann kannst du mit Form5.liste auch darauf zugreifen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:18 Uhr.
Seite 5 von 7   « Erste     345 67      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz