AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Wer wird Millionär

Ein Thema von Dilip · begonnen am 9. Mär 2016 · letzter Beitrag vom 13. Mär 2016
Antwort Antwort
Dilip

Registriert seit: 3. Mär 2016
10 Beiträge
 
#1

Wer wird Millionär

  Alt 9. Mär 2016, 16:26
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)
  Mit Zitat antworten Zitat
Mikkey

Registriert seit: 5. Aug 2013
265 Beiträge
 
#2

AW: Wer wird Millionär

  Alt 9. Mär 2016, 17:10
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.
  Mit Zitat antworten Zitat
Dilip

Registriert seit: 3. Mär 2016
10 Beiträge
 
#3

AW: Wer wird Millionär

  Alt 9. Mär 2016, 19:56
und was muss ich da dann eingeben
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
398 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Wer wird Millionär

  Alt 9. Mär 2016, 20:20
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 if Button1.Click then probiert hast.
  Mit Zitat antworten Zitat
Headbucket

Registriert seit: 12. Dez 2013
Ort: Dresden
172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: Wer wird Millionär

  Alt 10. Mär 2016, 06:27
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

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
  Mit Zitat antworten Zitat
Dilip

Registriert seit: 3. Mär 2016
10 Beiträge
 
#6

AW: Wer wird Millionär

  Alt 10. Mär 2016, 15:14
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

Geändert von Dilip (10. Mär 2016 um 15:25 Uhr)
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.549 Beiträge
 
Delphi 6 Enterprise
 
#7

AW: Wer wird Millionär

  Alt 10. Mär 2016, 16:52
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.
Ralph
  Mit Zitat antworten Zitat
mm1256

Registriert seit: 10. Feb 2014
Ort: Wackersdorf, Bayern
640 Beiträge
 
Delphi 10.1 Berlin Professional
 
#8

AW: Wer wird Millionär

  Alt 10. Mär 2016, 18:34
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
Gruss Otto
Wenn du mit Gott reden willst, dann bete.
Wenn du ihn treffen willst, schreib bei Tempo 220 eine SMS
  Mit Zitat antworten Zitat
Dilip

Registriert seit: 3. Mär 2016
10 Beiträge
 
#9

AW: Wer wird Millionär

  Alt 13. Mär 2016, 12:35
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
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:15 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf