![]() |
Wer wird Millionär
Hey, ich habe vor mit Delphi Wer wird Millionär zu programmieren. Komme aber nicht weiter..
Und zwar hab ich die oberfläche so gestaltet, dass die Frage in ein Label geschrieben werden soll und die Antworten auf den 4 Buttons erscheinen. Auf einem anderen Label wird der momentane Geldbetrag gezeigt. Mit einem BitBtn startet das ganze. Wenn ich auf den BitBtn klicke, kommt die erste Frage, mit Antwortmöglichkeiten, Geldbetrag 0€ Aber wie schaffe ich es jetzt, wenn ich den Button mit der richtigen Antwort anklicke, das die nächste Frage gestellt wird. Und wenn ein anderer Button angeklickt wird, mit einer falschen antwort, dass kein geld gewonnen wurde ( oder eben 500€ ) Mein anfang sieht also so aus: ( Beispielfrage ) procedure TForm1.BitBtn1Click(Sender: TObject); begin Label1.Caption := 'Was ist 2 + 2?'; Button1.Caption := '4'; Button2.Caption := '1'; Button3.Caption := '5'; Button4.Caption := '3'; Ich habe es mit if Button1.Click then Label1.Caption := 'Welches chemische Element hat Chlor?' Button1.Caption := ... ... .. Aber ich bekomme die Fehlermeldung in der Zeile if Button1.Click then - es muss angeblich Datentyp boolean sein.. Könnte mir jemanden bei einem Ansatz behilflich sein? Und ich möchte die Frage erstmal mit im Programm haben, nicht einlesen lassen ( auch wenn das wahrscheinlich einfacher ist) |
AW: Wer wird Millionär
Zu Button(x).Click musst Du eine Ereignisbehandlungsprozedur zuweisen. Die wird dann aufgerufen, wenn der Button gedrückt wird.
In der Prozedur kannst Du dann Deinen Code unterbringen. Es wäre in der Tat einfacher, Dir zumindest eine Liste mit Fragen und Antwortmöglichkeiten zu machen, in der Du jeweils "weiterschalten" kannst. |
AW: Wer wird Millionär
und was muss ich da dann eingeben
|
AW: Wer wird Millionär
Doppelklick auf den Button. Dann wird die die Ereignisprocedure angelegt. Da kannst du dann reinschreiben, was bei einem Klick auf den Button passieren soll, z.B,. das was du zuerst bei deinem
Delphi-Quellcode:
probiert hast.
if Button1.Click then
|
AW: Wer wird Millionär
Die Antworten von Mikkey und bcvs werden aber langfristig nicht zum Ziel führen. Außer du möchtest nur 4 Fragen stellen und legst die Antworten stets auf unterschiedliche Buttons :wink:
Du solltest dir also erstmal ein Konzept erstellen. Natürlich brauchst du auch die Ereignisproecedure(n) der Buttons, jedoch darst du dort natürlich nicht die nächste Frage stellen, sondern lediglich bemerkbar machen, dass dieser Button gedrückt wurde. In einer anderen Procedure muss dann entschieden werden, ob der gedrückte Button zu der aktuellen Frage die richtige Antwort enthält. Überlege dir also erstmal, wie du einen "Katalog" mit Fragen und Antworten erstellen kannst. Dann überlegst du dir eine Routine, wie du die Frage und die dazugehörigen Antworten auf die Buttons bekommst. Zuletzt schreibst du z.B. eine Routine, die aufgerufen wird, wenn einer der Buttons gedrückt wird. Hier kannst du z.B. über die "Tag" Eigenschaft herausfinden, welcher Button gedrückt wurde. Nun muss noch entschieden werden, ob die richtige Antwort gedrückt wurde. So könnte man das relativ einfach und überschaubar aufziehen. Natürlich gibt es immer noch elegantere Lösungen. Grüße |
AW: Wer wird Millionär
An die Tag Variante hab ich auch schon gedacht
Das ist doch case ... of , oder? Aber ich weiß nicht was ich dazwischen schreiben soll muss ich da Button1.Click Button1 TButton1... hinschreiben? oder eine neue Variable definieren? ich hab es mal kurz versucht und habe einfach ein Formular 1 Button und 1 Edit procedure TForm1.Button1Click(Sender: TObject); begin case TButton(Sender).Tag of 1: Edit1.Text := 'Falsch'; 2: Edit1.Text := 'Falsch' ; 3: Edit1.Text := 'Richtig'; end; end; Normalerweise müsste doch mit 1x drücken falsch, beim 2x auch falsch und beim 3x mal richtig in der Edit komponente stehen, das Programm startet auch ohne Fehlermeldung, schreibt aber nichts in die Edit |
AW: Wer wird Millionär
Du kannst das Ganze natürlich komplett OOP mit entsprechenden Klassen lösen und die Logik von der Darstellung trennen, das wäre sicher das sinnvollste. Anhand deiner Fragen und Ansätze behaupte ich aber mal, dass du noch nicht so weit bist.
Deswegen würde ich schon mit einem einfachen Formular, wie du es vorhast anfangen, wobei ich glaube ich auf die Buttons nur die Buchstaben (A,B,C,D) drauf schreiben würde und die Fragen auf dazu passenden Pandels oder Labeln oder sowas anzeigen, aber das ist Geschmacksache. Dann einen Button zum Starten des Spieles, mit dem du immer wieder ein neues Spiel starten kannst. Dann eine Variable (integer) zur Speicherung der Fragestufe. Eine Variable zur Speicherung welche Antwort(möglichkeit) für die aktuelle Frage die richtige Lösung ist (integer, um es einfach zu halten z.B.: A=1, B=2, ...). Den Buttons A-D in der Tag Eigenschaft die dazu passende Zahl 1-4 zuordnen. Den Buttons A-D allen die gleiche Button-Klick-Prozedur zuweisen, die könnte ungefähr so aussehen:
Delphi-Quellcode:
"VerarbeiteAntwort" wäre dann eine weitere Prozedur, die im vergleich mit der obigen Variable prüft, ob die Antwort richtig ist und dann entweder das Spiel beenden oder aber die Fragestufe erhöht, die Betragsanzeige aktualisiert, die nächste Frage lädt.
procedure TMain.GeneralButtonClick(Sender: TObject);
var Antwort:integer; begin if Sender is TButton then begin Anttwort:=TButton(Sender).Tag; VerarbeiteAntwort(Antwort); end; end; Alle die gerade genannten Punkte sollten dabei jeweils in eigene Prozeduren ausgelagert werden, die dann jeweils die entsprechende Aufgabe erledigen. Was du dir aber sinnvollerweise vorher mal überlegen musst: Wo kommen die Fragen her. Du brauchst ja einen Pool von Fragen am besten mit dazugehöriger Fragestufe, den Antworten und der Info welches die richtige Antwort ist. Davon Abhängig, wie du so Fragen, wo speicherst, hängt dann natürlich ab wie eine Funktion zum laden der nächsten Frage aussehen würde. |
AW: Wer wird Millionär
Zitat:
Delphi-Quellcode:
@all Sicher kann man das besser lösen, und vor Allem sollte man keine Komponente (in dem Fall den Button) zum Speichern von Daten missbrauchen, also GUI und Daten sauber trennen, das ist mir schon klar. Es geht aber erst mal darum dass der TE vorwärts kommt. Der Rest ergibt sich mit der Zeit von selbst :thumb:
unit uWWM;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; ButtonClose: TButton; LabelFrageText: TLabel; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure ButtonCloseClick(Sender: TObject); private { Private-Deklarationen } FRichtigBeantwortet: integer; FGewinnSumme: double; public { Public-Deklarationen } procedure FrageLaden; procedure GewinnSummeAktualisieren; end; var Form1: TForm1; implementation {$R *.dfm} { TForm1 } // Jeder der 4 Buttons hat dieses "OnClick"-Ereignis procedure TForm1.Button1Click(Sender: TObject); begin if (Sender as TButton).Tag = 0 then begin // falsche Antwort // ... wiederholen??? // oder ButtonClose.Click; end else begin // richtige Antwort GewinnSummeAktualisieren; FrageLaden; end; end; procedure TForm1.ButtonCloseClick(Sender: TObject); begin Close; end; procedure TForm1.FormCreate(Sender: TObject); begin FRichtigBeantwortet := 0; end; procedure TForm1.FrageLaden; var RichtigeAntwort: Integer; begin // Hier Code zum Laden der Frage, z.B. aus einer Datei LabelFrageText.Caption := 'Der Text zur Frage'; // In der Datei muss natürlich angegeben sein, welche Antwort die richtige ist RichtigeAntwort := 1; // 2, 3 oder 4; // Alle Buttons Tag auf "null" Button1.Tag := 0; Button2.Tag := 0; Button3.Tag := 0; Button4.Tag := 0; // Welcher Button gibt die richtige Antwort case RichtigeAntwort of 1 : Button1.Tag := 1; 2 : Button2.Tag := 1; 3 : Button3.Tag := 1; 4 : Button4.Tag := 1; else raise Exception.Create('Richtige Antwort im ungültigen Bereich 1..4'); end; end; procedure TForm1.GewinnSummeAktualisieren; begin Inc(FRichtigBeantwortet); case FRichtigBeantwortet of 1 : FGewinnSumme := 50.00; 2 : FGewinnSumme := 100.00; 3 : FGewinnSumme := 200.00; // ... usw. end; end; end. |
AW: Wer wird Millionär
Hey, ich hab jetzt einfach selber versucht etwas hinzubekommen und für mich klappt es schon sehr gut ( auch wenn der Quelltext wahrscheinlich viel zu viel ist und wesentlich leichter realisierbar wäre ^^ )
Ich habe es jetzt geschafft, dass ich 15 Fragen habe, bei richtiger Antwort gehts weiter, bei falscher hört es auf.. Alles super soweit Jetzt möchte ich gern, da es sonst langweilig wird, Zufallsfragen haben ich habe es wiefolgt versucht procedure Frage1(i:longint); begin randomize; i := random(3)+1; if i = 1 then Form1.Label2.Caption := '"Andere Länder, andere ...?"'; //1. Frage Form1.Button1.Caption := 'Fritten'; Form1.Button2.Caption := 'Schlitten'; Form1.Button3.Caption := 'Sitten'; Form1.Button4.Caption := 'Oberweiten'; if i = 2 then Form1.Label2.Caption := '"Was ist 2+2?"'; //1. Frage Form1.Button1.Caption := '2'; Form1.Button2.Caption := '3'; Form1.Button3.Caption := '4'; Form1.Button4.Caption := '5'; if i = 3 then Form1.Label2.Caption := '"Blablabla'; //1. Frage Form1.Button1.Caption := 'Falsch'; Form1.Button2.Caption := 'Falsch'; Form1.Button3.Caption := 'Richtig'; Form1.Button4.Caption := 'Falsch'; end; procedure TForm1.BitBtn1Click(Sender: TObject); var i:longint; begin Button1.Tag := 0; Button2.Tag := 0; Button3.Tag := 0; Button4.Tag := 0; Frage1(i); end; Bei Klick auf den BitBtn wird die Procedure Frage1 aufgerufe In dieser soll eine von den 3 Fragen zufällig ausgewählt werden Ich habe das Problem, dass sich nur die Fragen ändern, die Antwortmöglichkeiten aber immer die selben ( Amöglichkeiten sind immer die, aus i = 3) sind und nicht zur Frage passen.. Wo habe ich da einen Fehler gemacht? Das Programm startet auch, aber es steht da 'i' does not seem to be initialized |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz