Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Funktion für Galgenraten will nicht Funktionieren :( (https://www.delphipraxis.net/36536-funktion-fuer-galgenraten-will-nicht-funktionieren.html)

fabiO 21. Dez 2004 13:31


Funktion für Galgenraten will nicht Funktionieren :(
 
Hi,

Ich hab seit diesem Jahr Informatik in der Schule, wo wir gerade Delphi behandeln, und hab ne Hausaufgabe aufbekommen mit der ich nich ganz klar komme :(

Ich soll ein Spiel programmieren, Galgenraten...

Mein Problem liegt darin, das ich gerne ein Funktion schreiben würde, die prüft, ob der Buchstabe bestandteil des zu erratenen Wortes ist... Bisher hab ich das hier zusammengebracht, komme aber nicht weiter, weil er immer wieder Fehler ausgibt, und ich keine ahnung hab, wie ich diese behebe... :cry:

Delphi-Quellcode:
unit Unit1;

interface

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

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

var
  Form1  : TForm1;
  Wort  : String = 'penispumpe';
  Wort1  : String = '**********';
  versuche, fehler : Integer;

implementation

{$R *.dfm}

Function buchstabe : Boolean;
var a   : Char;
    Wort : String;
    i   : Integer;

begin
  buchstabe := false;
  For i := 1 to length(Wort) do
    if Wort[i] = a
    then buchstabe := true;
end;



procedure TForm1.FormActivate(Sender: TObject);
begin
  Label1.Caption := Wort1;
  versuche := 0;
  fehler := 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
var a : Char;
begin
  versuche := versuche+1; // immer wenn der User auf den Button klickt, wird ein Versuch dazu addiert!
  a := Lowercase(Edit1.Text)[1]; // Alle Buchstaben in kleinbuchstaben umwandeln
  if buchstabe(a) = true then   // ist der buchstabe bestandteil des wortes, wird er anstelle des sterns angezeigt !
    begin
      Wort1[i] := a;
      versuche := versuche+1;
    end;

  if buchstabe(a) = false then // ist der buchstabe kein bestandteil des wortes, wird der stern angezeigt und ein fehler hinzuaddiert !
    begin
      Showmessage ('Sorry, der Buchstabe kommt nicht vor!');
      fehler := fehler+1;
    end;

  Label1.Caption := Wort1;
  Label4.Caption := IntToStr(versuche);
  Label5.Caption := IntToStr(fehler);
end;

end.
Hoffe ma ich habs irgendwie verständlich rübergebracht was ich machen will, pls help me :hi:

Gruss fabiO

Steve 21. Dez 2004 13:39

Re: Funktion für Galgenraten will nicht Funktionieren :(
 
Hi,

Schau Dir doch mal die Funtkion Delphi-Referenz durchsuchenPos an.

Außerdem deklarierst Du Deine Variablen innerhalb der Funktion, statt sie als Parameter zu übergeben:
Delphi-Quellcode:
Function CheckBuchstabe(CONST aBuchstabe : Char; CONST aString : String) : Boolean;
Was aber wiederum inhaltlich genau POS entsprechen würde -g-

PS: Pos unterscheidet Groß-/Kleinschreibung!

Gruß
Stephan :dance: :xmas:

sakura 21. Dez 2004 13:40

Re: Funktion für Galgenraten will nicht Funktionieren :(
 
Zitat:

Zitat von fabiO
komme aber nicht weiter, weil er immer wieder Fehler ausgibt, und ich keine ahnung hab, wie ich diese behebe...

Nenne uns doch mal die Fehler, welche Du erhälst :)

...:cat:...

Pr0g 21. Dez 2004 13:45

Re: Funktion für Galgenraten will nicht Funktionieren :(
 
Ein paar Verbesserungen für deinen Code, falls du zu einem Punkt fragen hast, dann kann man dir bestimmt auch ein Beispiel geben:
  • Pack die globalen Variablen in den "private"-Bereich der Form und fülle sie im onCreate mit Werten.
  • Statt "Variable := Variable + 1;" zum erhöhen, nimm besser immer "Inc(Variable)". Das gleiche gilt für Minus, dort würdest du "Dec" nehmen.
  • Du willst deiner Funktion "buchstabe" zwar im Code den Buchstaben in der Variable "a" als Parameter übergeben, hast aber in der Funktion selber keine Parameter angegeben.
  • Die Funktion "buchstabe" könntest du vereinfachen:
    Delphi-Quellcode:
    Function buchstabe(const AChar: Char) : Boolean;
    begin
      Result := (Pos(AChar, Wort[i]) > 0);
    end;
  • Was ist Wort[i]? Du hast zwar zwei Variablen "wort" und "wort1", aber du müsstest ein Array anlegen, um dort per Index auf ein Element zugreifen zu können.
  • Du hast nirgendwo die Variable "i" deklariert, welche du aber für den Zugriff auf "Wort[i]" nutzen wolltest.
  • Du brauchst eine Booleanvariable nicht auf "True" oder "False" zu prüfen, hier ein Beispiel:
    Delphi-Quellcode:
    //statt
    if Variable = True then
    //schreibe
    if Variable then

    //statt
    if Variable = False then
    //schreibe
    if not Variable then
  • Du willst wohl mit "a := Lowercase(Edit1.Text)[1];" das erste Zeichen aus dem Edit auslesen. Dazu müsstest du den Text aber erst in einem String speichern, denn erst dann kannst du per Index auf ein Zeichen zugreifen.
  • Nim statt OnActive der Form OnCreate.

MfG Pr0g

Edit: hab wohl ein bisschen lange mit dem Schreiben gebraucht ;)

fabiO 21. Dez 2004 13:52

Re: Funktion für Galgenraten will nicht Funktionieren :(
 
Ok, hab mir das mit Pos Funktion durchgelesen

Mit der kann man also in einem string nach einem Teilstring suchen und sich dann die stelle ausgeben lassen, wo der Teilstring im String vorkommt, und wenn er nicht vorkommt gibt er 0 aus.. richtig ? :)

Hab das was du gepostet hast mal eingefügt, und mein code sieht nun so aus:

Delphi-Quellcode:
Function CheckBuchstabe(CONST aBuchstabe : Char; CONST aString : String) : Boolean;
var i : Integer;
begin
  CheckBuchstabe := false;
  For i := 1 to length(aString) do
    if aString[i] = aBuchstabe
    then CheckBuchstabe := true;
end;



procedure TForm1.FormActivate(Sender: TObject);
begin
  Label1.Caption := aString1;
  versuche := 0;
  fehler := 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
var a : Char;
    i : Integer;
begin
  versuche := versuche+1;
  a := Lowercase(Edit1.Text)[1];
  if CheckBuchstabe(a) = true then
    begin
      aString1[i] := a;
      versuche := versuche+1;
    end;

  if CheckBuchstabe(a) = false then
    begin
      Showmessage ('Sorry, der Buchstabe kommt nicht vor!');
      fehler := fehler+1;
    end;

  Label4.Caption := IntToStr(versuche);
  Label5.Caption := IntToStr(fehler);
  Label1.Caption := aString1;
end;
den fehler den er mir ausgibt is nach wie folgt der hier:

Code:
[Fehler] Unit1.pas(60): Nicht genügend wirkliche Parameter
Was mir delphi damit sagen will versteh ich nich so recht weshalb ich auch nicht weiß, wie ich es lösen soll...

Sorry wenn ich bissl schwer bin, bin aber noch totaler anfänger :(

Gruss fabiO

Steve 21. Dez 2004 13:52

Re: Funktion für Galgenraten will nicht Funktionieren :(
 
Hi,

nur noch ein paar Kommentare zum Code:
  • Deine Funktion "buchstabe" kann nix sinnvolles zurückgeben (nicht initialisierte lokale Variablen, s.o.)
  • Jedesmal, wenn das Fenster aktiviert wird, werden die Werte (Versuche, Fehler, Label1.Caption) zurückgesetzt. Um das zu vermeiden kannste den FormActivate-Code ins OnCreate Deines Forms packen.
  • Innerhalb von Button1Click möchtest Du der Funktion "Buchstabe" einen Parameter übergeben, obwohl "Buchstabe" keine Parameter hat/erwartet (s.o.)
  • Du möchtest in Button1Click auf Wort1[i] zugreifen, obwohl hier kein i deklariert ist geschweige denn einen Wert hätte.
  • Du zählst "versuche" doppelt hoch.
  • Statt if buchstabe(a) .. doppelt aufzurufen, kannst Du auch einfach den else-Teil der Bedingung nutzen.
  • Um alle Fundstellen eines Buchstaben innerhalb eines Strings zu finden, ist auch PosEx hilfreich (ab D6 glaub ich)

Gruß
Stephan :dance: :xmas:

edit: laaaaaahm bin :D

Der Fehler "Nicht genügend Parameter" kommt wohl daher, dass Du "Bachstabe(a)" aufrufst, also einen Parameter übergibst, wo 2 erwartet werden. Lies Dir am bestem mal die Hinweise von Pr0g und mir durch, um ein bissl mehr Verständnis für den Code zu entwickeln ;9

Gruß
Stephan :dance: :xmas:

PS: Jupp, du hast Pos vollkommen richtig verstenden :zwinker:

Pr0g 21. Dez 2004 13:55

Re: Funktion für Galgenraten will nicht Funktionieren :(
 
Warum machst du es nicht so:
Delphi-Quellcode:
Function CheckBuchstabe(CONST aBuchstabe : Char; CONST aString : String) : Boolean;
begin
  Result := (Pos(aBuchstabe, aString) > 0);
end;
Edit: Eine Klammer vergessen.

fabiO 21. Dez 2004 14:06

Re: Funktion für Galgenraten will nicht Funktionieren :(
 
Jo ok so langsam blick ich durch...

Das mit dem Wort[i] war aus meiner alten For Schleife

Delphi-Quellcode:
For i := 1 to length(Wort) do
          if Wort[i] = a
            then Wort1[i] =: a;
Aber irgendwie gehört das ja jetzt gar net mehr rein, aber wie kann ich delphi dann sagen, das ich genau diesen buchstaben austauschen möchte ?

Hab den Code nach deinen Hinweisen ausgebessert, also Inc(Zahl) etc gemacht und die variablen ins private getan, aber es geht trotzdem nicht :(

Ich weiss ich bin ein hoffnungsloser fall, aber ich steig da nich so richtig durch, wie ich nun die funktion mit meiner prozedur verbinden kann ?

Delphi-Quellcode:
Function CheckBuchstabe(CONST aBuchstabe : Char; CONST aString : String) : Boolean;
begin
  Result := (Pos(aBuchstabe, aString) > 0);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  aString  := 'penispumpe';
  aString1  := '**********';
  versuche := 0;
  fehler   := 0;
  Label1.Caption := aString1;
end;

procedure TForm1.Button1Click(Sender: TObject);
var aBuchstabe : Char;
    i : Integer;
begin
  Inc(versuche);
  aBuchstabe := Lowercase(Edit1.Text)[1];
  if CheckBuchstabe(aBuchstabe) then
    begin
      aString1[i] := aBuchstabe;
      Inc(versuche);
    end
  else begin
        Showmessage ('Sorry, der Buchstabe kommt nicht vor!');
        Inc(fehler);
       end;

  Label4.Caption := IntToStr(versuche);
  Label5.Caption := IntToStr(fehler);
  Label1.Caption := aString1;
end;

Ultimator 21. Dez 2004 14:10

Re: Funktion für Galgenraten will nicht Funktionieren :(
 
Zitat:

aber es geht trotzdem nicht
Und wie immer die obligatorische Frage:
[Obligator]
Was geht nicht? ;-)
[/Obligator]

:mrgreen:

Bekomst du eine Fehlermeldung (wenn ja: Was steht drin?), ne Zugriffsverletzung, passiert was falsches, passiert überhaupt irgendwas, etc. pp.?

fabiO 21. Dez 2004 14:16

Re: Funktion für Galgenraten will nicht Funktionieren :(
 
Jo es kommt ne fehlermeldung, die vorher auch kam:

Code:
[Fehler] Unit1.pas(60): Nicht genügend wirkliche Parameter
:(


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:04 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz