Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Anfänger sucht Hilfe bei ersten Programierschritten (https://www.delphipraxis.net/82577-anfaenger-sucht-hilfe-bei-ersten-programierschritten.html)

lun87 15. Dez 2006 21:56


Anfänger sucht Hilfe bei ersten Programierschritten
 
Hallo miteinander,

Ich wollte mir mal ein eigenes Programm überlegen und da ich noch recht neu in der Programmiersprache bin, habe ja schon das eine oder andere Thema hier verfasst, wollte ich euch fragen, ob mir wer ein paar Tipps bei meinem Prog geben könnte und vielleicht sogar ein paar Anfängerhilfen.

Danke euch! Hier mein soweit nicht funkionsfähiges Prog:

Delphi-Quellcode:
procedure TForm1.ratebuttonClick(Sender: TObject);
var eingabezahl : array [0..4] of integer;
    zufallszahl, i, ratezahl : integer;
begin
i := 0;
zufallszahl := 0;
Randomize;


repeat
 zufallszahl := random(20);
 ratezahl := strtoint (eingabeedt.Text);
If ratezahl = zufallszahl then
  For i := 1 to i do
    eingabezahl[i] := ratezahl;
    inc(i)

    else
      showmessage('Falsche Zahl gleich nochmal!');

until (zufallszahl = ratezahl)



For i := 1 to i do

    eingabezahlen.Caption := inttostr(eingabezahl[i]);
    inc(i);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  eingabeedt.text := '';
  showmessage('Im folgenden hast du 5 Versuche die gesuchte Zahl zu finden. Sie liegt zwischen 1 und 20!');
end;

end.
Das Prog soll folgendes leisten:
1. Eine Zufallszahl wird generiert.
2. Die Zufallszahl wird mit der Zahl des Anwenders verglichen (5 Versuche hat man!)
3. Wenn er richtig geraten hat, soll er die Zahl in einem Array speichern und in dem einen Panel ausgeben und eine Antwort im anderen Panel.
3. Wenn nicht soll er die geratene Zahl im Array speichern und nun soll der Anwender eine neue Chance bekommen. Meine Frage nun:
Wie sage ich, dass er eine 2. Chance bekommt, ohne dabei meinen ersten Wert zu verlieren? Sollen zum Schluss alle geratenen Zahlen ausgegeben werden.
4. Wie kann ich im Formcreate, es so machen das ERST das Formular erscheint und dann meine showmessage ? Mitm Delay vll?

Vielen Dank an Euch für die Hilfe. Vielleicht habt ihr die eine oder andere Idee wie man so als Anfänger an sowas rangeht und sich in Delphi reinfindet.

MFG
Lun87

Martin K 15. Dez 2006 22:18

Re: Anfänger sucht Hilfe bei ersten Programierschritten
 
Guck Dir mal die Syntax für eine FOR-Schleife an:

Beispiel:
Delphi-Quellcode:
For i := 1 to 20 do
  Anweisung;
Die For-Schleife wird genau 20mal durchlaufen, wobei i beim ersten Durchlauf den Wert 1 hat, beim zweiten 2, usw. bis 20.
i wird also vom Startwert 1 aus so oft erhöht, bis es den Wert 20 hat.

Eine Schleife mit Endwert i wobei i auch die Zählvariable ist wie in Deinem Code, ist also falsch.

In Deinem Fall soll wohl das Array durchlaufen werden, also soll i die Werte von 0 bis 4 annehmen.
Überlege Dir selbst, wie Du dann mein Beispiel abändern musst.

Ein Inc(i) ist hier fehl am Platz, da i automatisch beim nächsten Durchlauf um 1 erhöht wird.


Wenn in der Schleife mehrere Anweisungen stehen sollen, musst Du einen begin/end-Block um die Anweisungen machen.

Beispiel:
Delphi-Quellcode:
For i := 1 to 20 do
begin
  Anweisung1;
  Anweisung2;
  usw.
end;
Wenn nur eine Anweisung in der Schleife steht, kannst Du auf begin/end verzichten.



zufallszahl := 0; (am Anfang)
Diesen Wert von zufallszahl verwendest Du nirgends, Du kannst diese Zeile also streichen.
Dasselbe gilt für die Anweisung
i := 0;

[Edit:]
Das Auslesen der ratezahl aus eingabeedt.Text und die ganze IF-Abfrage sollten wohl in die For-Schleife mit rein, da ratezahl sonst den Wert innerhalb der For-Schleife nie ändert.

Zitat:

Zitat von lun87
Die Zufallszahl wird mit der Zahl des Anwenders verglichen (5 Versuche hat man!)

Dann würde ich allerdings keine For-Schleife verwenden, sondern NUR die repeat/until-Schleife (For-Schleife weglassen).
Die repeat/until-Schleife wird dann verlassen, wenn entweder zufallszahl = ratezahl ist oder der Anwender 5mal geraten hat, also i = 4 ist.
In diesem Fall musst Du dann doch i initialisieren (auf den Startwert 0 setzen, wie es in Deinem Code oben ist) und in der repeat/until-Schleife muss i um 1 erhöht werden, also Inc(i) so wie es war :wink:

(sorry dass ich es erst anders geschrieben hatte, aber mir war nicht so ganz klar, was Du mit der For-Schleife bezwecken willst.
Also im Prinzip müsste es klappen, wenn Du die Zeile mit der For-Schleife einfach streichst.)

lun87 15. Dez 2006 22:31

Re: Anfänger sucht Hilfe bei ersten Programierschritten
 
Gut das hat geklappt danke. Nun bleiben mir aber noch 2 unerklärliche Fragen:
1. Wie lasse ich ihn den zweiten Versuch machen? Application.new oder sowas? Wobei er aber den Wert des ersten Males behalten soll!
2. Wie rufe ich ERST das Formular auf und dann die showmessage?

mfg
Lun87

Martin K 15. Dez 2006 22:45

Re: Anfänger sucht Hilfe bei ersten Programierschritten
 
Schau Dir erstmal meinen Nachtrag im obigen Beitrag an.

Für den zweiten Versuch müsstest Du praktisch warten, bis der Benutzer was neues eingegeben hat.
In diesem Fall müsstest Du es wohl doch komplett anders machen.
Das array müsste global gespeichert werden und auch die Zählvariable i, damit man weiß, beim wie vielten Versuch er ist.
Bei FormCreate müsstest Du erstmal i auf 0 setzen.

Beim Klick auf den Button müsstest Du dann erst überprüfen, was hat der Benutzer eingegeben, ist es die richtige Zahl oder hat er seine 5 Versuche erreicht (IF-Abfrage).
Anhand dieser Abfrage legst Du dann fest ob er nochmal raten darf oder nicht.

[Edit:]
und Du kannst auch entscheiden, was Du machst, wenn er keine Versuche mehr hat und richtig geraten hat bzw. nicht richtig geraten hat.

Inc(i) muss natürlich auch noch rein, da ja wieder ein Versuch dazu kommt.

Zitat:

Zitat von lun87
Wie rufe ich ERST das Formular auf und dann die showmessage?

FormCreate wird aufgerufen BEVOR das Formular sichtbar wird.
Was soll das für einen Sinn haben, gleich beim Starten des Programms eine ShowMessage zu bekommen? :gruebel:

Martin K 15. Dez 2006 22:59

Re: Anfänger sucht Hilfe bei ersten Programierschritten
 
Nochwas ist mir grade aufgefallen:
Zitat:

Zitat von lun87
Delphi-Quellcode:
showmessage('Im folgenden hast du 5 Versuche die gesuchte Zahl zu finden. Sie liegt zwischen 1 und 20!');
Delphi-Quellcode:
zufallszahl := random(20);

:arrow: Vorsicht!
random(20); erzeugt eine Zahl zwischen 0 und 19 :!:

Du musst also noch 1 dazu addieren:
Delphi-Quellcode:
zufallszahl := random(20) + 1;

Tipp:
Anstatt eingabeedt.text := ''; in FormCreate zu sezten kannst Du auch einfach im ObjektInspektor bei eingabeedit die Eingenschaft Text auf den gewünschten Wert setzen.

lun87 15. Dez 2006 23:08

Re: Anfänger sucht Hilfe bei ersten Programierschritten
 
Gut habs jez auf das hier reduziert:

Delphi-Quellcode:
type
  TZahl = array [0..4] of integer;
  TForm1 = class(TForm)
    ratebutton: TButton;
    ausgabeedt: TPanel;
    eingabeedt: TEdit;
    eingabezahlen: TPanel;
    Label1: TLabel;
    procedure ratebuttonClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Zahl : TZahl;

implementation

{$R *.dfm}

procedure TForm1.ratebuttonClick(Sender: TObject);
var i , eingabezahl, ratezahl: integer;
begin
 i := 0;

repeat
   If i = 4 then
     showmessage('Tja war wohl nichts!')
   else
    eingabezahl := strtoint(eingabeedt.text);
    Zahl[i] := eingabezahl;   -----> neue Chance einen neuen WErt einzugeben, dabei soll alter Wert aber behalten werden !!!
    inc(i);

until (eingabezahl = ratezahl) or (i = 4);

end;

procedure TForm1.FormCreate(Sender: TObject);
var i, zufallszahl : integer;
begin
  Randomize;
  zufallszahl := random(20)+1;
  eingabeedt.text := '';
end;

end.


Ich muss ihm doch jetzt noch sagen, dass er in der repeat schleife dem benutzer immer wieder die chance gibt eine neue zahl einzugeben? wie mache ich das ? vielmehr wie sage ich ihm behalte die erste zahl gib ihm ne neue chance ?

mfg
lun87

Martin K 15. Dez 2006 23:15

Re: Anfänger sucht Hilfe bei ersten Programierschritten
 
Lass doch die repeat/until-Schleife weg und mache es wie ich oben geschrieben habe. :wink:
Wenn Du ne Frage hast oder was nicht verstehst, von dem was ich geschrieben habe, frag einfach nach. :wink:

BTW:
Delphi-Quellcode:
For i := 0 to 4 do
ausgabeedt.caption := inttostr(Zahl[i]);
Überlege Dir mal, warum in diesem Fall in ausgabeedt.caption nur der letzte Eintrag aus dem Zahlen-Array steht.
Gehe mal jeden Schritt der Schleife durch, evtl. auf einem Blatt Papier.

[Edit:]
Zitat:

Delphi-Quellcode:
Zahl[i] := eingabezahl;   -----> neue Chance einen neuen WErt einzugeben, dabei soll alter Wert aber

i wird doch immer erhöht, also steht der alte Wert an einer niedrigeren Stelle im Array.

Mal Dir doch mal sowas auf ein Papier oder so:
Code:
array-index Wert
(für i)
-----------------------
0            // Eingabe beim ersten Versuch
1            // Eingabe 2. Versuch
2            ....
3
4
[edit=Christian Seehase]Delphi- und Quote-Tags korrgiert. Mfg, Christian Seehase[/edit]

Martin K 15. Dez 2006 23:22

Re: Anfänger sucht Hilfe bei ersten Programierschritten
 
Sorry, ich hab hier keine Ahnung was grad mit der DP abgeht, die Zahl hinter [/quote] kam automatisch, die hab ich nich hingemacht.
Kam auch nach dem Editieren wieder...

lun87 15. Dez 2006 23:28

Re: Anfänger sucht Hilfe bei ersten Programierschritten
 
Danke Dir aber ich check das nicht mehr jetzt...-.- Kopf ist zu. Muss pennen morgen in aller frische wieder :)

