Autor Beitrag
Leon_derZocker
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Do 15.03.18 10:34 
Hallo,
Ich bin dabei ein einfaches Zahlen-Raten-Spiel zu programmieren.
Ich bin damit eigentlich auch fertig aber es stört mich das ich ständig auf OK klicken muss um eine von mir geratene Zahl zu bestätigen.
Daher wollte ich es so programmieren das ich die Zahl mit der ENTER-Taste bestätigen kann.
Ich bin ein Neuling im Bereich programmieren.
Kann mir bitte jemand helfen(ein Tipp wäre auch OK)?
Danke schon mal im Voraus. :zustimm:

Hier der Quellcode:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
unit Raten3;

interface

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

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Edit1: TEdit;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Enter(Sender: TObject; var Key: Char);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

const Max = 15 ;  // Ein Dutzend ist genug
var
  Form1: TForm1;
  Eingabe, Zufall, Versuche: Integer;
  SpielEnde: Boolean;

implementation

{$R *.DFM}

Ab hier________________________________________________

procedure TForm1.Button1Click(Sender: TObject);
var
Ergebnis, Differenz: Integer;
begin
  if SpielEnde
    then Close;
  try
    Edit1.SetFocus;
    Eingabe := StrToInt (Edit1.Text);
    inc (Versuche);
    Ergebnis := Eingabe - Zufall;
    // Versuche mitzählen und bei Max warnen
    if Versuche <= Max
      then Label2.Caption := IntToStr (Versuche) + '. Versuch:'
      else Label2.Caption := 'Es reicht!';
    // Eingabe auswerten ob zu klein oder zu groß  oder Richtig
    if Eingabe = Zufall
      then Label1.Caption := 'Richtig geraten!';

    if Eingabe < Zufall
      then
      begin
      Label1.Caption := 'Deine Zahl ist zu klein!';
    if Abs(Eingabe - Zufall) < 3
      then Label1.Caption := 'Deine Zahl ist zu klein! Nah dran!';
    end;

    if Eingabe > Zufall
      then
      begin
      Label1.Caption := 'Deine Zahl ist zu groß!';
      if Abs(Eingabe - Zufall) < 3
        then Label1.Caption := 'Deine Zahl ist zu groß! Nah dran!';
    end;

    // Wenn richtig geraten oder zu viele Versuche
    if (Eingabe = Zufall) or (Versuche > Max)
      then
      begin
      Button1.Caption := 'Ende';
      SpielEnde := true;
      end;
    except
      Label1.Caption := 'Quatsch!';
  end;
end;

Bis hier_______________________________________

procedure TForm1.Button2Click(Sender: TObject);
begin
  Edit1.SetFocus;
  // Wenn neues Spiel, Startwerte/Zufallszahl neu
  Label1.Caption := 'Ich denke mir eine neue Zahl!';
  Label2.Caption := 'Rate mal!';
  Button1.Caption := 'OK';
  Zufall := random(100) + 1;
  Versuche := 1;
  SpielEnde := false;
end;

procedure TForm1.Enter(Sender: TObject; var Key: Char);
begin

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  randomize;
  Zufall := random(100) + 1;
  Versuche := 1;
  SpielEnde := false;
end;

end.


Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Do 15.03.2018 um 15:03
Symbroson
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 381
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: Do 15.03.18 13:35 
Du könntest zB dem Edit ein OnKeyDown Event hinzufügen in dem du prüfst, ob die gedrückte Taste [Enter] war - und dann dein Button1Click aufrufen.

ausblenden Delphi-Quelltext
1:
2:
3:
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin if key = 13 then Button1Click(Sender);
end;


13 ist sozusagen der KeyCode von Zeilenumbrüchen.
Windows nutzt für Zeilenumbrüche als Escape-Sequenz \r\n, bzw die Zeichencodes 13 und 10 hintereinander.

LG

_________________
most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)

Für diesen Beitrag haben gedankt: Leon_derZocker
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6323
Erhaltene Danke: 127

Windows 7 + Windows 10
Tokyo Prof + CE
BeitragVerfasst: Do 15.03.18 13:52 
Im Objektinspektor des Buttons die Eigenschaft "Default" auf True setzen, sollte eigentlich schon reichen.

Für diesen Beitrag haben gedankt: Leon_derZocker
Symbroson
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 381
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: Do 15.03.18 13:57 
Stimmt, das geht auch
bei mehreren Edits mit unterschiedlichen callbacks wird es dann aber problematisch. Dann lieber gleich richtig

_________________
most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)

Für diesen Beitrag haben gedankt: Leon_derZocker
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6323
Erhaltene Danke: 127

Windows 7 + Windows 10
Tokyo Prof + CE
BeitragVerfasst: Do 15.03.18 14:24 
Mehrere Edits, die unterschiedlich auf ein <Enter> reagieren? Kann man machen, aber ... einheitliche Benutzersteuerung hätte da bei mir Priorität. :wink:

Ich denke aber, dass diese Überlegungen für den TE an dieser Stelle zu weit gehen. Daher sollten wir vielleicht in diesem Thread nicht weiter darauf eingehen.