Zitat von
glkgereon:
bevor du mit ner ki anfängst, schreib erstmal eine "grafik"-engine, die folgende anforderungen erfüllt:
- darstellung der akuellen stellung
- entgegennahme von user-inputs (maus, tastatur)
- entgegennahme von programm-inputs (functions/ procedures)
- einfach ansteuerung (zb. TrackFigure(x1,y1,x2,y2); )
dann erweiterst du diese engine mit einem reinen bewertungssystem, das einfach sagt, wie es seiner meinung nach grade steht.
dieses testest du dann ausführlich
wenn es gut ist, dann baust du ein das er züge selber ausprobiert.
und dann, ist es nur noch ein kleiner schritt bis zur "richtigen" ki
Guck mal hier:
Delphi-Quellcode:
type
TMove = record
A,B,rA,rB,V:TPoint;
end;
TFigure = record
Pos:TPoint;
ID:Integer;
end;
TFields = array[1..8,1..8] of TFigure;
TBoard = class
public
Children:array of TBoard;
Parent:TBoard;
Fields:TFields;
Move:TMove;
Turn:Integer;
wGetPawn,bGetPawn,wRochade,bRochade:Boolean;
constructor Create(AParent:TBoard);
destructor Destroy;override;
procedure NewBoard;
procedure LineUpFigures;
procedure CopyFrom(B:TBoard);
function KingMoveAllowed:Boolean;
function RochadeAllowed:Boolean;
function RookMoveAllowed:Boolean;
function KnightMoveAllowed:Boolean;
function BishopMoveAllowed:Boolean;
function PawnMoveAllowed:Boolean;
function PawnKillAllowed:Boolean;
function Checked(Side,x,y:Integer):Boolean;
function KingChecked(Side:Integer):Boolean;
function GettingChecked:Boolean;
function MovePossible:Boolean;
function MoveAllowed:Boolean;
procedure DoMove;
// Einstieg der KI
procedure TryNewMove;
end;
TChessBoard = class(TComponent)
private
FImage:TImage;
FFieldWidth,FFieldHeight:Integer;
FWhiteFieldColor,FWhiteFrameColor,FBlackFieldColor,FBlackFrameColor:TColor;
public
BitmapCollection:TBitmapCollection;
Board:TBoard;
constructor Create(Owner:TComponent);override;
destructor Destroy;override;
procedure DoBestMove;
procedure DrawField(x,y:Integer);
procedure DrawMovedFigures;
procedure DrawBoard;
published
property Image:TImage read FImage write FImage;
property FieldWidth:Integer read FFieldWidth write FFieldWidth default 32;
property FieldHeight:Integer read FFieldHeight write FFieldHeight default 32;
property WhiteFieldColor:TColor read FWhiteFieldColor write FWhiteFieldColor default $EFEFEF;
property WhiteFrameColor:TColor read FWhiteFrameColor write FWhiteFrameColor default $DFDFDF;
property BlackFieldColor:TColor read FBlackFieldColor write FBlackFieldColor default $BFBFBF;
property BlackFrameColor:TColor read FBlackFrameColor write FBlackFrameColor default $CFCFCF;
end;
Die meisten Methoden außer TBoard.TryNewMove funktionieren.
Du siehst hab schon vieles vorbereitet. Ist auch 'n Kopie von meinem Mehrspieler-Schach
Hier ist es!