jedenfalls müsste es so sein:

User gibt Zahl ein.
programm guckt ob anzahl der versuche = 4 ist
wenn nein dann startet er und vergleicht ratezahl mit eingabezahl
wenn treu dann ausgabe der ratezahl ansonsten neuer versuch und ratezahl im feld merken
man hat 5 versuche wenns nicht klappt wird gesagt: tja klappt wohl nicht
wenn beim 4. versuch-> werden die 4 Zahlen ausgeben und die randomzahl

naja Gute NAcht gucke noch kurz aber globe net das ich zu einem vernünftigen Ergebnis komme mehr...


Delphi-Quellcode:
begin
i := 0;


For i := 0 to 4 do


   If (i = 4) then
     showmessage('Tja war wohl nichts!') ----> neuer versuch initialisieren *aaaaargh* nicht mehr denkfähig heute xD
   else
   begin
    eingabezahl := strtoint(eingabeedt.text);
    Zahl[i] := eingabezahl;
     inc(i);            ----> sobald ich hier begin und end setze kennt der i nicht mehr *grrrrrr* -.-
    end;




For i := 0 to 4 do
ausgabeedt.caption := inttostr(Zahl[i]);
inc(i);
end;



mfg
LUn87

Maja Jessica 16. Dez 2006 00:07

