Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Wer wird Millionär (https://www.delphipraxis.net/188495-wer-wird-millionaer.html)

Dilip 9. Mär 2016 16:26

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)

Mikkey 9. Mär 2016 17:10

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.

Dilip 9. Mär 2016 19:56

AW: Wer wird Millionär
 
und was muss ich da dann eingeben

bcvs 9. Mär 2016 20:20

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:
if Button1.Click then
probiert hast.

Headbucket 10. Mär 2016 06:27

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

Dilip 10. Mär 2016 15:14

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

Jumpy 10. Mär 2016 16:52

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:
procedure TMain.GeneralButtonClick(Sender: TObject);
var Antwort:integer;
begin
  if Sender is TButton then
    begin
    Anttwort:=TButton(Sender).Tag;
    VerarbeiteAntwort(Antwort);
    end;
end;
"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.

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.

mm1256 10. Mär 2016 18:34

AW: Wer wird Millionär
 
Zitat:

Zitat von Dilip (Beitrag 1332589)
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 dir mal kurz ein Beispiel gemacht.

Delphi-Quellcode:
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.
@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:

Dilip 13. Mär 2016 12:35

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 02:51 Uhr.

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