fpchess: Patch from Brian Chalega da Silva, starts implementing move validation and fixes compilation with the latest Lazarus

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@1549 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
sekelsenmat
2011-04-04 16:09:05 +00:00
parent b7777efdb9
commit 5305fd6321
6 changed files with 762 additions and 100 deletions

View File

@ -5,7 +5,9 @@ unit chessgame;
interface
uses
Classes, SysUtils, fpimage, dateutils;
Classes, SysUtils, fpimage, dateutils,
Forms, Controls, Graphics, Dialogs,
ExtCtrls, ComCtrls, StdCtrls, Buttons, Spin;
const
colA = 1;
@ -25,6 +27,7 @@ const
type
TPacketKind = (pkConnect, pkStartGameClientAsWhite, pkStartGameClientAsBlack, pkMove);
BitBoard = array[1..8] of array [1..8] of boolean;
{ TPacket }
@ -60,6 +63,7 @@ type
TChessGame = class
public
Board: TChessBoard;
msg : String;
CurrentPlayerIsWhite: Boolean;
Dragging: Boolean;
DragStart, MouseMovePos: TPoint;
@ -73,6 +77,13 @@ type
function ClientToBoardCoords(AClientCoords: TPoint): TPoint;
function CheckStartMove(AFrom: TPoint): Boolean;
function MovePiece(AFrom, ATo: TPoint): Boolean;
function ValidateRookMove(AFrom, ATo: TPoint) : boolean;
function ValidateKnightMove(AFrom, ATo: TPoint) : boolean;
function ValidateBishopMove(AFrom, ATo: TPoint) : boolean;
function ValidateQueenMove(AFrom, ATo: TPoint) : boolean;
function ValidateKingMove(AFrom, ATo: TPoint) : boolean;
function ValidatePawnMove(AFrom, ATo: TPoint) : boolean;
procedure UpdateTimes();
end;
@ -162,21 +173,671 @@ end;
}
function TChessGame.MovePiece(AFrom, ATo: TPoint): Boolean;
begin
Result := False;
if not CheckStartMove(AFrom) then Exit;
// Parameter checking
if (AFrom.X < 1) or (AFrom.X > 8) or (ATo.X < 1) or (ATo.X > 8) then Exit;
if (AFrom.Y < 1) or (AFrom.Y > 8) or (ATo.Y < 1) or (ATo.Y > 8) then Exit;
result := false;
//AFrom.x:=AFrom.x;
//AFrom.y:=AFrom.y+2;
//if not CheckStartMove(AFrom) then Exit;
if ( (Board[AFrom.X][AFrom.Y]) in WhitePieces ) then begin
if Board[AFrom.X][AFrom.Y] = ctWRook then result:=(ValidateRookMove(AFrom,ATo));;
if Board[AFrom.X][AFrom.Y] = ctWKnight then result :=(ValidateKnightMove(AFrom,ATo));
if Board[AFrom.X][AFrom.Y] = ctWBishop then result :=(ValidateBishopMove(AFrom,ATo));
if Board[AFrom.X][AFrom.Y] = ctWQueen then result :=(ValidateQueenMove(AFrom,ATo));
if Board[AFrom.X][AFrom.Y] = ctWKing then result :=(ValidateKingMove(AFrom,ATo));
if Board[AFrom.X][AFrom.Y] = ctWPawn then result :=(ValidatePawnMove(AFrom,ATo));
end
else begin
if Board[AFrom.X][AFrom.Y] = ctBRook then result :=(ValidateRookMove(AFrom,ATo));
if Board[AFrom.X][AFrom.Y] = ctBKnight then result :=(ValidateKnightMove(AFrom,ATo));
if Board[AFrom.X][AFrom.Y] = ctBBishop then result :=(ValidateBishopMove(AFrom,ATo));
if Board[AFrom.X][AFrom.Y] = ctBQueen then result :=(ValidateQueenMove(AFrom,ATo));
if Board[AFrom.X][AFrom.Y] = ctBKing then result :=(ValidateKingMove(AFrom,ATo));
if Board[AFrom.X][AFrom.Y] = ctBPawn then result :=(ValidatePawnMove(AFrom,ATo));
end;
// ShowMessage('Resultado := ' + BoolToStr(result,true));
if (result) then begin
// col, row
Board[ATo.X][ATo.Y] := Board[AFrom.X][AFrom.Y];
Board[AFrom.X][AFrom.Y] := ctEmpty;
UpdateTimes();
CurrentPlayerIsWhite := not CurrentPlayerIsWhite;
end;
end;
//return true if the move of a Rook is valid.
function TChessGame.ValidateRookMove(AFrom, ATo: TPoint): boolean;
var AttackedSquares : BitBoard;
i,j : Integer;
l : integer = 0;
haveCaptured: boolean = false; //already have captured a piece
willBeACapture : boolean = false;// the movement will be a capture
validMove : boolean = false; //if the piece in the 'to' square is not of the same color of the player
// mensagem : String;
begin
for i:=1 to 8 do // initialize the bitboard of attacked pieces.
for j:=1 to 8 do
AttackedSquares[i][j]:= false;
// ShowMessage('vai passar pelo up');
//////////////////////////////////////UP////////////////////////////////////////
l := AFrom.y+1;
if (l<=8) then begin
if (CurrentPlayerIsWhite) then begin
willBeACapture:= (Board[AFrom.x][l] in BlackPieces);
validMove:= not (Board[AFrom.x][l] in WhitePieces);
end
else begin
willBeACapture:=(Board[AFrom.x][l] in WhitePieces);
validMove:=not (Board[AFrom.x][l] in BlackPieces)
end;
end
else
l :=0; // if it is in the border of the board, put 0 in l to skip the while below.
haveCaptured:=false;
while ( (l <= 8) and (validMove) and (not haveCaptured)) do begin
AttackedSquares[AFrom.x][l] := true;
if (willBeACapture) then
haveCaptured:=true;
l := l+1;
if (l<=8) then begin //again to not have an 'out of bounds' error
if (CurrentPlayerIsWhite) then begin
willBeACapture:= (Board[AFrom.x][l] in BlackPieces);
validMove:= not (Board[AFrom.x][l] in WhitePieces);
end
else begin
willBeACapture:=(Board[AFrom.x][l] in WhitePieces);
validMove:=not (Board[AFrom.x][l] in BlackPieces)
end;
end;
end;
///////////////////////////////////END UP///////////////////////////////////////
///////////////////////////////////DOWN/////////////////////////////////////////
haveCaptured:=false;
l := AFrom.y-1;
if (l>=1) then begin
if (CurrentPlayerIsWhite) then begin
willBeACapture:= (Board[AFrom.x][l] in BlackPieces);
validMove:= not (Board[AFrom.x][l] in WhitePieces);
end
else begin
willBeACapture:=(Board[AFrom.x][l] in WhitePieces);
validMove:=not (Board[AFrom.x][l] in BlackPieces)
end;
end
else
l :=0; // if it is in the border of the board, put 0 in l to skip the while below.
haveCaptured:=false;
while ( (l >= 1) and (validMove) and (not haveCaptured)) do begin
AttackedSquares[AFrom.x][l] := true;
if (willBeACapture) then
haveCaptured:=true;
l := l-1;
if (l>=1) then begin //again to not have an 'out of bounds' error
if (CurrentPlayerIsWhite) then begin
willBeACapture:= (Board[AFrom.x][l] in BlackPieces);
validMove:= not (Board[AFrom.x][l] in WhitePieces);
end
else begin
willBeACapture:=(Board[AFrom.x][l] in WhitePieces);
validMove:=not (Board[AFrom.x][l] in BlackPieces)
end;
end;
end;
///////////////////////////////////END DOWN/////////////////////////////////////
////////////////////////////////////RIGHT////////////////////////////////////////
haveCaptured:=false;
l := AFrom.x+1;
if (l<=8) then begin
if (CurrentPlayerIsWhite) then begin
willBeACapture:= (Board[l][AFrom.y] in BlackPieces);
validMove:= not (Board[l][AFrom.y] in WhitePieces);
end
else begin
willBeACapture:=(Board[l][AFrom.y] in WhitePieces);
validMove:=not (Board[l][AFrom.y] in BlackPieces)
end;
end
else
l :=0; // if it is in the border of the board, put 0 in l to skip the while below.
haveCaptured:=false;
while ( (l <= 8) and (validMove) and (not haveCaptured)) do begin
AttackedSquares[l][AFrom.y] := true;
if (willBeACapture) then
haveCaptured:=true;
l := l+1;
if (l<=8) then begin //again to not have an 'out of bounds' error
if (CurrentPlayerIsWhite) then begin
willBeACapture:= (Board[l][AFrom.y] in BlackPieces);
validMove:= not (Board[l][AFrom.y] in WhitePieces);
end
else begin
willBeACapture:=(Board[l][AFrom.y] in WhitePieces);
validMove:=not (Board[l][AFrom.y] in BlackPieces)
end;
end;
end;
///////////////////////////////////END RIGHT////////////////////////////////////
///////////////////////////////////LEFT/////////////////////////////////////////
haveCaptured:=false;
l := AFrom.x-1;
if (l>=1) then begin
if (CurrentPlayerIsWhite) then begin
willBeACapture:= (Board[l][AFrom.y] in BlackPieces);
validMove:= not (Board[l][AFrom.y] in WhitePieces);
end
else begin
willBeACapture:=(Board[l][AFrom.y] in WhitePieces);
validMove:=not (Board[l][AFrom.y] in BlackPieces)
end;
end
else
l :=0; // if it is in the border of the board, put 0 in l to skip the while below.
haveCaptured:=false;
while ( (l >= 1) and (validMove) and (not haveCaptured)) do begin
AttackedSquares[l][AFrom.y] := true;
if (willBeACapture) then
haveCaptured:=true;
l := l-1;
if (l>=1) then begin //again to not have an 'out of bounds' error
if (CurrentPlayerIsWhite) then begin
willBeACapture:= (Board[l][AFrom.y] in BlackPieces);
validMove:= not (Board[l][AFrom.y] in WhitePieces);
end
else begin
willBeACapture:=(Board[l][AFrom.y] in WhitePieces);
validMove:=not (Board[l][AFrom.y] in BlackPieces)
end;
end;
end;
///////////////////////////////////END LEFT/////////////////////////////////////
{ for i:=1 to 8 do begin //To show the bitboard
for j:=1 to 8 do
mensagem := mensagem + BoolToStr(AttackedSquares[i][j],'1','0') + ' ';
mensagem := mensagem + #13;
end;
ShowMessage(mensagem);}
//result:=true;
result := (AttackedSquares[Ato.X][Ato.y]);
end;
function TChessGame.ValidateKnightMove(AFrom, ATo: TPoint): Boolean;
begin
result:=true;
end;
function TChessGame.ValidateBishopMove(AFrom, ATo: TPoint): Boolean;
var AttackedSquares : BitBoard;
i,j : Integer;
x,y : integer;
haveCaptured: boolean = false; //already have captured a piece
willBeACapture : boolean = false;// the movement will be a capture
validMove : boolean = false; //if the piece in the 'to' square is not of the same color of the player
mensagem : String;
begin
for i:=1 to 8 do // initialize the bitboard of attacked pieces.
for j:=1 to 8 do
AttackedSquares[i][j]:= false;
// ShowMessage('vai passar pelo up left');
//////////////////////////////////////UP LEFT///////////////////////////////////
y := AFrom.y+1;
x := AFrom.x-1;
if (x>=1) and (y<=8) then begin
if (CurrentPlayerIsWhite) then begin
willBeACapture:= (Board[x][y] in BlackPieces);
validMove:= not (Board[x][y] in WhitePieces);
end
else begin
willBeACapture:=(Board[x][y] in WhitePieces);
validMove:=not (Board[x][y] in BlackPieces)
end;
end
else
y :=0; // if it is in the border of the board, put 0 in l to skip the while below.
haveCaptured:=false;
while ( (x>=1) and (y <= 8) and (validMove) and (not haveCaptured)) do begin
AttackedSquares[x][y] := true;
if (willBeACapture) then
haveCaptured:=true;
y := y+1;
x := x-1;
if (x>=1) and (y<=8) then begin //again to not have an 'out of bounds' error
if (CurrentPlayerIsWhite) then begin
willBeACapture:= (Board[x][y] in BlackPieces);
validMove:= not (Board[x][y] in WhitePieces);
end
else begin
willBeACapture:=(Board[x][y] in WhitePieces);
validMove:=not (Board[x][y] in BlackPieces)
end;
end;
end;
///////////////////////////////////END UP LEFT//////////////////////////////////
//////////////////////////////////////UP RIGHT//////////////////////////////////
y := AFrom.y+1;
x := AFrom.x+1;
willBeACapture:=false;
if (x<=8) and (y<=8) then begin
if (CurrentPlayerIsWhite) then begin
willBeACapture:= (Board[x][y] in BlackPieces);
validMove:= not (Board[x][y] in WhitePieces);
end
else begin
willBeACapture:=(Board[x][y] in WhitePieces);
validMove:=not (Board[x][y] in BlackPieces)
end;
end
else
y :=0; // if it is in the border of the board, put 0 in l to skip the while below.
haveCaptured:=false;
while ( (x<=8) and (y <= 8) and (validMove) and (not haveCaptured)) do begin
AttackedSquares[x][y] := true;
if (willBeACapture) then
haveCaptured:=true;
y := y+1;
x := x+1;
if (x<=8) and (y<=8) then begin //again to not have an 'out of bounds' error
if (CurrentPlayerIsWhite) then begin
willBeACapture:= (Board[x][y] in BlackPieces);
validMove:= not (Board[x][y] in WhitePieces);
end
else begin
willBeACapture:=(Board[x][y] in WhitePieces);
validMove:=not (Board[x][y] in BlackPieces)
end;
end;
end;
///////////////////////////////////END UP RIGHT/////////////////////////////////
//////////////////////////////////////DOWN LEFT/////////////////////////////////
y := AFrom.y-1;
x := AFrom.x-1;
willBeACapture:=false;
if (x>=1) and (y>=1) then begin
if (CurrentPlayerIsWhite) then begin
willBeACapture:= (Board[x][y] in BlackPieces);
validMove:= not (Board[x][y] in WhitePieces);
end
else begin
willBeACapture:=(Board[x][y] in WhitePieces);
validMove:=not (Board[x][y] in BlackPieces)
end;
end
else
y :=0; // if it is in the border of the board, put 0 in l to skip the while below.
haveCaptured:=false;
while ( (x>=1) and (y >= 1) and (validMove) and (not haveCaptured)) do begin
AttackedSquares[x][y] := true;
if (willBeACapture) then
haveCaptured:=true;
y := y-1;
x := x-1;
if (x>=1) and (y>=1) then begin //again to not have an 'out of bounds' error
if (CurrentPlayerIsWhite) then begin
willBeACapture:= (Board[x][y] in BlackPieces);
validMove:= not (Board[x][y] in WhitePieces);
end
else begin
willBeACapture:=(Board[x][y] in WhitePieces);
validMove:=not (Board[x][y] in BlackPieces)
end;
end;
end;
///////////////////////////////////END DOWN LEFT////////////////////////////////
//////////////////////////////////////DOWN RIGHT////////////////////////////////
y := AFrom.y-1;
x := AFrom.x+1;
willBeACapture:=false;
if (x<=8) and (y>=1) then begin
if (CurrentPlayerIsWhite) then begin
willBeACapture:= (Board[x][y] in BlackPieces);
validMove:= not (Board[x][y] in WhitePieces);
end
else begin
willBeACapture:=(Board[x][y] in WhitePieces);
validMove:=not (Board[x][y] in BlackPieces)
end;
end
else
y :=0; // if it is in the border of the board, put 0 in l to skip the while below.
haveCaptured:=false;
while ( (x<=8) and (y >= 1) and (validMove) and (not haveCaptured)) do begin
AttackedSquares[x][y] := true;
if (willBeACapture) then
haveCaptured:=true;
y := y-1;
x := x+1;
if (x<=8) and (y>=1) then begin //again to not have an 'out of bounds' error
if (CurrentPlayerIsWhite) then begin
willBeACapture:= (Board[x][y] in BlackPieces);
validMove:= not (Board[x][y] in WhitePieces);
end
else begin
willBeACapture:=(Board[x][y] in WhitePieces);
validMove:=not (Board[x][y] in BlackPieces)
end;
end;
end;
///////////////////////////////////END DOWN RIGHT///////////////////////////////
{for i:=1 to 8 do begin //To show the bitboard
for j:=1 to 8 do
mensagem := mensagem + BoolToStr(AttackedSquares[i][j],'1','0') + ' ';
mensagem := mensagem + #13;
end;
ShowMessage(mensagem);}
result := (AttackedSquares[Ato.X][Ato.y]);
end;
function TChessGame.ValidateQueenMove(AFrom, ATo: TPoint): Boolean;
var AttackedSquares : BitBoard;
i,j : Integer;
x,y,l : integer; //l it's the same of the y or x, just an index.
haveCaptured: boolean = false; //already have captured a piece
willBeACapture : boolean = false;// the movement will be a capture
validMove : boolean = false; //if the piece in the 'to' square is not of the same color of the player
mensagem : String;
begin
for i:=1 to 8 do // initialize the bitboard of attacked pieces.
for j:=1 to 8 do
AttackedSquares[i][j]:= false;
// ShowMessage('vai passar pelo up');
//////////////////////////////////////UP////////////////////////////////////////
l := AFrom.y+1;
if (l<=8) then begin
if (CurrentPlayerIsWhite) then begin
willBeACapture:= (Board[AFrom.x][l] in BlackPieces);
validMove:= not (Board[AFrom.x][l] in WhitePieces);
end
else begin
willBeACapture:=(Board[AFrom.x][l] in WhitePieces);
validMove:=not (Board[AFrom.x][l] in BlackPieces)
end;
end
else
l :=0; // if it is in the border of the board, put 0 in l to skip the while below.
haveCaptured:=false;
while ( (l <= 8) and (validMove) and (not haveCaptured)) do begin
AttackedSquares[AFrom.x][l] := true;
if (willBeACapture) then
haveCaptured:=true;
l := l+1;
if (l<=8) then begin //again to not have an 'out of bounds' error
if (CurrentPlayerIsWhite) then begin
willBeACapture:= (Board[AFrom.x][l] in BlackPieces);
validMove:= not (Board[AFrom.x][l] in WhitePieces);
end
else begin
willBeACapture:=(Board[AFrom.x][l] in WhitePieces);
validMove:=not (Board[AFrom.x][l] in BlackPieces)
end;
end;
end;
///////////////////////////////////END UP///////////////////////////////////////
///////////////////////////////////DOWN/////////////////////////////////////////
haveCaptured:=false;
l := AFrom.y-1;
if (l>=1) then begin
if (CurrentPlayerIsWhite) then begin
willBeACapture:= (Board[AFrom.x][l] in BlackPieces);
validMove:= not (Board[AFrom.x][l] in WhitePieces);
end
else begin
willBeACapture:=(Board[AFrom.x][l] in WhitePieces);
validMove:=not (Board[AFrom.x][l] in BlackPieces)
end;
end
else
l :=0; // if it is in the border of the board, put 0 in l to skip the while below.
haveCaptured:=false;
while ( (l >= 1) and (validMove) and (not haveCaptured)) do begin
AttackedSquares[AFrom.x][l] := true;
if (willBeACapture) then
haveCaptured:=true;
l := l-1;
if (l>=1) then begin //again to not have an 'out of bounds' error
if (CurrentPlayerIsWhite) then begin
willBeACapture:= (Board[AFrom.x][l] in BlackPieces);
validMove:= not (Board[AFrom.x][l] in WhitePieces);
end
else begin
willBeACapture:=(Board[AFrom.x][l] in WhitePieces);
validMove:=not (Board[AFrom.x][l] in BlackPieces)
end;
end;
end;
///////////////////////////////////DOWN/////////////////////////////////////////
////////////////////////////////////RIGHT////////////////////////////////////////
haveCaptured:=false;
l := AFrom.x+1;
if (l<=8) then begin
if (CurrentPlayerIsWhite) then begin
willBeACapture:= (Board[l][AFrom.y] in BlackPieces);
validMove:= not (Board[l][AFrom.y] in WhitePieces);
end
else begin
willBeACapture:=(Board[l][AFrom.y] in WhitePieces);
validMove:=not (Board[l][AFrom.y] in BlackPieces)
end;
end
else
l :=0; // if it is in the border of the board, put 0 in l to skip the while below.
haveCaptured:=false;
while ( (l <= 8) and (validMove) and (not haveCaptured)) do begin
AttackedSquares[l][AFrom.y] := true;
if (willBeACapture) then
haveCaptured:=true;
l := l+1;
if (l<=8) then begin //again to not have an 'out of bounds' error
if (CurrentPlayerIsWhite) then begin
willBeACapture:= (Board[l][AFrom.y] in BlackPieces);
validMove:= not (Board[l][AFrom.y] in WhitePieces);
end
else begin
willBeACapture:=(Board[l][AFrom.y] in WhitePieces);
validMove:=not (Board[l][AFrom.y] in BlackPieces)
end;
end;
end;
///////////////////////////////////END RIGHT////////////////////////////////////
///////////////////////////////////LEFT/////////////////////////////////////////
haveCaptured:=false;
l := AFrom.x-1;
if (l>=1) then begin
if (CurrentPlayerIsWhite) then begin
willBeACapture:= (Board[l][AFrom.y] in BlackPieces);
validMove:= not (Board[l][AFrom.y] in WhitePieces);
end
else begin
willBeACapture:=(Board[l][AFrom.y] in WhitePieces);
validMove:=not (Board[l][AFrom.y] in BlackPieces)
end;
end
else
l :=0; // if it is in the border of the board, put 0 in l to skip the while below.
haveCaptured:=false;
while ( (l >= 1) and (validMove) and (not haveCaptured)) do begin
AttackedSquares[l][AFrom.y] := true;
if (willBeACapture) then
haveCaptured:=true;
l := l-1;
if (l>=1) then begin //again to not have an 'out of bounds' error
if (CurrentPlayerIsWhite) then begin
willBeACapture:= (Board[l][AFrom.y] in BlackPieces);
validMove:= not (Board[l][AFrom.y] in WhitePieces);
end
else begin
willBeACapture:=(Board[l][AFrom.y] in WhitePieces);
validMove:=not (Board[l][AFrom.y] in BlackPieces)
end;
end;
end;
///////////////////////////////////END LEFT/////////////////////////////////////
//////////////////////////////////////UP LEFT///////////////////////////////////
y := AFrom.y+1;
x := AFrom.x-1;
if (x>=1) and (y<=8) then begin
if (CurrentPlayerIsWhite) then begin
willBeACapture:= (Board[x][y] in BlackPieces);
validMove:= not (Board[x][y] in WhitePieces);
end
else begin
willBeACapture:=(Board[x][y] in WhitePieces);
validMove:=not (Board[x][y] in BlackPieces)
end;
end
else
y :=0; // if it is in the border of the board, put 0 in l to skip the while below.
haveCaptured:=false;
while ( (x>=1) and (y <= 8) and (validMove) and (not haveCaptured)) do begin
AttackedSquares[x][y] := true;
if (willBeACapture) then
haveCaptured:=true;
y := y+1;
x := x-1;
if (x>=1) and (y<=8) then begin //again to not have an 'out of bounds' error
if (CurrentPlayerIsWhite) then begin
willBeACapture:= (Board[x][y] in BlackPieces);
validMove:= not (Board[x][y] in WhitePieces);
end
else begin
willBeACapture:=(Board[x][y] in WhitePieces);
validMove:=not (Board[x][y] in BlackPieces)
end;
end;
end;
///////////////////////////////////END UP LEFT//////////////////////////////////
//////////////////////////////////////UP RIGHT//////////////////////////////////
y := AFrom.y+1;
x := AFrom.x+1;
willBeACapture:=false;
if (x<=8) and (y<=8) then begin
if (CurrentPlayerIsWhite) then begin
willBeACapture:= (Board[x][y] in BlackPieces);
validMove:= not (Board[x][y] in WhitePieces);
end
else begin
willBeACapture:=(Board[x][y] in WhitePieces);
validMove:=not (Board[x][y] in BlackPieces)
end;
end
else
y :=0; // if it is in the border of the board, put 0 in l to skip the while below.
haveCaptured:=false;
while ( (x<=8) and (y <= 8) and (validMove) and (not haveCaptured)) do begin
AttackedSquares[x][y] := true;
if (willBeACapture) then
haveCaptured:=true;
y := y+1;
x := x+1;
if (x<=8) and (y<=8) then begin //again to not have an 'out of bounds' error
if (CurrentPlayerIsWhite) then begin
willBeACapture:= (Board[x][y] in BlackPieces);
validMove:= not (Board[x][y] in WhitePieces);
end
else begin
willBeACapture:=(Board[x][y] in WhitePieces);
validMove:=not (Board[x][y] in BlackPieces)
end;
end;
end;
///////////////////////////////////END UP RIGHT/////////////////////////////////
//////////////////////////////////////DOWN LEFT/////////////////////////////////
y := AFrom.y-1;
x := AFrom.x-1;
willBeACapture:=false;
if (x>=1) and (y>=1) then begin
if (CurrentPlayerIsWhite) then begin
willBeACapture:= (Board[x][y] in BlackPieces);
validMove:= not (Board[x][y] in WhitePieces);
end
else begin
willBeACapture:=(Board[x][y] in WhitePieces);
validMove:=not (Board[x][y] in BlackPieces)
end;
end
else
y :=0; // if it is in the border of the board, put 0 in l to skip the while below.
haveCaptured:=false;
while ( (x>=1) and (y >= 1) and (validMove) and (not haveCaptured)) do begin
AttackedSquares[x][y] := true;
if (willBeACapture) then
haveCaptured:=true;
y := y-1;
x := x-1;
if (x>=1) and (y>=1) then begin //again to not have an 'out of bounds' error
if (CurrentPlayerIsWhite) then begin
willBeACapture:= (Board[x][y] in BlackPieces);
validMove:= not (Board[x][y] in WhitePieces);
end
else begin
willBeACapture:=(Board[x][y] in WhitePieces);
validMove:=not (Board[x][y] in BlackPieces)
end;
end;
end;
///////////////////////////////////END DOWN LEFT////////////////////////////////
//////////////////////////////////////DOWN RIGHT////////////////////////////////
y := AFrom.y-1;
x := AFrom.x+1;
willBeACapture:=false;
if (x<=8) and (y>=1) then begin
if (CurrentPlayerIsWhite) then begin
willBeACapture:= (Board[x][y] in BlackPieces);
validMove:= not (Board[x][y] in WhitePieces);
end
else begin
willBeACapture:=(Board[x][y] in WhitePieces);
validMove:=not (Board[x][y] in BlackPieces)
end;
end
else
y :=0; // if it is in the border of the board, put 0 in l to skip the while below.
haveCaptured:=false;
while ( (x<=8) and (y >= 1) and (validMove) and (not haveCaptured)) do begin
AttackedSquares[x][y] := true;
if (willBeACapture) then
haveCaptured:=true;
y := y-1;
x := x+1;
if (x<=8) and (y>=1) then begin //again to not have an 'out of bounds' error
if (CurrentPlayerIsWhite) then begin
willBeACapture:= (Board[x][y] in BlackPieces);
validMove:= not (Board[x][y] in WhitePieces);
end
else begin
willBeACapture:=(Board[x][y] in WhitePieces);
validMove:=not (Board[x][y] in BlackPieces)
end;
end;
end;
///////////////////////////////////END DOWN RIGHT///////////////////////////////
for i:=1 to 8 do begin //To show the bitboard
for j:=1 to 8 do
mensagem := mensagem + BoolToStr(AttackedSquares[i][j],'1','0') + ' ';
mensagem := mensagem + #13;
end;
//ShowMessage(mensagem);
result:= (AttackedSquares[Ato.X][Ato.y]);
end;
function TChessGame.ValidateKingMove(AFrom, ATo: TPoint): Boolean;
begin
Result := True;
end;
function TChessGame.ValidatePawnMove(AFrom, ATo: TPoint): Boolean;
begin
Result := True;
end;