Re: Anfänger sucht Hilfe bei ersten Programierschritten
 
Guten Morgen

Habe dein Problem ein wenig verfolgt und möchte auch meinen Senf dazu geben :wink:

Zitat:

Zitat von Martin K
Lass doch die repeat/until-Schleife weg und mache es wie ich oben geschrieben habe. :wink:

Genau! Lass Dir gesagt sein, bis auf die Ausgabe der Zahlen am Schluss brauchst du im ganzen Progamm nicht eine for- oder repeat- Schleife.

Du musst nur beherzigen, daß dein Programm ereignissorientiert aufgebaut werden muss, und nicht wie früher so oft in Ablauffolge.

Also nur wenn der RateButton gedrückt wurde, in ratebuttonClick
-> Prüfen -> Versuchszähler um 1 erhöhen -> Ratezahl in Array[Versuchszähler] speichern

Dann kannst du dir noch die einzig nötige Schleife zu Ausgabe in den ButtonClick eibauen;

(PseudoCode)
Delphi-Quellcode:
RateButtonClick
...
// -> Prüfen -> Versuchszähler um 1 erhöhen -> Ratezahl in Array[Versuchszähler] speichern
if (RateZahl = Zufallszahl) OR (Versuchzähler = 4) then
  for i := 0 to 4 ShowMessage( IntToStr(Array[i]) );
