📄 unit1.~pas
字号:
begin
//如果横着走
if(mPickRow=Row)then
begin
//判断起点列和落点列的大小
if(Column>mPickColumn)then
begin
Max:=Column;
Min:=mPickColumn;
end
else
begin
Max:=mPickColumn;
Min:=Column;
end;
//判断起点列和落点列之间是否全为'无子'
BlankFlag:=true;
for i:=Min+1 to Max-1 do
begin
if(mChess[row,i]<>'无子')then
BlankFlag:=false;
end;
//只有当起点列和落点列之间全为'无子'时,才允许落子
if(BlankFlag=true)then
CanDropFlag:=true;
end;
//如果竖着走
if(mPickColumn=Column)then
begin
//判断起点行和落点行的大小
if(Row>mPickRow)then
begin
Max:=Row;
Min:=mPickRow;
end
else
begin
Min:=Row;
Max:=mPickRow;
end;
//判断起点行和落点行之间是否全为'无子'
BlankFlag:=true;
for i:=Min+1 to Max-1 do
begin
if(mChess[i,Column]<>'无子')then
BlankFlag:=false;
end;
//只有当起点行和落点行之间全为'无子'时,才允许落子
if(BlankFlag=true)then
CanDropFlag:=true;
end;
end;
//士的走棋规则判断
if(mPickChess='我士') or (mPickChess='敌士')then
begin
//如果是我方的士
if(mPickChess='我士')then
if(abs(mPickRow-Row)=1) and (abs(mPickColumn-Column)=1) and (Row>=8) and (Column>=4) and (Column<=6 ) then
CanDropFlag:=true;
//如果是敌方的士
if(mPickChess='敌士')then
if(abs(mPickRow-Row)=1) and (abs(mPickColumn-Column)=1) and (Row<=3) and (Column>=4) and (Column<=6 ) then
CanDropFlag:=true;
end;
//帅的走棋规则判断
if(mPickChess='我帅') or (mPickChess='敌帅')then
begin
//如果是我方的帅
if(mPickChess='我帅')then
if ((abs(mPickRow-Row)=1) and (mPickColumn=Column)) or ((mPickRow=Row) and (abs(mPickColumn-Column)=1)) then
if(Row>=8) and (Column>=4) and (Column<=6)then
CanDropFlag:=true;
//如果是敌方的帅
if(mPickChess='敌帅')then
if ((abs(mPickRow-Row)=1) and (mPickColumn=Column)) or ((mPickRow=Row) and (abs(mPickColumn-Column)=1)) then
if(Row<=3) and (Column>=4) and (Column<=6)then
CanDropFlag:=true;
end;
//炮的走棋规则判断
if(mPickChess='我炮') or (mPickChess='敌炮')then
begin
//如果落点存在棋子时
if(mChess[Row,Column]<>'无子')then
begin
//如果横着走
if(mPickRow=Row)then
begin
//判断起点列和落点列的大小
if(Column>mPickColumn)then
begin
Max:=Column;
Min:=mPickColumn;
end
else
begin
Max:=mPickColumn;
Min:=Column;
end;
//判断起点列和落点列之间是否只存在一个棋子
ChessNum:=0;
for i:=Min+1 to Max-1 do
begin
if(mChess[Row,i]<>'无子')then
ChessNum:=ChessNum+1;
end;
//只有当起点列和落点列之间只存在一个棋子时,才允许落子
if(ChessNum=1)then
CanDropFlag:=true;
end;
//如果竖着走
if(mPickColumn=Column)then
begin
//判断起点行和落点行的大小
if(Row>mPickRow)then
begin
Max:=Row;
Min:=mPickRow;
end
else
begin
Min:=Row;
Max:=mPickRow;
end;
//判断起点行和落点行之间是否只存在一个棋子
ChessNum:=0;
for i:=Min+1 to Max-1 do
begin
if(mChess[i,Column]<>'无子')then
ChessNum:=ChessNum+1;
end;
//只有当起点行和落点行之间只存在一个棋子时,才允许落子
if(ChessNum=1)then
CanDropFlag:=true;
end;
end;
//如果落点不存在棋子时
if(mChess[Row,Column]='无子')then
begin
//如果横着走
if(mPickRow=Row)then
begin
//判断起点列和落点列的大小
if(Column>mPickColumn)then
begin
Max:=Column;
Min:=mPickColumn;
end
else
begin
Max:=mPickColumn;
Min:=Column;
end;
//判断起点列和落点列之间是否全为'无子'
BlankFlag:=true;
for i:=Min+1 to Max-1 do
begin
if(mChess[Row,i]<>'无子')then
BlankFlag:=false;
end;
//只有当起点列和落点列之间全为'无子'时,才允许落子
if(BlankFlag=true)then
CanDropFlag:=true;
end;
//如果竖着走
if(mPickColumn=Column)then
begin
//判断起点行和落点行的大小
if(Row>mPickRow)then
begin
Max:=Row;
Min:=mPickRow;
end
else
begin
Min:=Row;
Max:=mPickRow;
end;
//判断起点行和落点行之间是否全为'无子'
BlankFlag:=true;
for i:=Min+1 to Max-1 do
begin
if(mChess[i,Column]<>'无子')then
BlankFlag:=false;
end;
//只有当起点行和落点行之间全为'无子'时,才允许落子
if(BlankFlag=true)then
CanDropFlag:=true;
end;
end;
end;
//如果符合走棋规则
if(CanDropFlag=true)then
begin
//在列表视图中添加一行
item:=ListView1.Items.Add;
item.Caption:=mWhoPlay+'方';
item.SubItems.Add(mPickChess);
//显示拾子位置
if(mPickRow<10)then
item.SubItems.Add('0'+IntToStr(mPickRow)+'行'+'0'+IntToStr(mPickColumn)+'列')
else
item.SubItems.Add(IntToStr(mPickRow)+'行'+'0'+IntToStr(mPickColumn)+'列');
//显示落子位置
if(Row<10)then
item.SubItems.Add('0'+IntToStr(Row)+'行'+'0'+IntToStr(Column)+'列')
else
item.SubItems.Add(IntToStr(Row)+'行'+'0'+IntToStr(Column)+'列');
//显示被吃棋子
item.SubItems.Add(mChess[Row,Column]);
if(mChess[Row,Column]='我帅') or (mChess[Row,Column]='敌帅')then
begin
Result := MessageDlg('敌方取胜.',MtInformation,[mbYes],0);
if Result=MrYes then
begin
MenuStartClick(Form1);
end;
end
else
begin
//设置棋子值的变化
mChess[mPickRow,mPickColumn]:='无子';
mChess[Row,Column]:=mPickChess;
//设置拾子标志为false
mPickFlag:=false;
//清空拾起的棋子值
mPickChess:='无子';
//清空拾起的棋子的行号和列号
mPickRow:=-1;
mPickColumn:=-1;
//交换走棋方
if(mWhoPlay='我')then
mWhoPlay:='敌'
else
mWhoPlay:='我';
//刷新窗口
Invalidate();
end;
end;
end;
end;
end;
end;
end
else
//如果单击鼠标右键和中键
begin
//处理拾子动作
// if(mPickFlag=true)then
//begin
//设置拾子标志为false
mPickFlag:=false;
//清空拾起的棋子值
mPickChess:='无子';
//清空拾起的棋子的行号和列号
mPickRow:=-1;
mPickColumn:=-1;
//刷新窗口
Invalidate();
// end;
end;
end;
//响应鼠标移动消息
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
Var
RePaitRect: TRect;
begin
if(mPickFlag=true)then
begin
//设定重绘区域
RePaitRect.Left:=PreX-30;
RePaitRect.Top:=PreY-30;
RePaitRect.Right:=PreX+30;
RePaitRect.Bottom:=PreY+30;
//重绘该区域
Canvas.CopyRect(RePaitRect,BitmapRepaint.Canvas,RePaitRect);
//绘制移动棋子
Canvas.Draw(X-28,Y-28,BitmapMoveChess);
//保存鼠标点坐标以方便下一次重绘
PreX:=X;
PreY:=Y;
end;
end;
//定时器响应函数
procedure TForm1.TimerDrawEllipseTimer(Sender: TObject);
begin
//判断是否已经拾起棋子
if(mPickFlag=true)then
begin
//改变画笔颜色
if(Canvas.Pen.Color=clRed)then
Canvas.Pen.Color:=clBlue
else
Canvas.Pen.Color:=clRed;
Canvas.Pen.Width:=4;
Canvas.Brush.Style:=bsClear;
//在拾子位置画一个红蓝4角边框
canvas.MoveTo(mPickColumn*60-30,mPickRow*60-30);
canvas.LineTo(mPickColumn*60-15,mPickRow*60-30);
canvas.MoveTo(mPickColumn*60-30,mPickRow*60-30);
canvas.LineTo(mPickColumn*60-30,mPickRow*60-15);
canvas.MoveTo(mPickColumn*60+30,mPickRow*60-30);
canvas.LineTo(mPickColumn*60+15,mPickRow*60-30);
canvas.MoveTo(mPickColumn*60+30,mPickRow*60-30);
canvas.LineTo(mPickColumn*60+30,mPickRow*60-15);
canvas.MoveTo(mPickColumn*60+30,mPickRow*60+30);
canvas.LineTo(mPickColumn*60+15,mPickRow*60+30);
canvas.MoveTo(mPickColumn*60+30,mPickRow*60+30);
canvas.LineTo(mPickColumn*60+30,mPickRow*60+15);
canvas.MoveTo(mPickColumn*60-30,mPickRow*60+30);
canvas.LineTo(mPickColumn*60-15,mPickRow*60+30);
canvas.MoveTo(mPickColumn*60-30,mPickRow*60+30);
canvas.LineTo(mPickColumn*60-30,mPickRow*60+15);
end;
end;
//响应窗口改变大小事件
procedure TForm1.FormResize(Sender: TObject);
begin
//设置列表框的位置和大小
ListView1.Height:=Form1.ClientHeight-ListView1.Top;
ListView1.Left:=Form1.ClientWidth-ListView1.Width;
end;
//响应窗口显示事件
procedure TForm1.FormShow(Sender: TObject);
begin
//调用窗口改变大小响应函数
FormResize(Sender);
end;
procedure TForm1.N2Click(Sender: TObject);
var
count:integer;
item :TListItem;
temp: string;
//走棋方
WhoPlay:string;
//移动棋子
PickChess:string;
//被吃棋子
EatChess:string;
//拾子的行号和列号
PickRow,PickColumn:integer;
//落子的行号和列号
DropRow,DropColumn:integer;
begin
//获取列表视图控件中的行数
count:=ListView1.Items.Count;
//如果存在列表行,则执行悔棋动作
if(count>0)then
begin
//获取列表视图控件中的最后一行
item:=ListView1.Items.Item[count-1];
//获取走棋方
WhoPlay:=item.Caption;
//获取拾起的棋子值
PickChess:=Item.SubItems.Strings[0];
//获取拾子的行号和列号
temp:=Item.SubItems.Strings[1];
PickRow:=StrToInt(Copy(temp,0,2));
PickColumn:=StrToInt(Copy(temp,5,2));
//获取落子的行号和列号
temp:=Item.SubItems.Strings[2];
DropRow:=StrToInt(Copy(temp,0,2));
DropColumn:=StrToInt(Copy(temp,5,2));
//获取被吃的棋子
EatChess:=Item.SubItems.Strings[3];
//执行悔棋动作
mChess[DropRow,DropColumn]:=EatChess;
mChess[PickRow,PickColumn]:=PickChess;
//删除列表视图控件中的最后一行
ListView1.Items.Delete(count-1);
//交换走棋方
if(mWhoPlay='我')then
mWhoPlay:='敌'
else
mWhoPlay:='我';
//强制刷新窗口
Invalidate();
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -