Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Hangman Problem (https://www.delphipraxis.net/133548-hangman-problem.html)

ChristianR 4. Mai 2009 14:42


Hangman Problem
 
Hallo,
ich bin grade dabei ein kleines Hangman Spiel zu programmieren...Leider komme ich im Moment kein Stückchen weiter und zwar beim Buchstaben vergleichen. Eigentlich kein Problem aber irgendwie stresst er noch rum.
das zu erratene Wort ist "Testwort" Ich Gebe über ein Edit Feld den Buchstaben ein. Klappt soweit auch bis ich das komplette wort erraten habe, nur wenn das wort erraten wurde, Steht das Wort da wohl schon aber dahinter immer noch 4 "_". Als ob das Wort nocht nicht vollständig ist.
Hoffe Ihr versteht wie ich das meine. Hier mal mein Code

Delphi-Quellcode:
unit THangMan;

interface

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

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

var
  Form1: TForm1;
  ratewort,buchstabe:STRING;
  i:integer;

  result:boolean;
implementation

{$R *.dfm}




procedure TForm1.Button1Click(Sender: TObject);
var hilfwort,ausgabe,z:String;
var k:integer;
begin
buchstabe := Edit1.Text;

hilfwort := label2.caption;
Label3.Caption := inttostr(length(hilfwort));
for i := 1 to length(hilfwort) do
  begin
    if ratewort[i] = buchstabe then
      begin
      hilfwort[i] := ratewort[i];
      Label2.Caption := hilfwort;
      end//Ende if buchstabe überprüfen
      else
        begin
          ShowMessage('Daneben');
        end;// ende else
  end;//Ende forschlife i
end;


//Spiel Start
procedure TForm1.Button2Click(Sender: TObject);
begin
ratewort := 'ja';
Label1.Caption := ratewort;

for i:= 1 to length (ratewort) do
    Label2.Caption:= Label2.caption + '_ ';

end;
//Ende Spielstart
end.
Wäre net schlecht wenn mir jemand helfen könnte! Danke!

Namenloser 4. Mai 2009 14:54

Re: Hangman Problem
 
Hallo ChristianR,

Willkommen in der DP :party:

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
begin
ratewort := 'ja';
Label1.Caption := ratewort;

for i:= 1 to length (ratewort) do
    Label2.Caption:= Label2.caption + '_ ';

end;
Du löschst hier aus Label2.Caption nicht die alten Zeichen, bevor du die neuen hinten anhängst.

Übrigens würde ich dir empfehlen, in deinem Code mal aufzuräumen:
1. Variablen und Komponenten aussagekräftige Namen geben (Label2 ist nicht aussagekräftig, besser wäre z.B. labelAnzeige)
2. Da sind einige Deklarationen, die gar nicht benutzt werden.
3. Mache deinen Code standardkonform: Deine Unit hat das Präfix T, das normalerweise für Klassendeklarationen benutzt wird (wie z.B. in TForm). Außerdem hast du eine globale Variable namens Result, die erstens anscheinend nicht genutzt wird und zweitens anders benannt werden sollte, da der Rückgabewert einer Funktion schon Result heißt.
4. Rücke deinen Code ordentlich ein

Wenn du diese Punkte beachtest, erleichterst du dir und auch anderen später die Fehlersuche.

Blup 4. Mai 2009 15:23

Re: Hangman Problem
 
Durch das Leerzeichen hinter dem Unterstrich wird dein "hilfswort" doppelt so lang wie das "ratewort".
Das könnte später in Button1Click zu einer Index- oder Schutzverletzung führen.
Delphi-Quellcode:
hilfswort := '';
for i := 1 to length (ratewort) do
  hilfswort := hilfswort + '_';
Label2.Caption := hilfswort;

Forlan 4. Mai 2009 15:28

Re: Hangman Problem
 
Auf dieser Seite solltest du außerdem noch ein paar Anregungen finden um das Spiel bzw. den Code etwas übersichtlicher zu machen

ChristianR 4. Mai 2009 16:40

Re: Hangman Problem
 
Zitat:

Zitat von Blup
Durch das Leerzeichen hinter dem Unterstrich wird dein "hilfswort" doppelt so lang wie das "ratewort".
Das könnte später in Button1Click zu einer Index- oder Schutzverletzung führen.

jup daran wirds wohl gelegen haben. Jetzt habe ich aber das problem das die ausgabe einfach eine durchgezogne linie ist (______) so kann aber schlecht erkennen wieviel Buchstaben das gesuchte Wort hat. Deswegen hatte ich ja das Leerzeichen drin. Wie bekomm ich das denn hin das es so aussieht (_ _ _ _)? Ich weiss nich ich steh voll auf dem Holzweg :gruebel:

DeddyH 4. Mai 2009 16:45

Re: Hangman Problem
 
Setz doch einfach die Leerzeichen wieder dazwischen und werte später nur die Zeichen mit einer ungeraden Position aus.

ChristianR 5. Mai 2009 14:13

Re: Hangman Problem
 
Zitat:

Zitat von DeddyH
Setz doch einfach die Leerzeichen wieder dazwischen und werte später nur die Zeichen mit einer ungeraden Position aus.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var hilfwort:String;
var k:integer;
begin
buchstabe := Edit1.Text;
hilfwort := label2.caption;
Label3.Caption := inttostr(length(hilfwort));
for k := 1 to length(hilfwort) do
begin
  if odd(k) then
  begin
    if ratewort[k] = buchstabe then
    begin
      hilfwort[k] := ratewort[k];
      Label2.Caption := hilfwort;
    end else
    begin
    ShowMessage('Daneben');
    end;
  end;
end;
end;
Ich habe das so probiert wie du es vorgeschlagen hast. Nur funktioniert es nicht ganz. Jetzt findet er nur noch den 1. buchstaben und das andere bleibt unbeachtet! Bin mit der Lösung bei mir völlig ab vom weg oder bin ich kurz davor, dass es funktionert?

DeddyH 5. Mai 2009 17:25

Re: Hangman Problem
 
Du vergleichst ein einzelnes Zeichen mit einem String (buchstabe). Ist das so beabsichtigt?

ChristianR 5. Mai 2009 18:11

Re: Hangman Problem
 
Wenn ich in dem Edit Feld nur 1 Buchstaben, z.B. "a" eingebe, dann ist der String doch von Länge 1 und dann dürfte das doch gar kein problem sein oder?


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:19 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