end;
Globale Variablen sind eigentlich verpönnt, doch am Anfang wunderbar verständlich.
Schaffe dir eine globale Variable Versuchszaehler und erhöhe diese grundsätzlich nur wenn der
Ratebutton betätigt wurde.

Und dieses:
Delphi-Quellcode:
For i := 0 to 4 do
ausgabeedt.caption := inttostr(Zahl[i]);
inc(i);
end;
ist, sorry das ich das so direkt schreibe, total vermurkst.
Du lässt in eine Schleife 4 mal eine Zahl an ausgabeedt anzeigen. Das geht so fix, das du nur noch die letzte Zahl sehen kannst.
In der Schleife selbst wird automatisch die Laufvariable "i" immer um 1 erhöht. Das inc(i) ist also mehr als überflüssig.

Es juckt in den Fingern hier fertigen Code einzustellen, doch das wird Dir auf dauer garnicht helfen.
Am besten du schaust dir mal die Grundlagen an, wie zum Beispiel auf diesen Seiten

Bei Fragen, fragen :)

lun87 16. Dez 2006 00:11

Re: Anfänger sucht Hilfe bei ersten Programierschritten
 
DAs ist ja cool, dass hier wirklich versucht wird mir zu helfen. Meist sagen dann die Leute also bitte das schaffste doch alleine oder so... aber das ist gut kleine tipps und der rest muss von selbst kommen. Thanks an alle auch wenn ich immer noch net weiss, wie ich ihm sage, wie er mehrere Versuche bekommt xD sry...-.- ist halb 2 nachts *ausrede* ^^


Delphi-Quellcode:
type
  TVersuchsZahl = array [0..4] of integer;
  TForm1 = class(TForm)
    ratebutton: TButton;
    ausgabeedt: TPanel;
    eingabeedt: TEdit;
    eingabezahlen: TPanel;
    Label1: TLabel;
    procedure ratebuttonClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  versuchszaehler : TVersuchsZahl;

implementation

{$R *.dfm}

procedure TForm1.ratebuttonClick(Sender: TObject);
var i, ratezahl, randomzahl, versuchszaehler : integer;

begin
  If (ratezahl = randomzahl) or (versuchszaehler = 4) then
    ratezahl[versuchszaehler] := ratezahl;
    inc(versuchszaehler);
    for versuchszaehler := 0 to 4 do ausgabeedt.Caption(inttostr(ratezahl[versuchszaehler]));
end;

procedure TForm1.FormCreate(Sender: TObject);
var i, ratezahl, versuchszaehler, randomzahl : integer;
begin
  ratezahl := eingabeedt.text;
  versuchszaehler := 0;
  Randomize;
  randomzahl := random(20)+1;
end;

end.


mein letzter Versuch bringt nichts mehr heute^^ Nacht Leute... Irgendwie verstehe ich da wat net... -.-


mfg
Lun87

Martin K 16. Dez 2006 00:33

Re: Anfänger sucht Hilfe bei ersten Programierschritten
 
Das was Maja geschreiben hat hab ich alles mehr oder weniger auch schon oben geschrieben.