View File

@ -8,7 +8,7 @@ uses
{$IFDEF MSWINDOWS}
Winsock,
{$ENDIF}
Classes, SysUtils;
Classes, SysUtils, Process;
function ChessGetLocalIP(): string;

View File

@ -16,6 +16,9 @@
<VersionInfo>
<StringTable ProductVersion=""/>
</VersionInfo>
<BuildModes Count="1">
<Item1 Name="default" Default="True"/>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
<IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/>
@ -24,6 +27,7 @@
<RunParams>
<local>
<FormatVersion Value="1"/>
<LaunchingApplication PathPlusParams="\usr\bin\xterm -T 'Lazarus Run Output' -e $(LazarusDir)\tools\runwait.sh $(TargetCmdLine)"/>
</local>
</RunParams>
<RequiredPackages Count="2">
@ -70,7 +74,7 @@
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="9"/>
<Version Value="10"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="fpchess"/>

View File

@ -10,7 +10,7 @@ uses
Forms, lnetvisual, mainform, chessdrawer, chessgame, chessconfig,
chesstcputils;
{$R *.res}
//{$R *.res}
begin
Application.Initialize;

View File

@ -3,22 +3,22 @@ object formChess: TformChess
Height = 433
Top = 209
Width = 360
ActiveControl = notebookMain
Caption = 'FP Chess 0.1'
ClientHeight = 433
ClientWidth = 360
OnCreate = FormCreate
LCLVersion = '0.9.29'
object notebookMain: TUntabbedNotebook
LCLVersion = '0.9.31'
object notebookMain: TNotebook
Left = 0
Height = 433
Top = 0
Width = 360
PageIndex = 4
PageIndex = 0
Align = alClient
TabOrder = 0
TabStop = True
object pageStart: TUNBPage
OnBeforeShow = pageBeforeShow
object pageStart: TPage
ClientWidth = 360
ClientHeight = 433
object Label1: TLabel
@ -43,37 +43,53 @@ object formChess: TformChess
ParentColor = False
WordWrap = True
end
object Label6: TLabel
Left = 28
Height = 18
Top = 104
Width = 56
Caption = 'Start as:'
ParentColor = False
end
object Label7: TLabel
Left = 80
Height = 18
Top = 163
Width = 152
Caption = 'minutes for each player'
ParentColor = False
end
object btnSinglePlayer: TBitBtn
Left = 64
Left = 24
Height = 30
Top = 200
Width = 224
Width = 304
Caption = 'Play Against the Computer'
Enabled = False
OnClick = HandleMainScreenButton
TabOrder = 0
end
object btnDirectComm: TBitBtn
Left = 64
Left = 24
Height = 30
Top = 288
Width = 224
Top = 280
Width = 304
Caption = 'Play with a friend through a direct connection'
Enabled = False
OnClick = HandleMainScreenButton
TabOrder = 1
end
object BitBtn3: TBitBtn
Left = 62
Left = 24
Height = 30
Top = 376
Width = 224
Top = 360
Width = 304
Caption = 'Quit'
TabOrder = 2
end
object editPlayerName: TLabeledEdit
Left = 88
Height = 21
Height = 25
Top = 72
Width = 120
EditLabel.AnchorSideLeft.Control = editPlayerName
@ -81,29 +97,21 @@ object formChess: TformChess
EditLabel.AnchorSideTop.Side = asrCenter
EditLabel.AnchorSideRight.Control = editPlayerName
EditLabel.AnchorSideBottom.Control = editPlayerName
EditLabel.Left = 24
EditLabel.Height = 14
EditLabel.Left = 2
EditLabel.Height = 18
EditLabel.Top = 75
EditLabel.Width = 61
EditLabel.Width = 83
EditLabel.Caption = 'Player Name'
EditLabel.ParentColor = False
LabelPosition = lpLeft
TabOrder = 3
end
object Label6: TLabel
Left = 28
Height = 14
Top = 104
Width = 43
Caption = 'Start as:'
ParentColor = False
end
object comboStartColor: TComboBox
Left = 88
Height = 21
Height = 27
Top = 104
Width = 120
ItemHeight = 13
ItemHeight = 0
ItemIndex = 0
Items.Strings = (
'White'
@ -114,9 +122,9 @@ object formChess: TformChess
end
object checkTimer: TCheckBox
Left = 24
Height = 17
Height = 21
Top = 136
Width = 163
Width = 220
Caption = 'Set a time limit for each Player'
Checked = True
State = cbChecked
@ -124,43 +132,34 @@ object formChess: TformChess
end
object spinPlayerTime: TSpinEdit
Left = 21
Height = 21
Height = 25
Top = 160
Width = 50
TabOrder = 6
Value = 30
end
object Label7: TLabel
Left = 80
Height = 14
Top = 163
Width = 114
Caption = 'minutes for each player'
ParentColor = False
end
object btnHotSeat: TBitBtn
Left = 64
Left = 24
Height = 30
Top = 240
Width = 224
Width = 304
Caption = 'Play with a friend in the same Computer'
OnClick = HandleMainScreenButton
TabOrder = 7
end
object btnWebservice: TBitBtn
Left = 64
Left = 24
Height = 30
Top = 328
Width = 224
Top = 320
Width = 304
Caption = 'Play with a friend through the chess Webservice'
OnClick = HandleMainScreenButton
TabOrder = 8
end
end
object pageConfigConnection: TUNBPage
OnBeforeShow = pageBeforeShow
ClientWidth = 360
ClientHeight = 433
object pageConfigConnection: TPage
ClientWidth = 712
ClientHeight = 810
object Label3: TLabel
Left = 0
Height = 32
@ -222,10 +221,9 @@ object formChess: TformChess
TabOrder = 2
end
end
object pageConnecting: TUNBPage
OnBeforeShow = pageBeforeShow
ClientWidth = 360
ClientHeight = 433
object pageConnecting: TPage
ClientWidth = 712
ClientHeight = 810
object Label4: TLabel
Left = 0
Height = 32
@ -246,10 +244,9 @@ object formChess: TformChess
TabOrder = 0
end
end
object pageGame: TUNBPage
OnBeforeShow = pageBeforeShow
ClientWidth = 360
ClientHeight = 433
object pageGame: TPage
ClientWidth = 712
ClientHeight = 810
object Label5: TLabel
Left = 0
Height = 32
@ -271,29 +268,9 @@ object formChess: TformChess
ParentColor = False
end
end
object pageWebservice: TUNBPage
ClientWidth = 360
ClientHeight = 433
object editWebserviceURL: TLabeledEdit
Left = 72
Height = 21
Top = 72
Width = 280
EditLabel.AnchorSideLeft.Control = editPlayerName
EditLabel.AnchorSideTop.Control = editPlayerName
EditLabel.AnchorSideTop.Side = asrCenter
EditLabel.AnchorSideRight.Control = editPlayerName
EditLabel.AnchorSideBottom.Control = editPlayerName
EditLabel.Left = 24
EditLabel.Height = 14
EditLabel.Top = 75
EditLabel.Width = 61
EditLabel.Caption = 'Player Name'
EditLabel.ParentColor = False
LabelPosition = lpLeft
TabOrder = 0
Text = 'http://www.bobswart.nl/cgi-bin/ChessISAPIServer.dll/wsdl/IDelphiChess'
end
object pageWebservice: TPage
ClientWidth = 712
ClientHeight = 810
object Label8: TLabel
Left = 0
Height = 32
@ -306,6 +283,26 @@ object formChess: TformChess
ParentColor = False
ParentFont = False
end
object editWebserviceURL: TLabeledEdit
Left = 72
Height = 22
Top = 72
Width = 280
EditLabel.AnchorSideLeft.Control = editPlayerName
EditLabel.AnchorSideTop.Control = editPlayerName
EditLabel.AnchorSideTop.Side = asrCenter
EditLabel.AnchorSideRight.Control = editPlayerName
EditLabel.AnchorSideBottom.Control = editPlayerName
EditLabel.Left = 6
EditLabel.Height = 15
EditLabel.Top = 75
EditLabel.Width = 75
EditLabel.Caption = 'Player Name'
EditLabel.ParentColor = False
LabelPosition = lpLeft
TabOrder = 0
Text = 'http://www.bobswart.nl/cgi-bin/ChessISAPIServer.dll/wsdl/IDelphiChess'
end
object Button1: TButton
Left = 35
Height = 25

View File

@ -48,19 +48,19 @@ type
editRemoteID: TLabeledEdit;
editLocalIP: TLabeledEdit;
editPlayerName: TLabeledEdit;
pageStart: TUNBPage;
pageConfigConnection: TUNBPage;
notebookMain: TUntabbedNotebook;
pageConnecting: TUNBPage;
pageStart: TPage;
pageConfigConnection: TPage;
notebookMain: TNotebook;
pageConnecting: TPage;
ProgressBar1: TProgressBar;
pageGame: TUNBPage;
pageGame: TPage;
spinPlayerTime: TSpinEdit;
timerChessTimer: TTimer;
pageWebservice: TUNBPage;
pageWebservice: TPage;
procedure btnConnectClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure HandleMainScreenButton(Sender: TObject);
procedure pageBeforeShow(Sender: TObject; ANewPage: TUNBPage; ANewIndex: Integer);
procedure pageBeforeShow(Sender: TObject; ANewPage: TPage; ANewIndex: Integer);
procedure timerChessTimerTimer(Sender: TObject);
private
{ private declarations }
@ -100,7 +100,7 @@ begin
else if Sender = btnDirectComm then notebookMain.PageIndex := INT_PAGE_CONFIGCONNECTION;
end;
procedure TformChess.pageBeforeShow(Sender: TObject; ANewPage: TUNBPage; ANewIndex: Integer);
procedure TformChess.pageBeforeShow(Sender: TObject; ANewPage: TPage; ANewIndex: Integer);
begin
if ANewIndex = INT_PAGE_CONFIGCONNECTION then
begin