Entwickler-Ecke

Sonstiges (Delphi) - Projekt Hangman


Quality* - Mi 23.06.10 08:42
Titel: Projekt Hangman
In der Schule sollen wir uns Delphi mehr oder weniger selber beibringen und das anhand eines Hangmanspiels.

Nun habe ich das Spiel soweit eingeteilt und verzweifel nun am Programmieren.

Soweit hab ich das Spiel bis jetzt:


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:
unit pHangman;

interface

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

type
  TTHangman = class(TForm)
    LbRatewort: TLabel;
    EdBitteEingeben: TEdit;
    LbBuchstabe: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure FormKeyPress(Suchwort: String; Sender: TObject; var Key: Char);
  private
         Buchstabe:string;
  {suchwort, ratewort : string;}
         function Ratewort_Erzeugen(Suchwort : String) : string;
         procedure Ratewort_Zeigen(Ratewort : String);
         function Wort_Durchsuchen(Suchwort:String; zaehler:integer; Buchstabe:String) : Boolean;
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  THangman: TTHangman;

implementation

{$R *.DFM}

procedure TTHangman.FormCreate(Sender: TObject);

    var Zaehler : Integer;
    var Ratewort : String [30];
    var Suchwort : String [30];
    var Buchstabe : String;

    begin

     Suchwort := 'Dienstag';

              For Zaehler := 1 to length(Suchwort) do

                  begin
                       Buchstabe := '';
                       Suchwort[Zaehler] := upcase (Suchwort[Zaehler]);
                       Ratewort := Ratewort_Erzeugen(Suchwort); //Leerwort nur mit Unterstrichen
                       Ratewort_Zeigen(Ratewort); // Anzeige in einem Label
                       Wort_Durchsuchen(suchwort,zaehler, Buchstabe); //Durchsuchen ob gedrückter Buchstabe im Wort ist

                  end;

end;

function TTHangman.Ratewort_Erzeugen(Suchwort : String):String;
             var Zaehler : integer;
             var Leerwort : string;

             begin
                  Leerwort := '';
                  for Zaehler := 1 To length(Suchwort) do
                      begin
                           leerwort := Concat(Leerwort,'_ ');
                      end;
                          Ratewort_Erzeugen := Leerwort;
             end;


procedure TTHangman.Ratewort_Zeigen(Ratewort:String);

             begin
                  LbRatewort.caption := Ratewort;
             end;



procedure TThangman.FormKeyPress(Suchwort : String; Sender: TObject; var Key: Char);
          var Zaehler : Integer;
          var Buchstabe : char;
begin
     buchstabe := key;
     buchstabe := upcase(Buchstabe);
     for zaehler := 1 To length(Suchwort) do
         begin
              if wort_durchsuchen(suchwort, zaehler, Buchstabe) = true then //True -> Einsetzen des Buchstabens in das Ratewort
                   begin
                          ?
                   end
                   else .. //Fehlversuche(Label) +1
         end;
end;

function TThangman.wort_durchsuchen(Suchwort:String; zaehler:integer; buchstabe:String):boolean;
         begin
              If suchwort[zaehler] = buchstabe then
                 begin
                      wort_durchsuchen := true
                 end
                 else
                      wort_durchsuchen := false;
                 end;
end.


Um den Durchgang kurz zu schildern.

Das zu suchende Wort ist deklariert "Dienstag".
Erzeugung von einem Unterstrich für jeden Buchstaben von Dienstag.
Ausgabe der Unterstriche in einem Label.
Spieler drückt einen Buchstaben.
Wort wird auf den Buchstaben hin durchsucht.
Wenn der Buchstabe vorhanden ist, soll der Buchstabe in das Ratewort (Anfangs _ _ _ _ _ _ _ _ ) eingesetzt werden -> (D _ _ N _ _ _ G)
Wenn der Buchstabe nicht vorhanden ist, sollen die Fehlversuche in einem Label hochgezählt werden.


Danke für eure Hilfe
Quality*


HotCoffee - Sa 31.07.10 02:36

Hey, also ich habe mir hier mal grade ein paar Proceduren überlegt mit denen es recht leicht klappen könnte.
Die Begriffe werden aus einer einfachen Textdatei Zeilenweise geladen, diese befindet sich im Programmordner. Die Variablen gelten für das ganze Formular und nicht nur für eine einzelne Procedur.
Dazu kommt dann natürlich noch so ne Procedure Aktualisiere oder so, mit der du alle Labels auf ihre entsprechenden Werte setzt, dann kannst du die einzelnen Buchstaben als Button anzeigen lassen oder so und dann bei OnButtonClick den Buchstaben prüfen, Aktualisueren und wenn gelöst ist den nächsten Begriff laden.


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:
procedure FormCreate(Sender: TObject);
begin
  Begriffe  :=  TStringList.Create;
  IF fileexists('Begriffe.txt'THEN Begriffe.LoadFromFile('Begriffe.txt');
  IF Begriffe.count>0 THEN ladeBegriff;
end;

procedure ladeBegriff;
VAR i : integer;
begin
  randomize;
  Loesung:=Begriffe[random(Begriffe.Count-1)];
  for i:=1 TO length(Loesung) DO Anzeige:=Anzeige+'_';
  FehlVersuche:=0;
end;

procedure pruefeBuchstabe (pBuchstabe : Char);
VAR i : integer;
begin
  IF pos(pBuchstabe,AnsiUpperCase(Loesung))<>0
  THEN For i:=1 To length(Loesung) DO IF upcase(Loesung[i])=pBuchstabe THEN Anzeige[i]:=Loesung[i] ELSE
  ELSE FehlVersuche:=FehlVersuche+1;
end;                                              

function  geloest : Boolean;
begin
  result:=Loesung=Anzeige;
end;


Jakob_Ullmann - Sa 31.07.10 13:55

Kompiliert denn das Programm überhaupt?


FinnO - Sa 31.07.10 14:14

Hey,

schau' dir doch mal die Funktionen


Delphi-Quelltext
1:
2:
Pos;   //findet einen SubString in einem String und liefert dessen Position
PosEx;  //wie Pos nur mit Offset

an.

Für das Laden der Begriffe empfehle ich eine Stringlist:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var
  sl : TStringList;
begin
  sl := TStringList.Create;
  try
    sl.LoadFromFile(extractFilePath(ParamStr(0))+'Textdatei.txt');
    showmessage(sl[1]);  
  finally
    sl.free;
  end;  
end;


LG


Delete - Sa 31.07.10 14:33

user profile iconHotCoffee hat folgendes geschrieben Zum zitierten Posting springen:
Die Begriffe werden aus einer einfachen Textdatei Zeilenweise geladen, diese befindet sich im Programmordner.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure FormCreate(Sender: TObject);
begin
  Begriffe  :=  TStringList.Create;
  IF fileexists('Begriffe.txt'THEN Begriffe.LoadFromFile('Begriffe.txt');
  IF Begriffe.count>0 THEN ladeBegriff;
end;

Das ist aber sehr optimistisch gedacht ohne Pfadangabe.


HotCoffee - Sa 31.07.10 14:39

user profile iconLuckie hat folgendes geschrieben Zum zitierten Posting springen:

Das ist aber sehr optimistisch gedacht ohne Pfadangabe.

Nja das hängt ja dann an demjenigen der es in sein Programm packt, wo er die Datei hinlegt. Er kann sie schließlich auch mit in die Exe packen.


Delete - Sa 31.07.10 14:47

Ich habe mich auf deinen Code bezogen, dass das Programm die Datei im Programmordner findet ohne Pfadangabe, ist sehr optimistisch programmiert.