mobius
2005-05-14, 21:25:31
Hallo könnte vielleicht mal jemand gucken, ob er verstehen kann was der Fehler ist? Irgendwie blick ich grad net durch. Hab die Fehlerzeilen mal Fett markiert. Danke für die Mühe.
Skelet_L.pas
unit Skelett_L;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, ExtCtrls;
type
TForm1 = class(TForm)
M1: TMemo;
P1: TPanel;
P2: TPanel;
procedure FormCreate(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
uses USpiel_L, UDialog1;
VAR AnfangsSituation, EndSituation : tSituation;
// *****************************************************************************
// Spielbeschreibung (nennt auf Wunsch die Spielregeln)
// *****************************************************************************
PROCEDURE Spielbeschreibung;
var i : Integer;
BEGIN
if Application.MessageBox('Spielbeschreibung anzeigen?',
'Nim mit 1 Haufen', MB_OKCANCEL + MB_DEFBUTTON1) = IDOK then
begin
Form1.Caption := spielname; {in USpiel_L deklariert}
Form1.M1.Lines.LoadFromFile('Spielbeschreibung.txt');
if Application.MessageBox('Mit dem Spiel beginnen?',
'Nim mit 1 Haufen', MB_OKCANCEL + MB_DEFBUTTON1) = IDOK then
for i := 0 to 14 do Form1.M1.Lines[i] := ''; //Zeilen mit Index niedriger als Txt werden nicht angezeigt
end;
END;
// *****************************************************************************
// Vorbereitungen (setzt generelle Anfangsbedingungen)
// *****************************************************************************
PROCEDURE Vorbereitungen;
PROCEDURE Namenseingabe; {Eingabe der Spielernamen}
BEGIN
spname[erster] := InputBox('Eingabe',
'Name des ersten Spielers?', '');
Form1.P1.Caption := Form1.P1.Caption + spname[erster];
spname[zweiter] := InputBox('Eingabe',
'Name des zweiten Spielers?', '');
Form1.P2.Caption := Form1.P2.Caption + spname[zweiter];
spname[keiner] := 'Keiner';
END;
BEGIN
Namenseingabe;
randomize;
Voreinstellungen {in USpiel_L deklariert}
END;
// *****************************************************************************
// Startangaben (legt Startposition und anziehenden Spieler fest)
// *****************************************************************************
PROCEDURE Startangaben (VAR situation: tSituation);
VAR antwort : char;
hilf : String;
BEGIN
WITH situation DO
BEGIN
Anfang(pos); {in USpiel_L deklariert}
hilf := InputBox('Eingabe',
'Wer fängt an: ' + spname[erster] +
' oder ' + spname[zweiter] + '? (1/2) ', '');
antwort := hilf[1];
CASE antwort OF
'1' : am_Zug := erster;
'2' : am_Zug := zweiter
END
END
END;
// *****************************************************************************
// Partie (das eigentliche Spielgeschehen)
// *****************************************************************************
PROCEDURE Partie (start: tSituation; VAR ziel: tSituation);
VAR situation, neuSituation : tSituation;
PROCEDURE Uebergang (alt: tSituation; VAR neu: tSituation);
VAR zug : tZug;
PROCEDURE spieler_zieht (sit: tSituation; VAR zug: tZug); {der Zug}
VAR korrekt : boolean; {des Spielers}
BEGIN {wird eingelesen}
REPEAT {und geprüft}
Eingabe(zug, sit); {in USpiel_L deklariert}
korrekt := zulaessig(zug, sit); {in USpiel_L deklariert}
IF NOT korrekt
THEN MessageDlg('Der Zug ist nicht zulässig!',
mtWarning, [mbOK], 0);
UNTIL korrekt
END;
BEGIN {Übergang}
spieler_zieht(alt, zug);
ausgefuehrt(pos, alt, z, neu) //Zeile 117
END;
BEGIN {Partie}
situation := start;
REPEAT
Ausgabe(pos); //Zeile 123
Uebergang(situation, neuSituation);
situation := neuSituation
UNTIL Ende(pos); //Zeile 126
ziel := situation
END;
// *****************************************************************************
// Endinformation (informiert über den Ausgang der Partie)
// *****************************************************************************
PROCEDURE Endinformation (sit: tSituation);
BEGIN
Ausgabe(pos); //Zeile 136
MessageDlg(spname[sit.am_Zug] + ' hat gewonnen.', mtInformation, [mbOK], 0)
END;
// *****************************************************************************
// Schluss (prüft, ob die Spieler genug haben)
// *****************************************************************************
FUNCTION Schluss: boolean;
VAR antwort : char;
hilf : String;
BEGIN
repeat
hilf := InputBox('Eingabe', 'Noch eine Partie? (j/n)', '');
until hilf > '';
antwort := hilf[1];
Schluss := antwort IN ['n', 'N']
END;
// *****************************************************************************
// Spielende (der Computer empfiehlt sich)
// *****************************************************************************
PROCEDURE Spielende;
BEGIN
MessageDlg('Ende des Spiels ' + spielname + '.', mtInformation, [mbOK],0);
END;
// *****************************************************************************
// Hauptprogramm
// *****************************************************************************
procedure TForm1.FormCreate(Sender: TObject);
begin
Show;
Spielbeschreibung;
Vorbereitungen;
REPEAT
Startangaben(AnfangsSituation);
Partie(AnfangsSituation, EndSituation);
Endinformation(EndSituation)
UNTIL Schluss;
Spielende;
end;
end.
Fehlerprotokoll:
[Fehler] Skelett_L.pas(117): '(' erwartet, aber ',' gefunden
[Fehler] Skelett_L.pas(117): Anweisung erforderlich, aber Ausdruck vom Typ 'tSituation' gefunden
[Fehler] Skelett_L.pas(123): '(' erwartet, aber ')' gefunden
[Fehler] Skelett_L.pas(126): '(' erwartet, aber ')' gefunden
[Fehler] Skelett_L.pas(136): '(' erwartet, aber ')' gefunden
[Fataler Fehler] Rahmen_L.dpr(7): Verwendete Unit 'Skelett_L.pas' kann nicht compiliert werden
UNIT USpiel_L;
INTERFACE
USES
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, ExtCtrls;
CONST
spielname = 'Die Wandernden Steine';
TYPE
tSteinindex = 1..4;
tFeldindex = Integer;
tPosition = Array[tSteinindex] of tFeldindex;
tSpieler = (erster, zweiter, keiner);
tSituation = record
pos : tPosition;
am_Zug : tSpieler;
end;
tZug = Record
stein : tSteinindex;
zielfeld : tFeldindex;
end;
VAR
spname : array[tSpieler] of String;
//maxSteinanzahl := Integer;
PROCEDURE Voreinstellungen;
PROCEDURE Anfang (VAR pos: tPosition);
PROCEDURE Ausgabe (position: tPosition);
PROCEDURE Eingabe (VAR zug: tZug; sit: tSituation);
FUNCTION zulaessig (zug: tZug; sit: tSituation): boolean;
PROCEDURE ausgefuehrt (pos : tPosition; alt: tSituation; z: tZug; VAR neu: tSituation);
FUNCTION Ende (VAR pos: tPosition): boolean;
implementation
uses Skelett_L, UDialog1;
CONST
gegner : ARRAY[tSpieler] OF tSpieler = (zweiter, erster, keiner);
PROCEDURE Voreinstellungen;
BEGIN
//maxSteinanzahl := StrToInt(InputBox('Eingabe', 'Maximale Steinanzahl: ', ''));
//maxSteinanzahl:=4;
END;
//!
PROCEDURE Anfang (VAR pos: tPosition); {legt Anfangsposition fest}
BEGIN
Randomize;
{ pos[1]:=1+Random(10);
pos[2]:=1+Random(10);
While pos[2]=pos[1] do Pos[2]:=1+Random(10);
pos[3]:=1+Random(10);
While (pos[3]=pos[1]) OR (pos[3]=pos[2]) do Pos[3]:=1+Random(10);
pos[4]:=1+Random(10);
While (pos[4]=pos[1]) OR (pos[4]=pos[2]) OR (pos[4]=pos[3]) do Pos[4]:=1+Random(10); }
pos[1]:=3; pos[2]:=4; pos[3]:=8; pos[4]:=11;
//Form1.M1.Lines[1] := '..OO...O..O....';
END;
//!
PROCEDURE Ausgabe;
BEGIN
Form1.M1.Lines[1] := 'Der 1. Stein befindet sich auf Position '+IntToStr(position[1])+'.';
Form1.M1.Lines[2] := 'Der 2. Stein befindet sich auf Position '+IntToStr(position[2])+'.';
Form1.M1.Lines[3] := 'Der 3. Stein befindet sich auf Position '+IntToStr(position[3])+'.';
Form1.M1.Lines[4] := 'Der 4. Stein befindet sich auf Position '+IntToStr(position[4])+'.';
END;
//!
PROCEDURE Eingabe (VAR zug: tZug; sit: tSituation);
CONST
frage = 'Welcher Stein soll bewegt werden ';
VAR
antwort : char;
BEGIN
//lies_Zeichen(frage + spname[sit.am_Zug] + '?', antwort, ['1'..'4']);
//zug.stein := ord(antwort) - ord('0');
zug.stein := StrToInt(InputBox('Eingabe', 'Welcher Stein soll bewegt werden? ', ''));
zug.zielfeld := StrToInt(InputBox('Eingabe', 'Wo soll der Stein plaziert werden? ', ''));
END;
//!
FUNCTION zulaessig (zug: tZug; sit: tSituation): boolean;
var stein : tSteinindex;
BEGIN
zulaessig:=false;
IF zug.stein=1 Then
IF NOT ((0<zug.zielfeld) AND (zug.zielfeld<sit.pos[1])) THEN exit;
For stein:=2 to 4 do
If NOT ((sit.pos[stein-1]<zug.zielfeld) AND (zug.zielfeld<sit.pos[stein])) THEN exit;
zulaessig:=true;
END;
PROCEDURE ausgefuehrt (pos : tPosition; alt: tSituation; z: tZug; VAR neu: tSituation);
BEGIN
//neu.pos := alt.pos - z;
pos[z.stein]:=z.zielfeld;
neu.am_Zug := gegner[alt.am_Zug];
END;
//!
FUNCTION Ende (VAR pos: tPosition): boolean;
BEGIN
if (pos[1]=1) AND (pos[2]=2) AND (pos[3]=3) AND (pos[4]=4) THEN
begin
Result := true;
//situation.am_Zug := gegner[situation.am_Zug];
end
else Result := false;
END;
end.
Skelet_L.pas
unit Skelett_L;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, ExtCtrls;
type
TForm1 = class(TForm)
M1: TMemo;
P1: TPanel;
P2: TPanel;
procedure FormCreate(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
uses USpiel_L, UDialog1;
VAR AnfangsSituation, EndSituation : tSituation;
// *****************************************************************************
// Spielbeschreibung (nennt auf Wunsch die Spielregeln)
// *****************************************************************************
PROCEDURE Spielbeschreibung;
var i : Integer;
BEGIN
if Application.MessageBox('Spielbeschreibung anzeigen?',
'Nim mit 1 Haufen', MB_OKCANCEL + MB_DEFBUTTON1) = IDOK then
begin
Form1.Caption := spielname; {in USpiel_L deklariert}
Form1.M1.Lines.LoadFromFile('Spielbeschreibung.txt');
if Application.MessageBox('Mit dem Spiel beginnen?',
'Nim mit 1 Haufen', MB_OKCANCEL + MB_DEFBUTTON1) = IDOK then
for i := 0 to 14 do Form1.M1.Lines[i] := ''; //Zeilen mit Index niedriger als Txt werden nicht angezeigt
end;
END;
// *****************************************************************************
// Vorbereitungen (setzt generelle Anfangsbedingungen)
// *****************************************************************************
PROCEDURE Vorbereitungen;
PROCEDURE Namenseingabe; {Eingabe der Spielernamen}
BEGIN
spname[erster] := InputBox('Eingabe',
'Name des ersten Spielers?', '');
Form1.P1.Caption := Form1.P1.Caption + spname[erster];
spname[zweiter] := InputBox('Eingabe',
'Name des zweiten Spielers?', '');
Form1.P2.Caption := Form1.P2.Caption + spname[zweiter];
spname[keiner] := 'Keiner';
END;
BEGIN
Namenseingabe;
randomize;
Voreinstellungen {in USpiel_L deklariert}
END;
// *****************************************************************************
// Startangaben (legt Startposition und anziehenden Spieler fest)
// *****************************************************************************
PROCEDURE Startangaben (VAR situation: tSituation);
VAR antwort : char;
hilf : String;
BEGIN
WITH situation DO
BEGIN
Anfang(pos); {in USpiel_L deklariert}
hilf := InputBox('Eingabe',
'Wer fängt an: ' + spname[erster] +
' oder ' + spname[zweiter] + '? (1/2) ', '');
antwort := hilf[1];
CASE antwort OF
'1' : am_Zug := erster;
'2' : am_Zug := zweiter
END
END
END;
// *****************************************************************************
// Partie (das eigentliche Spielgeschehen)
// *****************************************************************************
PROCEDURE Partie (start: tSituation; VAR ziel: tSituation);
VAR situation, neuSituation : tSituation;
PROCEDURE Uebergang (alt: tSituation; VAR neu: tSituation);
VAR zug : tZug;
PROCEDURE spieler_zieht (sit: tSituation; VAR zug: tZug); {der Zug}
VAR korrekt : boolean; {des Spielers}
BEGIN {wird eingelesen}
REPEAT {und geprüft}
Eingabe(zug, sit); {in USpiel_L deklariert}
korrekt := zulaessig(zug, sit); {in USpiel_L deklariert}
IF NOT korrekt
THEN MessageDlg('Der Zug ist nicht zulässig!',
mtWarning, [mbOK], 0);
UNTIL korrekt
END;
BEGIN {Übergang}
spieler_zieht(alt, zug);
ausgefuehrt(pos, alt, z, neu) //Zeile 117
END;
BEGIN {Partie}
situation := start;
REPEAT
Ausgabe(pos); //Zeile 123
Uebergang(situation, neuSituation);
situation := neuSituation
UNTIL Ende(pos); //Zeile 126
ziel := situation
END;
// *****************************************************************************
// Endinformation (informiert über den Ausgang der Partie)
// *****************************************************************************
PROCEDURE Endinformation (sit: tSituation);
BEGIN
Ausgabe(pos); //Zeile 136
MessageDlg(spname[sit.am_Zug] + ' hat gewonnen.', mtInformation, [mbOK], 0)
END;
// *****************************************************************************
// Schluss (prüft, ob die Spieler genug haben)
// *****************************************************************************
FUNCTION Schluss: boolean;
VAR antwort : char;
hilf : String;
BEGIN
repeat
hilf := InputBox('Eingabe', 'Noch eine Partie? (j/n)', '');
until hilf > '';
antwort := hilf[1];
Schluss := antwort IN ['n', 'N']
END;
// *****************************************************************************
// Spielende (der Computer empfiehlt sich)
// *****************************************************************************
PROCEDURE Spielende;
BEGIN
MessageDlg('Ende des Spiels ' + spielname + '.', mtInformation, [mbOK],0);
END;
// *****************************************************************************
// Hauptprogramm
// *****************************************************************************
procedure TForm1.FormCreate(Sender: TObject);
begin
Show;
Spielbeschreibung;
Vorbereitungen;
REPEAT
Startangaben(AnfangsSituation);
Partie(AnfangsSituation, EndSituation);
Endinformation(EndSituation)
UNTIL Schluss;
Spielende;
end;
end.
Fehlerprotokoll:
[Fehler] Skelett_L.pas(117): '(' erwartet, aber ',' gefunden
[Fehler] Skelett_L.pas(117): Anweisung erforderlich, aber Ausdruck vom Typ 'tSituation' gefunden
[Fehler] Skelett_L.pas(123): '(' erwartet, aber ')' gefunden
[Fehler] Skelett_L.pas(126): '(' erwartet, aber ')' gefunden
[Fehler] Skelett_L.pas(136): '(' erwartet, aber ')' gefunden
[Fataler Fehler] Rahmen_L.dpr(7): Verwendete Unit 'Skelett_L.pas' kann nicht compiliert werden
UNIT USpiel_L;
INTERFACE
USES
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, ExtCtrls;
CONST
spielname = 'Die Wandernden Steine';
TYPE
tSteinindex = 1..4;
tFeldindex = Integer;
tPosition = Array[tSteinindex] of tFeldindex;
tSpieler = (erster, zweiter, keiner);
tSituation = record
pos : tPosition;
am_Zug : tSpieler;
end;
tZug = Record
stein : tSteinindex;
zielfeld : tFeldindex;
end;
VAR
spname : array[tSpieler] of String;
//maxSteinanzahl := Integer;
PROCEDURE Voreinstellungen;
PROCEDURE Anfang (VAR pos: tPosition);
PROCEDURE Ausgabe (position: tPosition);
PROCEDURE Eingabe (VAR zug: tZug; sit: tSituation);
FUNCTION zulaessig (zug: tZug; sit: tSituation): boolean;
PROCEDURE ausgefuehrt (pos : tPosition; alt: tSituation; z: tZug; VAR neu: tSituation);
FUNCTION Ende (VAR pos: tPosition): boolean;
implementation
uses Skelett_L, UDialog1;
CONST
gegner : ARRAY[tSpieler] OF tSpieler = (zweiter, erster, keiner);
PROCEDURE Voreinstellungen;
BEGIN
//maxSteinanzahl := StrToInt(InputBox('Eingabe', 'Maximale Steinanzahl: ', ''));
//maxSteinanzahl:=4;
END;
//!
PROCEDURE Anfang (VAR pos: tPosition); {legt Anfangsposition fest}
BEGIN
Randomize;
{ pos[1]:=1+Random(10);
pos[2]:=1+Random(10);
While pos[2]=pos[1] do Pos[2]:=1+Random(10);
pos[3]:=1+Random(10);
While (pos[3]=pos[1]) OR (pos[3]=pos[2]) do Pos[3]:=1+Random(10);
pos[4]:=1+Random(10);
While (pos[4]=pos[1]) OR (pos[4]=pos[2]) OR (pos[4]=pos[3]) do Pos[4]:=1+Random(10); }
pos[1]:=3; pos[2]:=4; pos[3]:=8; pos[4]:=11;
//Form1.M1.Lines[1] := '..OO...O..O....';
END;
//!
PROCEDURE Ausgabe;
BEGIN
Form1.M1.Lines[1] := 'Der 1. Stein befindet sich auf Position '+IntToStr(position[1])+'.';
Form1.M1.Lines[2] := 'Der 2. Stein befindet sich auf Position '+IntToStr(position[2])+'.';
Form1.M1.Lines[3] := 'Der 3. Stein befindet sich auf Position '+IntToStr(position[3])+'.';
Form1.M1.Lines[4] := 'Der 4. Stein befindet sich auf Position '+IntToStr(position[4])+'.';
END;
//!
PROCEDURE Eingabe (VAR zug: tZug; sit: tSituation);
CONST
frage = 'Welcher Stein soll bewegt werden ';
VAR
antwort : char;
BEGIN
//lies_Zeichen(frage + spname[sit.am_Zug] + '?', antwort, ['1'..'4']);
//zug.stein := ord(antwort) - ord('0');
zug.stein := StrToInt(InputBox('Eingabe', 'Welcher Stein soll bewegt werden? ', ''));
zug.zielfeld := StrToInt(InputBox('Eingabe', 'Wo soll der Stein plaziert werden? ', ''));
END;
//!
FUNCTION zulaessig (zug: tZug; sit: tSituation): boolean;
var stein : tSteinindex;
BEGIN
zulaessig:=false;
IF zug.stein=1 Then
IF NOT ((0<zug.zielfeld) AND (zug.zielfeld<sit.pos[1])) THEN exit;
For stein:=2 to 4 do
If NOT ((sit.pos[stein-1]<zug.zielfeld) AND (zug.zielfeld<sit.pos[stein])) THEN exit;
zulaessig:=true;
END;
PROCEDURE ausgefuehrt (pos : tPosition; alt: tSituation; z: tZug; VAR neu: tSituation);
BEGIN
//neu.pos := alt.pos - z;
pos[z.stein]:=z.zielfeld;
neu.am_Zug := gegner[alt.am_Zug];
END;
//!
FUNCTION Ende (VAR pos: tPosition): boolean;
BEGIN
if (pos[1]=1) AND (pos[2]=2) AND (pos[3]=3) AND (pos[4]=4) THEN
begin
Result := true;
//situation.am_Zug := gegner[situation.am_Zug];
end
else Result := false;
END;
end.