⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit1.~pas

📁 中国象棋的delphi源代码,可实现联机
💻 ~PAS
📖 第 1 页 / 共 2 页
字号:
            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 + -