Mein Tipp:
Les Dir morgen nochmal diesen kompletten Thread von ganz oben durch und versuche Deine Fehler / meine Vorschläge nachzuvollziehen.

Und begehe nicht den Fehler, dass Du versuchst, alles mit einer Schleife auf einmal machen zu wollen.
-> Bei jedem Rate-Versuch wird der Button erneut geklickt, also musst Du in der Prozedur zum ButtonClick praktisch einen Schleifendurchlauf simulieren.
Geh alle Schritte dann genau durch und gucke was passiert, entweder mit Blatt Papier oder zur Kontrolle dann mit F7.


Nebenbei noch:
Gewöhn Dir mal eine vernünftige Codeeinrückung an, dann wird vieles auch dentlicher, weil es übersichtlicher ist.

Mach Dir klar dass zu jedem end auch vorher ein begin gehört (okay, es gibt ein paar Ausnahmen - aber denen wirst Du erstmal nicht begegnen).

Mal ein Beispiel für sinvolle Einrückung:
Delphi-Quellcode:
procedure TForm1.ratebuttonClick(Sender: TObject);
var
  i: integer;
  ...
begin
  if (RateZahl = Zufallszahl) OR (Versuchzähler = 4) then
    for i := 0 to 4 do
      ShowMessage( IntToStr(Array[i]) );
end;
Somit wird deutlich zu welchem begin ein end gehört und was genau alles zu der IF-Abfrage bzw. zur FOR-Schleife gehört.
Du kannst Dir auch noch begin und end drum herum machen.
BEACHTE: Wenn einer Schleife / if-Abfrage eine Anweisung folgt, wird kein begin/end benötigt.
Wenn jedoch mehrere Anweisungen folgen, musst Du begin/end drum herum machen.
Die for-Schleife und die ShowMessage zählen in diesem Fall zu einer Anweisung, die zu der if-Abfrage gehört.
Das kannst Du Dir auch an der Anzahl der Semikolons ; verdeutlichen.

Wenn es für Dich übersichtlicher ist, kannst Du aber auch sowas schreiben - ist aber dasselbe wie der obige Code:
Delphi-Quellcode:
procedure TForm1.ratebuttonClick(Sender: TObject);
var
  i: integer;
  ...
begin
  if (RateZahl = Zufallszahl) OR (Versuchzähler = 4) then
  begin
    for i := 0 to 4 do
      ShowMessage( IntToStr(Array[i]) );
  end;
end;
Zu Majas Link:
Sorry, aber hier ist es imho nicht gut dargestellt, da das begin immer am Zeilenende steht. Darunter leidet m.E. die Übersichtlichkeit.
Gewöhn Dir besser an, dass begin und das entsprechende end dazu immer in gleicher Höhe stehen:
Delphi-Quellcode:
for i := 1 to 10 do
begin
  Anweisung1;
  Anweisung2;
  Anweisung3;
end;
BTW: ein repeat/until Block benötigt kein begin/end, da das repeat begin ersetzt und until ersetzt end.
Delphi-Quellcode:
repeat
  Anweisung1;
  Anweisung2;
  usw;
until x = y;

xZise 16. Dez 2006 10:05

Re: Anfänger sucht Hilfe bei ersten Programierschritten
 
Also ich versuchs auchnochmal ;)

Was musst du beim Starten der Anwendung machen:
  • Eine Zufallszahl erstellen
    ---
    Die Belegunbg der Edits ist unnötig ;) Das kannst du (in der VCL, womit du wahrscheinlich arbeitest) über den O(bject)I(nspector) machen (Zur "Desgintime", also während du das programmierst... Das gegenstück wäre zur "Laufzeit"... Also während das Programm läuft)

Was muss jetzt das "Spiel" machen:
  • Bei jeden Buttonklick auf korrektheit des Wertes überprüfen
  • Die Versuchsnummer um eins erhöhen
  • Ausgabe, ob korrekt oder nicht
  • Eingabeedit am besten leeren

Und das war alles...
Wenn wir uns das jetzt angucken, haben wir keine Schleifen...

Zu dem Code-Style:
- Einrücken ;)
- keine Leerzeilen zwischen "procedure"/"function" und dem "begin"
- Wenn nur eine Anweisung folgt, dann kann man das "begin"/"end" lassen
- Alles zwischen "begin" und "end" auf gleicher Höhe, oder weiter eingerückt (je nach fall), aber nie auf gleicher Höhe mit begin/end
- (meine meinung:)Alles was fettgedurckt und blau ist, gehört klein ;)

