Entwickler-Ecke
Sonstiges (Delphi) - "Setzte Dame"-Spiel
Taddel93 - Mo 15.02.10 19:30
Titel: "Setzte Dame"-Spiel
Guten Abend zusammen,
ich habe folgendes Problem:
Wir sollen für die Schule ein Programm in Delphi erstellen, welches auf einem Schachbrett Damen setzt. Diese Damen dürfen nur einmal in horizontaler und einmal in vertikaler Richtung vorkommen (dass Damen auch quer schlagen können, sollen wir zuerst einmal nicht beachten).
Ich sitze jetzt schon etwas an dem Programm komme aber nicht weiter, weil dauernd Fehlermeldungen erscheinen, die ich nicht mehr verstehe.
Kann mal wer über das Programm schauen und mir meine Fehler korrigieren?
Das wäre klasse...
Wenn noch irgendwelche Informationen gebraucht werden, dann lasst es mich schnellstmöglich wissen
Vielen Dank schonmal im Vorraus :P
Hier der Programmcode:
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:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TBrett = array[1..8,1..8] of boolean; TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; Label1: TLabel; Edit1: TEdit; procedure SetzeDame; procedure Button1Click(Sender: TObject); function erlaubt(x,y:integer):boolean; private
public
end;
var Form1: TForm1;
implementation
{$R *.dfm}
function erlaubt(x,y:integer;Brett:TBrett) : boolean; var zeile,spalte:integer; begin erlaubt:=true; for spalte:=1 to 8 do if Brett[x,spalte]=true then erlaubt:= true else erlaubt:=false; for zeile:=1 to 8 do if Brett[zeile,x]=true then erlaubt:=true else erlaubt:= false; end;
procedure TForm1.SetzeDame(Brett:TBrett); var x,y:integer; begin for x:=1 to 8 do for y:=1 to 8 do if erlaubt(x,y,Brett)=true then Brett(x,y):= true; end;
procedure TForm1.Button1Click(Sender: TObject); var Reihe,Spalte,anzahl : integer; Ausgabe : string; begin for Reihe:=1 to 8 do begin Ausgabe:=''; for Spalte:=1 to 8 do if Brett[Spalte,Reihe]=true then Ausgabe:= Ausgabe + ' + ' else Ausgabe:= Ausgabe + ' - '; Memo1.Lines.Add(Ausgabe); inc(anzahl); Edit1.Text := 'Anzahl der Damen:' + IntToStr(Anzahl); end; end;
end. |
Moderiert von
Christian S.: Delphi-Tags hinzugefügt
BenBE - Mo 15.02.10 19:36
Siehe N-Damen-Problem ...
Taddel93 - Mo 15.02.10 19:42
Danke, aber das bringt mich kein Stückchen weiter, weil dort ja auch keine Lösung genannt wird.
Hast du oder irgendwer andere eine Idee?
:)
Xentar - Mo 15.02.10 19:42
Taddel93 hat folgendes geschrieben : |
Wenn noch irgendwelche Informationen gebraucht werden, dann lasst es mich schnellstmöglich wissen |
Wie wärs mit der eigentlichen Fehlermeldung?
Taddel93 - Mo 15.02.10 19:46
Ach jaa könnte nicht Schaden :D
Das sind die Fehlermeldungen, die dort erscheinen:
[Hint] Unit1.pas(38 ): Value assigned to 'erlaubt' never used
[Hint] Unit1.pas(39): Value assigned to 'erlaubt' never used
[Hint] Unit1.pas(36): Value assigned to 'erlaubt' never used
[Error] Unit1.pas(46): Declaration of 'SetzeDame' differs from previous declaration
[Error] Unit1.pas(51): Undeclared identifier: 'Brett'
[Error] Unit1.pas(64): Undeclared identifier: 'Brett'
[Error] Unit1.pas(18 ): Unsatisfied forward or external declaration: 'TForm1.erlaubt'
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
platzwart - Mo 15.02.10 19:59
Delphi-Quelltext
1:
| [Error] Unit1.pas(46): Declaration of 'SetzeDame' differs from previous declaration |
Schau mal die Deklaration und die Implementierung von SetzeDame an. Einmal mit Parameter und einmal ohne...
Delphi-Quelltext
1: 2:
| [Error] Unit1.pas(51): Undeclared identifier: 'Brett' [Error] Unit1.pas(64): Undeclared identifier: 'Brett' |
Brett hast du in den entsprechenden Prozeduren nicht deklariert...
Taddel93 - Mo 15.02.10 20:07
Dann zeigt er mir folgende Fehlermeldungen an:
[Hint] Unit1.pas(38): Value assigned to 'erlaubt' never used
[Hint] Unit1.pas(39): Value assigned to 'erlaubt' never used
[Hint] Unit1.pas(36): Value assigned to 'erlaubt' never used
[Error] Unit1.pas(52): Missing operator or semicolon
[Error] Unit1.pas(52): Incompatible types: 'TBrett' and 'Boolean'
[Error] Unit1.pas(64): Undeclared identifier: 'Brett'
[Error] Unit1.pas(18): Unsatisfied forward or external declaration: 'TForm1.erlaubt'
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
SvenAbeln - Mo 15.02.10 20:17
Zeile 33:
Delphi-Quelltext
1:
| function TForm1.erlaubt(x,y:integer;Brett:TBrett) : boolean; |
Zeile 52:
Taddel93 - Mo 15.02.10 20:23
Vielen Dank für eure Hilfen.
Das mit dem TForm1 habe ich gerade gelöscht. Ist ja auch eigentlich klar.
Und die eckigen Klammern habe ich auch abgeändert.
Nun sagt Delphi mir aber, dass in Zeile 51 nicht genügend Parameter sind.
Hier die weiteren Fehlermeldungen:
[Error] Unit1.pas(51): Not enough actual parameters
[Error] Unit1.pas(60): Undeclared identifier: 'Zeile'
[Error] Unit1.pas(64): Undeclared identifier: 'Brett'
[Error] Unit1.pas(18): Unsatisfied forward or external declaration: 'TForm1.erlaubt'
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
Danke für eure Mühe und Geduld
SvenAbeln - Mo 15.02.10 20:39
Du hast hier noch einen Unterschied:
Delphi-Quelltext
1: 2: 3: 4: 5:
| TForm1 = class(TForm) function erlaubt(x,y:integer):boolean;
[...] function TForm1.erlaubt(x,y:integer;Brett:TBrett) : boolean; |
Taddel93 - Mo 15.02.10 20:48
Okay danke..
Hab ich oben im Kopf noch ergänzt.
Aber trotzdem fehlen ihm gewisse Parameter..
MaPsTaR - Mo 15.02.10 20:54
Könntest du noch mal den aktuellen kompletten Code schicken, hab irgendwie den Überblick verloren, was jetzt noch fehlerhaft sein könnte.
Ich hab das mal mit Brett als private-Feld von Form1 probiert, da funktioniert alles. Weiß aber nicht genau, ob ich was geändert habe, was hier noch nicht angesprochen wurde.
Taddel93 - Mo 15.02.10 20:59
Ja klar kein Problem.
Das ist jetzt der Code, den ich jetzt in meinem Delphi-Programm habe:
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:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TBrett = array[1..8,1..8] of boolean; TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; Label1: TLabel; Edit1: TEdit; procedure SetzeDame(Brett:TBrett); procedure Button1Click(Sender: TObject); function erlaubt(x,y:integer;Brett:TBrett):boolean; private
public
end;
var Form1: TForm1;
implementation
{$R *.dfm}
function erlaubt(x,y:integer;Brett:TBrett) : boolean; var zeile,spalte:integer; begin erlaubt:=true; for spalte:=1 to 8 do if Brett[x,spalte]=true then erlaubt:= true else erlaubt:=false; for zeile:=1 to 8 do if Brett[zeile,x]=true then erlaubt:=true else erlaubt:= false; end;
procedure TForm1.SetzeDame(Brett:TBrett); var x,y:integer; begin for x:=1 to 8 do for y:=1 to 8 do if erlaubt[x,y,Brett]=true then Brett[x,y]:= true; end;
procedure TForm1.Button1Click(Sender: TObject); var Reihe,Spalte,anzahl : integer; Ausgabe : string; begin for Zeile:=1 to 8 do begin Ausgabe:=''; for Spalte:=1 to 8 do if Brett[Zeile,Reihe]=true then Ausgabe:= Ausgabe + ' + ' else Ausgabe:= Ausgabe + ' - '; Memo1.Lines.Add(Ausgabe); inc(anzahl); Edit1.Text := 'Anzahl der Damen:' + IntToStr(Anzahl); end; end;
end. |
Moderiert von
Narses: Code- durch Delphi-Tags ersetzt
Xentar - Mo 15.02.10 21:03
Einen Prozeduraufruf macht man mit runden Klammern.
MaPsTaR - Mo 15.02.10 21:10
1. Hier muss, soweit ich weiß, TForm1. davor:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| function TForm1.erlaubt(x,y:integer;Brett:TBrett) : boolean; var zeile,spalte:integer; begin erlaubt:=true; for spalte:=1 to 8 do if Brett[x,spalte]=true then erlaubt:= true else erlaubt:=false; for zeile:=1 to 8 do if Brett[zeile,x]=true then erlaubt:=true else erlaubt:= false; end; |
2. Hier greifst du nicht auf ein Array sondern auf eine Funktion zu -> Klammern
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| procedure TForm1.SetzeDame(Brett:TBrett); var x,y:integer; begin for x:=1 to 8 do for y:=1 to 8 do if erlaubt(x,y,Brett)=true then Brett[x,y]:= true; end; |
3. Deine Variable heißt Spalte und nicht Zeile
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure TForm1.Button1Click(Sender: TObject); var Reihe,Spalte,anzahl : integer; Ausgabe : string; begin for Reihe:=1 to 8 do begin Ausgabe:=''; for Spalte:=1 to 8 do if Brett[Reihe,Spalte]=true then Ausgabe:= Ausgabe + ' + ' else Ausgabe:= Ausgabe + ' - '; Memo1.Lines.Add(Ausgabe); inc(anzahl); Edit1.Text := 'Anzahl der Damen:' + IntToStr(Anzahl); end; end; |
4. In Button1Click gibt es keine Variable Brett.
Ich würde Brett als Private-Feld von Form1 benutzen und dafür die Übergabe der Variable in deinen Funktionen/Prozeduren weglassen.
Delphi-Quelltext
1: 2:
| private Brett: TBrett; |
So sollte es klappen.
Übrigens solltest du SetzeDame; auch irgendwo aufrufen, oder?
Taddel93 - Mo 15.02.10 21:28
@Mapstar: Erstmal vielen Dank für die Fehlersuche.
Ich habe die Fehler korrigiert und jetzt meckert der Compiler zumindestens nicht.
Das Programm funktioniert soweit, nur dass jetzt im dem Edit-Feld nur - gesetzt werden, obwohl, wenn das Feld nicht belegt ist ein + dahinkommen müsste. Kannst du mir dabei auch noch weiterhelfen?
//Das hängt wahrscheinlich mit dem Setzte Dame zusammen, wo muss ich das einfügen?
MaPsTaR - Mo 15.02.10 21:51
Konnte deinen Code in erlaubt() ehrlich gesagt nicht nachvollziehen. Hab ihn mal umgeschrieben.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| function TForm1.erlaubt(x,y:integer) : boolean; var zeile,spalte:integer; begin result := true; for spalte := 1 to 8 do if Brett[x, Spalte] then begin result := false; break; end; if result then for zeile := 1 to 8 do if Brett[zeile, y] then begin result := false; break; end; end; |
SetzeDame würde ich in Button1Click, vor der Berechnung und Ausgabe aufrufen.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure TForm1.Button1Click(Sender: TObject); var Reihe,Spalte,anzahl : integer; Ausgabe : string; begin SetzeDame; Anzahl := 0; Memo1.Clear; for Reihe:=1 to 8 do [...] end;
procedure TForm1.SetzeDame; var x,y:integer; begin Reset; for x:=1 to 8 do for y:=1 to 8 do Brett[x,y] := erlaubt(x,y); end; |
Reset habe ich geschrieben, damit das Array wieder komplett auf false gesetzt wird.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.Reset; var x,y: integer; begin for x := 1 to 8 do for y := 1 to 8 do Brett[x,y] := false; end; |
Taddel93 - Mo 15.02.10 22:37
Vielen, vielen Dank.. das Programm läuft jetzt einigermaßen.
Noch ein kleiner Fehler tritt auf. Wenn ich die Button1-Procedure aufrufe erscheint im Memo1 folgendes:
+ - - - - - - -
- -
- + - - - - -
- + - - - -
- - -
- - - + - -
- - - - - + -
- - - - - +
Irgendwo muss noch ein Fehler liegen, der das Brett nicht vervollständigt.
Und nochmals vielen, vielen lieben Danke :P
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!