unit Unit1;
interface
uses
Winapi.Windows,
Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs,
Vcl.Buttons;
type
TForm1 =
class(TForm)
SpeedButton1: TSpeedButton;
SpeedButton2: TSpeedButton;
SpeedButton4: TSpeedButton;
SpeedButton5: TSpeedButton;
SpeedButton3: TSpeedButton;
SpeedButton6: TSpeedButton;
SpeedButton7: TSpeedButton;
SpeedButton8: TSpeedButton;
SpeedButton9: TSpeedButton;
SpeedButton10: TSpeedButton;
procedure SpeedButton1Click(Sender: TObject);
procedure SpeedButton10Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private-Deklarationen }
Spielfeld:
array[0..2, 0..2]
of Byte;
Spieler, Starter, Gewinner: Byte;
function ErmittelGewinner() : Byte;
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
// FELD 1 bis Feld 9
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
X, Y: Byte;
Index: Byte;
begin
// Ist der Sender überhaupt ein Speedbutton?
If not (Sender
is TSpeedButton)
then Exit;
// Ist das Spiel schon vorbei?
If Gewinner <> 0
then
begin
ShowMessage( '
Das Spiel ist bereits vorbei. Bitte starte ein neues Spiel.' );
Exit;
end;
// Welcher Button wurde gedrückt?
X := 90;
Y := 90;
for Index := 0
to Self.ControlCount - 1
do
begin
If Sender = Self.Controls[
Index ]
then
begin
X :=
Index mod 3;
Y :=
Index div 3;
end;
end;
// Wurde der Button gefunden?
if ( X > 2 )
or ( Y > 2 )
then exit;
// Ist das gewünschte Feld noch frei?
If Spielfeld[ X, Y ] <> 0
then
begin
ShowMessage( '
Das Feld ist schon besetzt. Bitte wähle ein anderes aus.' );
Exit;
end;
// Zug optisch ausführen
case Spieler
of
1: TSpeedButton( Sender ).Caption := '
X';
2: TSpeedButton( Sender ).Caption := '
O';
else
begin
ShowMessage( '
Unerwarteter Fehler!' );
Exit;
end;
end;
// Zug intern ausführen
Spielfeld[ X, Y ] := Spieler;
// Spieler wechseln
Spieler := Spieler
mod 2 + 1;
// Sieger ermitteln
Gewinner := ErmittelGewinner();
// Entsprechend des Siegers eine Meldung ausgeben
case Gewinner
of
0: Exit;
1,2: ShowMessage( Format( '
Spieler %d hat gewonnen.', [ Gewinner ] ) );
3: ShowMessage( '
Das Spiel endet unentschieden.' );
end;
end;
// NEUES SPIEL
procedure TForm1.SpeedButton10Click(Sender: TObject);
var
X, Y: Byte;
begin
// Spiel intern und optisch löschen
for X := 0
to 2
do
begin
for Y := 0
to 2
do
begin
Spielfeld[ X, Y ] := 0;
TSpeedButton( Self.Controls[Y * 3 + X ] ).Caption := '
';
end;
end;
// Entscheiden, wer die nächste Runde beginnen darf
case Gewinner
of
1,2: Starter := Gewinner
mod 2 + 1;
// Der Verlierer startet
0,3: Starter := Starter
mod 2 + 1;
// Spieler 2 aus der vorherigen Runde ist nun Spieler 1
end;
// Vorbereitungen abschließen
Spieler := Starter;
Gewinner := 0;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Spieler := 1;
Starter := 1;
end;
function TForm1.ErmittelGewinner() : Byte;
var
X, Y: Byte;
begin
// Gewinner ermitteln
// Gibt es einen Gewinner auf der Y-Achse?
for X := 0
to 2
do
begin
Result := Spielfeld[ X, 0 ];
if ( Result <> Spielfeld[ X, 1 ] )
or ( Result <> Spielfeld[ X, 2 ] )
then Result := 0;
If Result <> 0
then Exit;
end;
// Gibt es einen Gewinner auf der X-Achse?
for Y := 0
to 2
do
begin
Result := Spielfeld[ 0, Y ];
if ( Result <> Spielfeld[ 1, Y ] )
or ( Result <> Spielfeld[ 2, Y ] )
then Result := 0;
If Result <> 0
then Exit;
end;
// Gibt es diagonal einen Gewinner? (Von Links-Oben nach Rechts-Unten)
for Y := 0
to 2
do
begin
Result := Spielfeld[ 0, 0 ];
if ( Result <> Spielfeld[ 1, 1 ] )
or ( Result <> Spielfeld[ 2, 2 ] )
then Result := 0;
If Result <> 0
then Exit;
end;
// Gibt es diagonal einen Gewinner? (Von Rechts-Oben nach Links-Unten)
for Y := 0
to 2
do
begin
Result := Spielfeld[ 2, 0 ];
if ( Result <> Spielfeld[ 1, 1 ] )
or ( Result <> Spielfeld[ 0, 2 ] )
then Result := 0;
If Result <> 0
then Exit;
end;
// Gibt es noch ein freies Feld? (Das Spiel geht dann noch weiter)
Result := 0;
for X := 0
to 2
do
begin
for Y := 0
to 2
do
begin
if Spielfeld[ X, Y ] = 0
then Exit;
end;
end;
// Es gab bisher keinen Gewinner. Freie Felder gibt es auch nicht mehr.
// Das Spiel endet also unentschieden.
Result := 3;
end;
end.