lun87 16. Dez 2006 10:22

Re: Anfänger sucht Hilfe bei ersten Programierschritten
 
Wieso die Edit brauche ich doch, damit der User seine Zahl eintragen kann?!?!?! Dasalles verstehe ich ja aber was ich nicht verstehe ist, nachdem ich eine Zahl eingetragen habe und er gesagt hat(der computer) die stimmt nicht mit randomzahl überein, soll der User eine NEUE Chance bekommen, folglich hat er die Möglichkeit WIEDER eine Zahl einzugeben. Das genau 5x... D.h.

randomzahl sei 5

User gibt 4 ein
4 <> 5 somit --> neuer versuch für user // Zahl 4 wird in einem array gespeichert

User gibt 3 ein // nun ist zahl 4 in Zahl[i] wobei i = Feld 0 ist und Zahl 3 in Zahl[i] wobei i jetzt i+1 ist also Feld 1
selbige wie oben

User gibt 5 ein
randomzahl nun = ratezahl ---> nun soll er alle Zahlen ausgeben die der User benutzt hat und die die richtige Lösung (jeweils in einem panel), also folglich ---> 4, 3, 5 vom User in einem Panel und 5 vom Computer(randomzahl) in einem Panel

Und genau dieses schaffe ich nicht... Jedes mal wenn ich ungleich einer zahl bin weiss ich nicht wie ich dem computer sage, speicher die zahl und lass ihn nochmal raten... dachte vll mit application.restart oder so +save erste zahl xD

Aber vll verstehe ich auch nicht was ihr mir klar machen wollt.

Naja ich danke euch jeden Fall setze mich mal weiter ran. Üben Üben Üben

Mfg
lun87

xZise 16. Dez 2006 10:36

Re: Anfänger sucht Hilfe bei ersten Programierschritten
 
Ok:
Einen neuen Versuch machst du so:
Wenn auf den "Rate" Butzton geklickt wurde, dann überprüfst du die Zahl auf korrekt heit.
Wenn sie nicht korrekt ist, dann füg sie in das Array ein (die Stelle weißt du durch die Versuchnummer... z.B. wenn das der 1. Verushc ist, dann musst du das 1. Item im array nehmen). Und dann machst du "edit.text := ''", damit der Text daraus weg ist.

Ansonsten musst du da nicht soviel zurücksetzen....

Setz mal den Code hier rein, und sach wos hackt :P

lun87 16. Dez 2006 11:43

Re: Anfänger sucht Hilfe bei ersten Programierschritten
 
So siehts momentan aus:

Delphi-Quellcode:
unit Uzahlenraten;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TVersuchsZahl = array [0..4] of integer;
  TForm1 = class(TForm)
    ratebutton: TButton;
    ausgabeedt: TPanel;
    eingabeedt: TEdit;
    eingabezahlen: TPanel;
    Label1: TLabel;
    procedure ratebuttonClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Zahl : TVersuchsZahl;

implementation

{$R *.dfm}


procedure TForm1.ratebuttonClick(Sender: TObject);
var i, ratezahl, randomzahl, versuchszaehler : integer;

begin
randomzahl := random(20)+1;
ratezahl := strtoint(eingabeedt.text);
  If (ratezahl = randomzahl) or (versuchszaehler = 4) then
    begin
    Zahl[i] := ratezahl;               -----> Wie mache ich hier einen neustart, so dass der User mehrere Ratemöglichkeiten hat
    inc(i);
    end;
    for i := 0 to 4 do
    ShowMessage( IntToStr(Zahl[i]) );    ----> Hier soll er alle Zahlen die geraten worden sind ausgegben werden.
end;

procedure TForm1.FormCreate(Sender: TObject);
var i, ratezahl, versuchszaehler, randomzahl : integer;
begin
  i := 0;
  Randomize;
end;

end.

mfg
lun87

xZise 16. Dez 2006 12:03

Re: Anfänger sucht Hilfe bei ersten Programierschritten
 
Es bringt hier nichts so viele lokle Variablen zu erstellen, weil sobald der Code von "RateButtonClick" fertig ist, sind die daten im Nirvana.

Also wir machen das so:
Wir haben 2 Buttons, ein Edit, ein Panel!

