unit UMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TSpieler = (keiner, mensch, maschine, unentschieden);
TFeld = (nix, rot, blau);
TForm1 =
class(TForm)
Shape1: TShape;
Shape2: TShape;
Shape3: TShape;
Shape4: TShape;
Shape5: TShape;
Shape6: TShape;
Shape7: TShape;
Shape8: TShape;
Shape9: TShape;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure initgame;
procedure reinitgame;
function bewertung(spieler, gegner: TSpieler): integer;
procedure ki;
function gwinner: TSpieler;
procedure myMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
spieler: TSpieler;
runden: integer;
spielende: boolean;
felder:
array[1..9]
of TFeld;
implementation
{$R *.dfm}
function TForm1.bewertung(spieler, gegner: TSpieler): integer;
begin
result := 0;
if gwinner = spieler
then
result := 1;
if gwinner = gegner
then
result := -1;
end;
procedure TForm1.ki;
var
nextone: integer;
function minimax(Level, MaxLevel: Integer; Spieler, Gegner: TSpieler;
var aBestMove: integer): integer;
var
S, MaxS, i: Integer;
Dummy: integer;
begin
MaxS := - maxint;
for i := 1
To 9
Do
if felder[i] = nix
then
begin
case Spieler
of
mensch: felder[i] := rot;
maschine: felder[i] := blau;
end;
S := Bewertung(Spieler, Gegner);
if (S = 0)
and (Level < MaxLevel)
then
S := - minimax(Level + 1, MaxLevel, Gegner, Spieler, Dummy);
felder[i] := nix;
if S > MaxS
then
begin
MaxS := s;
aBestMove := i;
If s > 0
then
begin
Result := s;
exit;
end;
end;
end;
If MaxS = - maxint
then
begin
Result := Bewertung(Spieler, Gegner);
aBestMove := -1;
end else
Result := MaxS;
end;
begin
nextone := 5;
if not spielende
then
begin
if (runden = 1)
and (felder[5] = rot)
then
nextone := 1;
if runden > 1
then
minimax(0, maxint, maschine, mensch, nextone);
if felder[nextone] = nix
then
begin
felder[nextone] := blau;
tshape(findcomponent('
shape' + inttostr(nextone))).brush.color := clblue;
if gwinner = maschine
then
begin
spielende := true;
showmessage('
Du hast verloren');
end else
if gwinner = unentschieden
then
begin
spielende := true;
showmessage('
Unentschieden');
end;
spieler := mensch;
inc(runden);
end;
end;
end;
procedure TForm1.initgame;
var
rand: byte;
begin
spielende := false;
runden := 0;
rand := random(2);
if rand = 0
then
spieler := mensch
else
begin
spieler := maschine;
ki;
end;
end;
procedure TForm1.reinitgame;
var
i: integer;
begin
for i := 1
to 9
do
begin
felder[i] := nix;
TShape(findcomponent('
shape' + inttostr(i))).brush.color := clwhite;
end;
initgame;
end;
function TForm1.gwinner: TSpieler;
function checkf(farbe: TFeld): boolean;
begin
result := ((felder[1] = farbe)
and (felder[2] = farbe)
and (felder[3] = farbe))
or
((felder[4] = farbe)
and (felder[5] = farbe)
and (felder[6] = farbe))
or
((felder[7] = farbe)
and (felder[8] = farbe)
and (felder[9] = farbe))
or
((felder[1] = farbe)
and (felder[4] = farbe)
and (felder[7] = farbe))
or
((felder[2] = farbe)
and (felder[5] = farbe)
and (felder[8] = farbe))
or
((felder[3] = farbe)
and (felder[6] = farbe)
and (felder[9] = farbe));
if ((felder[1] = farbe)
and (felder[5] = farbe)
and (felder[9] = farbe))
then
result := true;
if ((felder[3] = farbe)
and (felder[5] = farbe)
and (felder[7] = farbe))
then
result := true;
end;
var
i: integer;
ucheck: boolean;
begin
ucheck := true;
result := keiner;
if checkf(rot)
then
result := mensch;
if checkf(blau)
then
result := maschine;
if (result = keiner)
then
begin
for i := 1
to 9
do
if felder[i] = nix
then
begin
ucheck := false;
break;
end;
if ucheck
then
result := unentschieden;
end;
end;
procedure TForm1.myMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if (spieler = mensch)
and (
not spielende)
and (felder[TShape(Sender).Tag] = nix)
then
begin
felder[TShape(Sender).Tag] := rot;
TShape(Sender).brush.color := clred;
{ //wird eh nie in kraft treten ^^
if gwinner = mensch then
begin
spielende := true;
showmessage('Du hast gewonnen');
end else
}
if gwinner = unentschieden
then
begin
spielende := true;
showmessage('
Unentschieden');
end;
spieler := maschine;
inc(runden);
ki;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
i: byte;
begin
for i := 1
to 9
do
TShape(findcomponent('
Shape' + inttostr(i))).Tag := i;
initgame;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
reInitGame;
end;
Initialization
randomize;
end.