Die Buttons haben folgende Funktionen:
rb - RateButton - Überprüft, ob richtig geraten (Standardmäßig deaktiviert)
ngb - NewGameButton - Erstellt eine neue Zufallszahl

das Edit:
re - RateEdit - Darin wird die geratene Zahl eingegeben (Standardmäßig deaktiviert)

das panel:
ep - EreignisPanel - Darin wird das ergbnis ("Korrekt"/"Falsch") und die Bisher geratenen Zahlen ausgegeben!

Das zur GUI.
Dann die Variablen:
Erstelle 2 globale Variablen:
grz - geratene Zahlen - Das ist ein array wo die geratenen Zahlen drinn stehen
vnr - Versuchnummer - Das ist eine Zahl, in der die akt. Chance gepsichert ist
zerz - Zuerratene Zahl - Darin speicherst du die Zuffalszahl

Dann mache folgendes:
Wenn die Form erstellt wird:
Führe "Randomize" aus.

Jetzt muss der Benutzer auf ngb klicken:
- Setze die Anzahl der bisherigen Versuche auf 0
- aktivier rb und re
- Leere das array und re
- erstelle eine Zahl zwischen X und Y und speichere sie in zerz

Und jetzt kann der Benutzer raten indem er sein ergebnis in re eingibt und auf rb klickt:
- Überprüfe ob die Zahl richtig ist
- füge in das array die Zahl aus re ein
- Leere re
- Schreibe in ep, ob das ergebnis richtig war, und was er schon geraten hatte

So... Ansich ist das eigentlich "Pseudocode", also nicht mehr sehr schwer... Und ich verstehe nicht, was du ständig mit "Application.New/Restart" willst. Du musst nichts neustarten... Du musst nur die Änderungen rückgänigmachen (also z.B. das Edit leeren...)
Und mit Leeren meine ich, den Inhalt leeren, und nicht die Komponente "wegschmeißen"! (z.B. re.text := '')

An sich dürften 2 forschleifen vorkommen... Und informiere dich vorher, wie for-schleifen funktionieren! (Hilfe z.B.)

PS: Dein Code ist ansich schon richtig, nur eben nicht komplett richtig umgesetzt.

PPS: Ich werde dir nicht sagen, wie man in einem Array etwas schreibst, weil es mindestens schoneinmal hier gesagt wurde!

lun87 16. Dez 2006 13:41

Re: Anfänger sucht Hilfe bei ersten Programierschritten
 
Ich will doch gar keine neue Zufallszahl xD ICh will eine einzige Zufallszahl und der Anwender soll 5 Versuche haben diese ZUfallszahl herauszufinden... DAnach sollen alle seine Versuchszahlen ausgegeben werden und die gesucht Zahl auch :)
DAher ein button, 2 panels und ne edit xD oder funzt das allet net? oO

Ich werd mal die Zufallszahl global als Variable speichern bzw in ein Array packen, so dass sie über die 5 VErsuche erhalten bleibt und nicht im Nirvana landet^^


Mfg
Lun87

lun87 17. Dez 2006 14:13

Re: Anfänger sucht Hilfe bei ersten Programierschritten
 
Nabend :) Hab ein wenig an meinem Prog gefummelt. Er compiliert schon mal, aber das mit dem array klappt net und das er die einzelnen Zahlen speichert funktioniert glaube ich auch nicht. Naja werde weiter probieren und schauen, vll hat jemand noch ne idee. Ansonsten schönen Advent noch :)

Delphi-Quellcode:
unit Uzahlenraten;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TVersuchsZahl = array [0..4] of integer;
  TForm1 = class(TForm)
    ratebutton: TButton;
    ausgabeedt: TPanel;
    eingabeedt: TEdit;
    eingabezahlen: TPanel;
    Label1: TLabel;
    procedure ratebuttonClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  VersuchsZahl : TVersuchsZahl;

implementation

{$R *.dfm}

procedure TForm1.ratebuttonClick(Sender: TObject);
var i, ratezahl, randomzahl, versuchszaehler : integer;
begin
randomzahl := random(1)+1;
ratezahl := strtoint(eingabeedt.text);
  If (ratezahl = randomzahl) or (versuchszaehler = 4) then
    begin
      VersuchsZahl[i] := ratezahl;
      inc(i);
    for i := 0 to 4 do
      eingabezahlen.Caption := IntToStr(VersuchsZahl[i]);
      ausgabeedt.Caption := IntToStr(randomzahl);
    end
    else
      showmessage ('Neuer Versuch bitte!');
      eingabeedt.text := '';
end;

procedure TForm1.FormCreate(Sender: TObject);
var i, ratezahl, versuchszaehler, randomzahl : integer;
begin
  i := 0;
  Randomize;
end;

end.
mfg
Lun87

Klaus01 17. Dez 2006 14:33

Re: Anfänger sucht Hilfe bei ersten Programierschritten
 
Delphi-Quellcode:
type
  TVersuchsZahl = array [0..4] of integer;
  TForm1 = class(TForm)
    ratebutton: TButton;
    ausgabeedt: TPanel;
    eingabeedt: TEdit;
    eingabezahlen: TPanel;
    Label1: TLabel;
    procedure ratebuttonClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    versuchszaehler: Integer;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  VersuchsZahl : TVersuchsZahl;

implementation

{$R *.dfm}

procedure TForm1.ratebuttonClick(Sender: TObject);
var i, ratezahl, randomzahl, : integer;                 // Versuchzaehler als private Variable deklariert
begin
randomzahl := random(1)+1;                               // hier vielleicht mal den Bereich erhöhen random(1)
                                                          // bringt nicht allzuviele unterschiedliche Werte
ratezahl := strtoint(eingabeedt.text);
inc(versuchszaehler);                               // Du solltest dann versuchszaehler mit 0 
                                                     // initialisieren
VersuchsZahl[i] := ratezahl;

  If (ratezahl = randomzahl) or (versuchszaehler = 4) then
    begin
      for i := 0 to 4 do
        begin
          eingabezahlen.Caption := IntToStr(VersuchsZahl[i]);
          ausgabeedt.Caption := IntToStr(randomzahl);
        end
    else
      showmessage ('Neuer Versuch bitte!');
      eingabeedt.text := '';

end;

Grüße
Klaus

xZise 18. Dez 2006 15:45

Re: Anfänger sucht Hilfe bei ersten Programierschritten
 
Also lun...

Es gibt bei deinen Programm das Problem, dass wenn du immer auf den "Ratebutton" klickst eine neue Zuffalsszahl erstellst. Und die dann überprüfst.

Außerdem ist es nicht sinnvoll
Delphi-Quellcode:
for i := x to y do
  TLabel.Caption := text
zu schreiben, weil der benutzer wird nur das Enderegbnis sehen.

Mach stattdessen das so:
Delphi-Quellcode:
eingabezahlen.Caption := IntToStr(VersuchsZahl[1]) + ' ' + IntToStr(VersuchsZahl[2]) + ' ' + IntToStr(VersuchsZahl[3]) + ' ' + IntToStr(VersuchsZahl[4])
Ürbigends: Deklariere GLOBALE Variablen!
I wird imer dann gelöscht, wenn die Prozedur beendet wird. Und das wird nicht erst nach 4x Raten sein!

Auch musst du die Anzahl der Versuche um eins erhöhen, wenn man einen neuen Versuch bekommt.
Außerdem fehlt ganz zum Schluss ein begin/end, oder vielleicht nicht?!

Außerdem: Rücke den Code besser ein, damit man noch die Zusammenhänge erkennt.

Ich wills mal erklären:

Wenn ich sowas lese
Delphi-Quellcode:
    begin
      VersuchsZahl[i] := ratezahl;
      inc(i);
    for i := 0 to 4 do
      eingabezahlen.Caption := IntToStr(VersuchsZahl[i]);
      ausgabeedt.Caption := IntToStr(randomzahl);
    end
, dann denke ich folgendermaßen nach:
Delphi-Quellcode:
VersuchsZahl[i] := ratezahl;
inc(i);
for i := 0 to 4 do begin
  eingabezahlen.Caption := IntToStr(VersuchsZahl[i]);
  ausgabeedt.Caption := IntToStr(randomzahl);
end;
Und TADA: auf einmal wird der letzte befehl 4x ausgeführt (obwohls ja net so ist).
Deshalb ist es wichtig, den Code so zu formatieren, dass es nicht 1000 Ausnahmen der Ausnahmen gibt, sondern ganz klar sagt: "eine Ebene = ein Tab"


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:14 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-2025 by Thomas Breitkreuz