www.pudn.com > 扑克牌游戏源码PlayingCard.rar > pukeGamewin.pas


unit pukeGamewin; 
 
interface 
 
uses 
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 
  Menus, ExtCtrls, StdCtrls, Gamewin; 
 
 
const 
  UpCard_Top = 16; 
  UpCard_Left1 = 240; 
  UpCard_Left2 = 330; 
  UpCard_Left3 = 420; 
  UPCard_Left4 = 510; 
  DownCard_Top = 130; 
  Card0_Left= 16; 
  Card1_Left= 250; 
  Card2_Left= 340; 
  Card3_left= 430; 
  Card4_Left= 520; 
  CardWidth= 71; 
  CardHeight=96; 
type 
      TPlayCard = Record 
       CardName: String; 
       Top: integer; 
       Left: Integer; 
      end; 
 
type  TMatter = Record 
       Ground:integer; 
       Index:Integer; 
       Card:Array of integer; 
       end; 
type 
  TForm1 = class(TForm) 
    ClickBmp: TImage; 
    MainMenu1: TMainMenu; 
    N1: TMenuItem; 
    N3: TMenuItem; 
    N4: TMenuItem; 
    N9: TMenuItem; 
    N2: TMenuItem; 
    N10: TMenuItem; 
    N11: TMenuItem; 
    A1: TMenuItem; 
    Button1: TButton; 
    Shape1: TShape; 
    Shape2: TShape; 
    Shape3: TShape; 
    Shape4: TShape; 
    Shape5: TShape; 
    Label1: TLabel; 
    Label2: TLabel; 
    Shape6: TShape; 
    Timer1: TTimer; 
    C1: TMenuItem; 
    S1: TMenuItem; 
    U1: TMenuItem; 
    Label3: TLabel; 
 
    procedure N9Click(Sender: TObject); 
    procedure N3Click(Sender: TObject); 
    procedure FormCreate(Sender: TObject); 
    procedure FormDestroy(Sender: TObject); 
    procedure ClickBmpDblClick(Sender: TObject); 
    procedure MyMouseDown(Sender: TObject; Button: TMouseButton; 
      Shift: TShiftState; X, Y: Integer); 
    procedure MyMouseMove(Sender: TObject; Shift: TShiftState; X, 
      Y: Integer); 
    procedure MyMouseUp(Sender: TObject; Button: TMouseButton; 
      Shift: TShiftState; X, Y: Integer); 
    procedure Button1Click(Sender: TObject); 
    procedure Timer1Timer(Sender: TObject); 
    procedure A1Click(Sender: TObject); 
    procedure S1Click(Sender: TObject); 
    procedure C1Click(Sender: TObject); 
    procedure FormPaint(Sender: TObject); 
    procedure N10Click(Sender: TObject); 
  published 
    procedure SetCard; 
    procedure DelhandCard(Cardvar: integer); 
    function CheckGround(Card: Timage):bool; 
    function CompareCard(S1, S2: String;UpDown:integer): Boolean; 
    procedure MoveCard(GroundName, ColVar,CardVar: integer); 
    function MoreMove(Card: Timage): TMatter; 
  private 
    Bitmap:TBitmap; 
      procedure WMEraseBkgnd(var m: TWMEraseBkgnd); message WM_ERASEBKGND; 
    { Private declarations } 
  public 
    { Public declarations } 
  end; 
 
var 
  Form1: TForm1; 
  Closeword:Boolean; 
  my:integer; 
  MyCard,UnDoCard: Array[0..51] of TPlayCard; 
 
  OkCard1,OkCard2,OkCard3,OkCard4:Array of integer; 
  NotCard1,NotCard2,NotCard3,NotCard4:Array of integer; 
  Ok1Max, 
  Ok2Max, 
  Ok3Max, 
  Ok4Max, 
  Not1Max, 
  Not2Max, 
  Not3Max, 
  Not4Max, 
  Flag, 
  VarX, 
  VarY, 
  OldTop, 
  OldLeft:integer; 
 
  MyImage :Array[0..51] of  TImage; 
  HandCard,BackCard:Array of Integer;      //手牌 
 
 
  Playing:Boolean; 
  PlayingCardList:TList; 
  //DQhigh,DQLow,DQStep:integer; 
  Pointer,Step:integer; 
  More:Boolean; 
  Currently:TMatter; 
  Counts:integer; 
  implementation 
 
uses about; 
{$R *.DFM} 
{$R PuKe.Res} 
procedure TForm1.N9Click(Sender: TObject); 
begin 
close; 
 
end; 
 
 
procedure TForm1.N3Click(Sender: TObject); 
var 
  i,j:integer; 
  Temp:TImage; 
begin 
  Form1.Shape1.Visible :=True; 
  Form1.Shape2.Visible :=True; 
  Form1.Shape3.Visible :=True; 
  Form1.Shape4.Visible :=True; 
  Form1.Shape5.Visible :=True; 
  Form1.Shape6.Visible :=False; 
  clickbmp.Visible:=True; 
  Clickbmp.BringToFront; 
  Button1.Visible :=True; 
  Counts:=0; 
  Ok1Max:=0; 
  Ok2Max:=0; 
  Ok3Max:=0; 
  Ok4Max:=0; 
  Not1MaX:=0; 
  Not2Max:=0; 
  Not3Max:=0; 
  Not4Max:=0; 
  More:=False; 
  SetCard; 
  ClickBmp.Picture.Bitmap.LoadFromResourceName(Hinstance,'Pic2'); 
  ClickBmp.Enabled :=True; 
  Pointer:=0; 
  Step:=3; 
  if PlayingCardList<>nil then 
  begin 
    j:=PlayIngCardList.Count; 
    if j>0 then 
    begin 
        for I:=0 to j-1 do 
        begin 
         Temp:=PlayingCardList.Items[I]; 
         Temp.free; 
        end; 
         PlayingCardList.Clear; 
    end; 
  end; 
  for i:=0 to 51 do 
  begin 
  MyImage[i]:= TImage.Create(Self); 
  Myimage[i].Parent:=self; 
  MyImage[i].Top:=UpCard_Top; 
  MyCard[i].Top :=UpCard_Top; 
  MyImage[i].Left := Card0_Left; 
  MYCard[i].Left := Card0_Left; 
  MyImage[i].Tag :=i; 
  MyImage[i].Visible := False; 
  MyImage[i].Picture.Bitmap.LoadFromResourceName(Hinstance,MyCard[i].CardName); 
  MYimage[i].AutoSize := True; 
  MYimage[i].Transparent := True; 
  MyImage[i].OnMouseDown :=MyMOuseDown; 
  MyImage[i].OnMouseMove := MyMouseMove; 
  MyImage[i].OnMouseUp := MyMouseUp; 
  PlayingCardList.Add(MyImage[i]); 
  end; 
  Label2.Caption:='剩余牌数:'+inttostr(8); 
  SetLength(BackCard,8); 
  for i:=0 to 7 do 
  begin 
     BackCard[7-i]:= i; 
     MyCard[i].Top := DownCard_Top; 
     MyCard[i].Left := Card0_Left; 
     MyImage[i].Top :=MyCard[i].Top; 
     MyImage[i].Left := MyCard[i].Left; 
     Myimage[i].Visible :=True; 
     Myimage[i].Enabled :=False; 
     Myimage[i].BringToFront; 
 
  end; 
 
  Myimage[8].Top :=UpCard_Top; 
  Myimage[8].Left:= UPCard_Left1; 
  MYimage[8].Visible := True; 
  Ok1Max:=1; 
  SetLength(OkCard1,Ok1Max); 
  OkCard1[0]:=8; 
  MyCard[8].Top := UpCard_Top; 
  MYCard[8].Left := Card1_Left; 
 
  Myimage[9].Top:=DownCard_Top; 
  MYimage[9].Left:=Card1_Left; 
  MYimage[9].Visible := True; 
  Not1Max:=1; 
  SetLength(NotCard1,Not1Max); 
  NotCard1[0]:=9; 
 
  MyCard[9].Top := DownCard_Top; 
  MyCard[9].Left := Card1_Left; 
 
  MYimage[10].Top:=DownCard_Top; 
  MYimage[10].Left:=Card2_Left; 
  Myimage[10].Visible := True; 
  Not2Max:=1; 
  SetLength(NotCard2,Not2Max); 
  NotCard2[0]:=10; 
  Mycard[10].Top := DownCard_Top; 
  MyCard[10].Left := Card2_Left; 
 
  MYimage[11].Top := DownCard_Top; 
  Myimage[11].Left:=Card3_Left; 
  Myimage[11].Visible := True; 
  Not3Max:=1; 
  SetLength(NotCard3,Not3Max); 
  NotCard3[0]:=11 ; 
 
  MyCard[11].Top := DownCard_Top; 
  MyCard[11].Left := Card3_Left; 
 
  MYimage[12].Top := DownCard_Top; 
  MYimage[12].Left := Card4_Left; 
  MYimage[12].Visible := True; 
  Not4Max:=1; 
  SetLength(NotCard4,Not4Max); 
  NotCard4[0]:=12; 
 
  MyCard[12].Top := DownCard_Top; 
  MyCard[12].Left := Card4_Left; 
  label1.Caption :='剩余牌数:'+inttostr(39); 
  //未翻牌赋值 
  SetLength(HandCard,39); 
  for i:=0 to high(HandCard) do 
  begin 
    HandCard[i]:=i+13; 
  end; 
 
end; 
 
procedure TForm1.FormCreate(Sender: TObject); 
var 
  i,j: integer; 
  PukeColor: array[0..3] of String; 
begin 
  Bitmap:=TBitmap.Create; 
   Bitmap.LoadFromFile('bor6.bmp'); 
  CloseWord:=True; 
  Timer1.Enabled:=True; 
  Timer1.Interval :=10; 
  My:=Form1.Width+20 ; 
  Form1.Repaint; 
  Ok1Max:=0; 
  Ok2Max:=0; 
  Ok3Max:=0; 
  Ok4Max:=0; 
  Not1MaX:=0; 
  Not2Max:=0; 
  Not3Max:=0; 
  Not4Max:=0; 
  ClickBmp.Enabled :=False; 
  PlayingCardList:=Tlist.Create; 
  Playing:=False; 
  PuKeColor[0] := 'B'; 
  PuKeColor[1] := 'R'; 
  PuKeColor[2] := 'H'; 
  PuKeColor[3] := 'P'; 
  for i:=0 to 12 do 
  begin 
     for j:=0 to 3 do 
     begin 
      MyCard[i*4+j].CardName :=PukeColor[j]+IntToStr(i+1); 
     end; 
  end; 
 
end; 
 
procedure TForm1.SetCard; 
var i,oldval,newval:integer; 
     Temp:String; 
 //    s:String; 
begin 
    Randomize; 
    for i:=1 to 500 do 
    begin 
    oldval:=StrToint(FloatToStr(Random(52))); 
    newVal:=StrToint(FloatToStr(Random(52))); 
    Temp:=MyCard[OldVal].CardName ; 
    MyCard[OldVal].CardName :=MyCard[NewVal].CardName; 
    MyCard[NewVal].CardName :=Temp; 
    end; 
  {  s:=''; 
    for i:=0 to 51 do 
    begin 
      if (i+1) mod 13 = 0  then 
       S:=S+MyCard[i].CardName+#13#10  //PuKeSet[i]+#13#10 
       else 
       s:=s+MyCard[i].CardName+',' // PukeSet[i]+','; 
    end; 
    showmessage(s); 
 
   } 
end; 
procedure TForm1.FormDestroy(Sender: TObject); 
begin 
PlayingCardList.Free; 
Bitmap.Free; 
end; 
 
procedure TForm1.ClickBmpDblClick(Sender: TObject); 
Var 
i,j,LeftY:integer; 
Temp:Array of integer; 
begin 
  if (Step=0) then 
  begin 
   form1.Shape6.Visible :=True; 
   Form1.Shape6.BringToFront; 
   clickbmp.Visible :=False; 
   Exit; 
 end; 
    if (Pointer)>high(HandCard) then 
    begin 
    Pointer:=0; 
    Step:=Step-1; 
      if Step>0 then 
      begin 
        for i:=0 to high(HandCard) do 
        begin 
          Myimage[HandCard[i]].Top:=16; 
          Myimage[HandCard[i]].Left:=16; 
          Myimage[HandCard[i]].Visible := False; 
          MyCard[HandCard[i]].Top :=16; 
          MYCard[handCard[i]].Left:=16; 
        end; 
      end; 
    end 
    else 
    begin 
 
      for i:=0 to Pointer-1 do    //整理翻完未拿的牌至一处 
      begin 
      Myimage[HandCard[i]].Top:=16; 
      MYimage[HandCard[i]].Left:=104; 
      Myimage[HandCard[i]].BringToFront ; 
      MYCard[HandCard[i]].Top:=16; 
      MyCard[handCard[i]].Left:=104; 
      end; 
    end; 
 
 
 //重新排列数组的次序; 
    i:=0; 
    SetLength(Temp,0); 
    while i<=Step-1 do 
    begin 
      if (Pointer+i)>High(HandCard) then 
      break; 
      SetLength(Temp,i+1); 
      Temp[i]:=HandCard[pointer+i]; 
      Inc(i); 
 
    end; 
    Counts:=High(Temp)+1; 
   j:=0; 
    for i:=High(Temp) downto 0 do 
     begin 
       HandCard[Pointer+j]:=Temp[i]; 
       J:=J+1; 
     end; 
 
    LeftY:=104; 
        j:=0; 
   i:=Pointer; 
   while i<=High(handCard) do 
   begin 
      if j>Step-1 then 
       break; 
       MYimage[HandCard[i]].Top :=UpCard_Top+j; 
       Myimage[HandCard[i]].left:=LeftY; 
       Myimage[HandCard[i]].Visible :=True; 
       Myimage[HandCard[i]].BringToFront; 
       MyCard[HandCard[i]].Top := UpCard_Top+j; 
       MYCard[handCard[i]].Left:=LeftY; 
       LeftY:=LeftY+16; 
       inc(i); 
       inc(Pointer); 
       inc(j); 
    end; 
end; 
 
procedure TForm1.MyMouseDown(Sender: TObject; Button: TMouseButton; 
  Shift: TShiftState; X, Y: Integer); 
var 
MyPoint:TMatter; 
begin 
   Flag:=0; 
   varX:=X; 
   VarY:=Y; 
   OldTop:=(Sender as Timage).Top; 
   OldLeft:=(Sender as Timage).Left; 
   MyPoint:=MoreMove((Sender as Timage)); 
   Currently:=MyPoint; 
   More:=False; 
   Case MyPoint.Ground of 
       1:begin 
         if  Counts=0 then 
             counts:=1; 
         if (MyPoint.Index+1)=Counts then 
             Flag:=1; 
         end; 
       2:begin 
         Flag:=1; 
         end; 
       3:begin 
           //上边第一列 
           if MyPoint.Index+1=Ok1Max then 
            begin 
            Flag:=1; 
             (Sender as Timage).BringToFront; 
            end; 
         end; 
       //--- 
       4:begin 
            //上边第二列 
            if MyPoint.Index+1=Ok2Max then 
            begin 
              Flag:=1; 
              (Sender as Timage).BringToFront; 
            end; 
         end; 
       //---- 
       5:begin 
           //上边第三列 
           if MyPoint.Index+1=Ok3Max then 
            begin 
              Flag:=1; 
              (Sender as Timage).BringToFront; 
            end; 
         end; 
       6:begin 
            //上边第四列 
           if MyPoint.Index+1=Ok4Max then 
            begin 
              Flag:=1; 
              (Sender as Timage).BringToFront; 
            end; 
         end; 
       7:begin 
            //下边第一列 
             if MyPoint.Index+1<>Not1Max then 
             begin 
             More:=True; 
             Flag:=1; 
             end 
             else 
             begin 
              Flag:=1; 
             (Sender as Timage).BringToFront; 
             end; 
         end; 
 
       8:begin 
        //下边第二列 
             if MyPoint.Index+1<>Not2Max then 
             begin 
             More:=True; 
             Flag:=1; 
             end 
             else 
             begin 
              Flag:=1; 
             (Sender as Timage).BringToFront; 
             end; 
         end; 
 
 
       9:begin 
         //下边第三列 
             if MyPoint.Index+1<>Not3Max then 
             begin 
             More:=True; 
             Flag:=1; 
             end 
             else 
             begin 
              Flag:=1; 
             (Sender as Timage).BringToFront; 
             end; 
         end; 
       10:begin 
         //下边第四列 
             if MyPoint.Index+1<>Not4Max then 
             begin 
             More:=True; 
             Flag:=1; 
             end 
             else 
             begin 
              Flag:=1; 
             (Sender as Timage).BringToFront; 
             end; 
         end; 
   end;//end of Case; 
end; 
 
procedure TForm1.MyMouseMove(Sender: TObject; Shift: TShiftState; X, 
  Y: Integer); 
var 
i,j:integer; 
begin 
   if Flag = 1 then 
     begin 
        if More then 
        begin 
           Case Currently.Ground of 
    1,2,3,4,5,6:begin 
                end; 
               7:begin 
                   j:=0; 
                   for i:=Currently.Index to High(NotCard1) do 
                   begin 
                      Myimage[NotCard1[i]].Top:=(Sender as Timage).Top+Y-VarY+j; 
                      Myimage[NotCard1[i]].Left:=(Sender as Timage).Left+X-VarX; 
                      Myimage[NotCard1[i]].BringToFront ; 
                      J:=J+15; 
                   end; 
                 end; 
               8:begin 
                   j:=0; 
                   for i:=Currently.Index to High(NotCard2) do 
                   begin 
                      Myimage[NotCard2[i]].Top:=(Sender as Timage).Top+Y-VarY+j; 
                      Myimage[NotCard2[i]].Left:=(Sender as Timage).Left+X-VarX; 
                      Myimage[NotCard2[i]].BringToFront ; 
                      J:=J+15; 
                   end; 
 
                 end; 
 
               9:begin 
                   j:=0; 
                   for i:=Currently.Index to High(NotCard3) do 
                   begin 
                      Myimage[NotCard3[i]].Top:=(Sender as Timage).Top+Y-VarY+j; 
                      Myimage[NotCard3[i]].Left:=(Sender as Timage).Left+X-VarX; 
                      Myimage[NotCard3[i]].BringToFront ; 
                      J:=J+15; 
                   end; 
 
                 end; 
               10:begin 
                   j:=0; 
                   for i:=Currently.Index to High(NotCard4) do 
                   begin 
                      Myimage[NotCard4[i]].Top:=(Sender as Timage).Top+Y-VarY+j; 
                      Myimage[NotCard4[i]].Left:=(Sender as Timage).Left+X-VarX; 
                      Myimage[NotCard4[i]].BringToFront ; 
                      J:=J+15; 
                   end; 
 
                 end; 
           end;//end of Case; 
        end 
        else  // more = flag; 
        begin 
        (Sender as Timage).Top :=(Sender as Timage).Top + Y - VarY; 
        (Sender as Timage).Left :=(Sender as Timage).Left + X - VarX; 
        (Sender as timage).BringToFront; 
        end;  //end of if more = true; 
    end; //Flag=1 
 
end; 
 
procedure TForm1.MyMouseUp(Sender: TObject; Button: TMouseButton; 
  Shift: TShiftState; X, Y: Integer); 
var i:integer; 
begin 
   if Flag = 1 then Flag:=0; 
   if CheckGround((Sender as Timage)) then 
   begin 
        if (OldTop >= UpCard_Top) and ( OldTop<=UpCard_Top+99) 
         and (OldLeft>=104) and (OldLeft<= 152) then 
         begin 
          Counts:=Counts-1; 
          if Counts<=0 then 
          counts:=1; 
          DelHandCard((Sender as Timage).Tag); 
          Label1.Caption:='剩余牌数:'+inttostr(High(HandCard)+1); 
         end; 
         if (OldTop=DownCard_Top) and (OldLeft=Card0_Left) then 
         begin 
           MoveCard(1,1,1); 
         end; 
 
         if (OldTop>=DownCard_Top) and  (OldLeft=Card1_Left) then 
         begin 
            //下面第一列; 
            MoveCard(3,1,(Sender as Timage).Tag); 
 
         end; 
 
         if (OldTop>=DownCard_Top) and  (OldLeft=Card2_Left) then 
         begin 
            //下面第二列; 
            MoveCard(3,2,(Sender as Timage).Tag); 
 
         end; 
 
         if (OldTop>=DownCard_Top) and  (OldLeft=Card3_Left) then 
         begin 
            //下面第三列; 
             MoveCard(3,3,(Sender as Timage).Tag); 
 
 
         end; 
 
         if (OldTop>=DownCard_Top) and  (OldLeft=Card4_Left) then 
         begin 
            //下面第四列; 
             MoveCard(3,4,(Sender as Timage).Tag); 
         end; 
 
         if (OldTop=UPCard_Top) And ((OldLeft=Card1_Left) or (OldLeft=UpCard_Left1)) then 
         begin 
            //上面第一列; 
            MoveCard(2,1,Ok1Max); 
         end; 
 
         if (OldTop=UPCard_Top) And ((OldLeft=Card2_Left) or (OldLeft=UpCard_Left2)) then 
         begin 
            //上面第二列; 
            MoveCard(2,2,Ok2Max); 
         end; 
 
          if (OldTop=UPCard_Top) And ((OldLeft=Card3_Left) or (OldLeft= UpCard_Left3)) then 
         begin 
            //上面第三列; 
            MoveCard(2,3,Ok3Max); 
         end; 
 
          if (OldTop=UPCard_Top) And ((OldLeft=Card4_Left) or (OldLeft=UpCard_Left4))then 
         begin 
            //上面第四列; 
            MoveCard(2,4,Ok4Max); 
         end; 
 
 
//自动送牌------------------------- 
 
 
        if NotCard1=nil then 
        begin 
           if BackCard<>nil then 
           begin 
              MyImage[BackCard[0]].top:=DownCard_Top; 
              MyImage[BackCard[0]].Left:=Card1_Left; 
              Myimage[BackCard[0]].Visible:=True; 
              Myimage[BackCard[0]].Enabled :=True; 
              Myimage[BackCard[0]].BringToFront ; 
              Not1Max:=1; 
              SetLength(NotCard1,Not1Max); 
              NotCard1[0]:=BackCard[0]; 
              MyCard[BackCard[0]].Top:=DownCard_Top; 
              MyCard[BackCard[0]].Left:=Card1_Left; 
              MoveCard(1,0,0); 
              Label2.Caption:='剩余牌数:'+inttostr(High(BackCard)+1); 
          end 
          else 
          begin 
              if HandCard<>nil then 
              begin 
              Myimage[HandCard[0]].Top :=DownCard_Top; 
              MYimage[HandCard[0]].Left:=Card1_Left; 
              MYimage[HandCard[0]].Visible :=true; 
              Myimage[HandCard[0]].Enabled :=True; 
              Not1Max:=1; 
              SetLength(NotCard1,Not1Max); 
              NotCard1[0]:=HandCard[0]; 
              MyCard[HandCard[0]].Top :=DownCard_Top; 
              MyCard[HandCard[0]].Left :=Card1_Left; 
              delHandCard(HandCard[0]); 
              Label2.Caption:='剩余牌数:0'; 
              Label1.Caption:='剩余牌数:'+inttostr(High(HandCard)+1); 
 
              end; 
          end; 
        end; 
        if NotCard2=nil then 
        begin 
           if BackCard<>nil then 
           begin 
              MyImage[BackCard[0]].top:=DownCard_Top; 
              MyImage[BackCard[0]].Left:=Card2_Left; 
              Myimage[BackCard[0]].Visible:=True; 
              Myimage[BackCard[0]].Enabled := true; 
              Myimage[BackCard[0]].BringToFront ; 
              Not2Max:=1; 
              SetLength(NotCard2,Not1Max); 
              NotCard2[0]:=backCard[0]; 
              MyCard[BackCard[0]].Top:=DownCard_Top; 
              MyCard[BackCard[0]].Left:=Card2_Left; 
              MoveCard(1,0,0); 
              Label2.Caption:='剩余牌数:'+inttostr(High(BackCard)+1); 
          end 
          else 
          begin 
              if HandCard<>nil then 
              begin 
              Myimage[HandCard[0]].Top :=DownCard_Top; 
              MYimage[HandCard[0]].Left:=Card2_Left; 
              MYimage[HandCard[0]].Visible :=true; 
              Myimage[HandCard[0]].Enabled := True; 
              Not2Max:=1; 
              Setlength(NotCard2,Not2Max); 
              NotCard2[0]:=HandCard[0]; 
              MyCard[HandCard[0]].Top :=DownCard_Top; 
              MyCard[HandCard[0]].Left :=Card2_Left; 
              delHandCard(HandCard[0]); 
              Label2.Caption:='剩余牌数:0'; 
              Label1.Caption:='剩余牌数:'+inttostr(High(HandCard)+1); 
 
              end; 
          end; 
 
        end; 
        if NotCard3=nil then 
        begin 
           if BackCard<>nil then 
           begin 
              MyImage[BackCard[0]].top:=DownCard_Top; 
              MyImage[BackCard[0]].Left:=Card3_Left; 
              Myimage[BackCard[0]].Visible:=True; 
              MYimage[BackCard[0]].Enabled :=True; 
              Myimage[BackCard[0]].BringToFront ; 
              Not3Max:=1; 
              SetLength(NotCard3,Not3Max); 
              NotCard3[0]:=BackCard[0]; 
              MyCard[BackCard[0]].Top:=DownCard_Top; 
              MyCard[BackCard[0]].Left:=Card3_Left; 
              MoveCard(1,0,0); 
              Label2.Caption:='剩余牌数:'+inttostr(High(BackCard)+1); 
 
          end 
          else 
          begin 
              if HandCard<>nil then 
              begin 
              Myimage[HandCard[0]].Top :=DownCard_Top; 
              MYimage[HandCard[0]].Left:=Card3_Left; 
              MYimage[HandCard[0]].Visible :=true; 
              Myimage[HandCard[0]].Enabled :=True; 
              Not3Max:=1; 
              SetLength(NotCard3,Not3Max); 
              NotCard3[0]:=HandCard[0]; 
              MyCard[HandCard[0]].Top :=DownCard_Top; 
              MyCard[HandCard[0]].Left :=Card3_Left; 
              delHandCard(HandCard[0]); 
              Label2.Caption:='剩余牌数:0'; 
              Label1.Caption:='剩余牌数:'+inttostr(High(HandCard)+1); 
 
              end; 
          end; 
 
        end; 
 
        if NotCard4=nil then 
        begin 
           if BackCard<>nil then 
           begin 
              MyImage[BackCard[0]].top:=DownCard_Top; 
              MyImage[BackCard[0]].Left:=Card4_Left; 
              Myimage[BackCard[0]].Visible:=True; 
              Myimage[BackCard[0]].Enabled:=True; 
              Myimage[BackCard[0]].BringToFront ; 
              Not4Max:=1; 
              SetLength(NotCard4,Not4Max); 
              NotCard4[0]:=BackCard[0]; 
              MyCard[BackCard[0]].Top:=DownCard_Top; 
              MyCard[BackCard[0]].Left:=Card4_Left; 
              MoveCard(1,0,0); 
              Label2.Caption:='剩余牌数:'+inttostr(High(BackCard)+1); 
 
          end 
          else 
          begin 
              if HandCard<>nil then 
              begin 
              Myimage[HandCard[0]].Top :=DownCard_Top; 
              MYimage[HandCard[0]].Left:=Card4_Left; 
              MYimage[HandCard[0]].Visible :=true; 
              Myimage[HandCard[0]].Enabled :=True; 
              Not4Max:=1; 
              Setlength(NotCard4,Not4Max); 
              NotCard4[0]:=HandCard[0]; 
              MyCard[HandCard[0]].Top :=DownCard_Top; 
              MyCard[HandCard[0]].Left :=Card4_Left; 
              delHandCard(HandCard[0]); 
              Label2.Caption:='剩余牌数:0'; 
              Label1.Caption:='剩余牌数:'+inttostr(High(HandCard)+1); 
 
              end; 
          end; 
 
        end; 
 
    end 
    else 
    begin 
         if Not More then 
         begin 
         (Sender as Timage).Top := OldTop; 
         (Sender as Timage).Left := OldLeft; 
         end 
         else 
         begin 
            for i:=0 to High(Currently.Card)do 
            begin 
             MyImage[Currently.Card[i]].Top:=MyCard[Currently.Card[i]].Top; 
             MyImage[Currently.Card[i]].Left:=MyCard[Currently.Card[i]].Left; 
            end; 
         end; 
 
    end; 
 
           if (high(OkCard1)=12) and (high(OkCard2)=12) and (high(Okcard3)=12) and (high(OkCard4)=12) then 
           Application.MessageBox('恭喜你!!!,成功了!!!'+#13#10+'祝你今天有个好心情','开心一刻',MB_Ok+MB_IconInformation); 
end; 
 
procedure TForm1.DelHandCard(CardVar: integer); 
var 
 i,j:integer; 
 MoveIndex:Array of integer; 
 Has:Bool; 
begin 
   Has:=false; 
   for i:=0 to High(HandCard) do 
   begin 
    if HandCard[i]=CardVar then 
    Has:=True; 
    end; 
 
   if Has then 
   begin 
   SetLength(MoveIndex,High(HandCard)); 
   j:=0; 
   for i:=0 to High(MoveIndex) do 
   begin 
      if HandCard[j]=CardVar then 
      begin 
       j:=j+1; 
      end; 
      MoveIndex[i]:=HandCard[j]; 
      inc(j); 
   end; 
   Setlength(HandCard,High(HandCard)); 
   for i:=0 to High(MoveIndex) do 
   begin 
      HandCard[i]:=MoveIndex[i]; 
   end; 
    if (pointer-1)<=0 then 
      Pointer:=0 
      else 
      Pointer:=Pointer-1; 
    end; 
 
end; 
 
procedure TForm1.Button1Click(Sender: TObject); 
var 
i,j:integer; 
begin 
  if HandCard = nil then 
  exit; 
  j:=Downcard_Top; 
  for i:=0 to High(HandCard) do 
  begin 
  Myimage[HandCard[i]].Top :=j; 
  MYimage[HandCard[i]].Left:=130; 
  MYimage[HandCard[i]].Visible :=true; 
  Myimage[HandCard[i]].BringToFront; 
  J:=J+15; 
  end; 
end; 
 
function TForm1.CheckGround(Card: Timage): bool; 
var 
CardCenterX,CardCenterY:integer; 
rangCenterX,rangCenterY:integer; 
Cx,Cy,rx,ry:integer; 
Temp1,Temp2:String; 
Ok:Boolean; 
OldMax,i,j,k,m:integer; 
begin 
   //覆盖范围检验 
      Result:=False; 
      Ok:=False; 
 
    cy:=96 div 2; 
    cx:=71 div 2; 
    ry:=780 div 2; 
    rx:=391 div 2; 
    CardCenterY:=cy+Card.Top; 
    CardCenterX:=cx+Card.Left; 
    rangCenterY:=ry+DownCard_Top; 
    RangCenterX:=rx+Card1_Left; 
 
      //      showmessage('当上一行空时检查登录点:'+MyCard[card.Tag].CardName+','+MyCard[8].CardName); 
      Temp1:=MyCard[Card.Tag].CardName; 
      Delete(temp1,1,1); 
      Temp2:=MyCard[8].CardName; 
      Delete(Temp2,1,1); 
   if (Abs(Card.Top-UpCard_Top) nil then 
         begin 
 
            for i:=0 to High(BackCard)-1 do 
            begin 
               BackCard[i]:=BackCard[i+1]; 
            end; 
            SetLength(BackCard,High(BackCard)); 
 
         end; 
      end; 
    2:begin 
         Case Colvar of 
 
            1:begin 
               dec(Ok1Max); 
               SetLength(OkCard1,Ok1Max); 
              end; 
            2:begin 
               Dec(Ok2Max); 
               SetLength(OkCard2,ok2Max); 
 
              end; 
            3:begin 
               dec(Ok3Max); 
               SetLength(OkCard3,Ok3Max); 
 
              end; 
            4:begin 
               dec(Ok4Max); 
               SetLength(OkCard4,Ok4Max); 
              end; 
         end; 
      end; 
    3:begin 
         case ColVar of 
         1:begin 
              i:=0; 
              while i<= High(Notcard1) do 
              begin 
                  if NotCard1[i]=CardVar then 
                  begin 
                       Not1Max:=i; 
                       SetLength(NotCard1,Not1Max); 
                       break; 
                  end; 
                  inc(i); 
              end; 
 
           end; 
 
 
         2:begin 
              i:=0; 
              while i<=High(NotCard2) do 
              begin 
                  if NotCard2[i]=CardVar then 
                  begin 
                     Not2Max:=i; 
                     SetLength(NotCard2,Not2Max); 
                     break; 
                  end; 
                  inc(i); 
              end; 
 
           end; //2 end; 
 
         3:begin 
              i:=0; 
              While i<=high(Notcard3) do 
              begin 
                  if NotCard3[i]=CardVar then 
                  begin 
                     Not3Max:=i; 
                     SetLength(NotCard3,Not3Max); 
                     break; 
                  end; 
                  Inc(i); 
              end; 
 
 
           end; 
         4:begin 
              i:=0; 
              While i<=High(NotCard4) do 
              begin 
                  if NotCard4[i]=CardVar then 
                  begin 
                     Not4Max:=i; 
                     SetLength(NotCard4,Not4Max); 
                     Break; 
                  end; 
                  Inc(i); 
              end; 
 
           end; 
 
         end; 
      end; 
   end;//- 
end; 
 
function TForm1.MoreMove(Card: Timage): TMatter; 
var 
i,j:integer; 
Matter:TMatter; 
begin 
   //覆盖范围检验 
    Matter.Ground:=0; 
    Matter.Index :=0; 
    SetLength(Matter.Card,0); 
    Result:=Matter; 
    if ((Card.Top>=UpCard_Top) and (Card.Top<=UpCard_Top+2)) and ((Card.Left>=104) and (Card.Left<=152)) then 
    begin 
        //取牌处 
      Matter.Ground :=1; 
      Matter.Index :=Card.Top-UpCard_Top; 
      Result:=Matter; 
    end; 
    if (Card.Top=DownCard_Top) and (Card.Left=Card0_Left)  then 
    begin 
       //背牌处; 
       Matter.Ground := 2; 
       Matter.Index :=0; 
       Result:=Matter; 
    end; 
 
    if (Card.Top=UpCard_Top) and ((Card.Left=Card1_Left) or (Card.Left=UpCard_Left1)) then 
    begin 
     //第一列摆放好的牌位 
       Matter.Ground:=3; 
      for i:=0 to high(OkCard1) do 
       begin 
          if OkCard1[i]=Card.Tag then 
          begin 
            Matter.Index := i; 
          end; 
       end; 
       Result:=Matter; 
     end; 
 
     if (Card.Top=UpCard_Top) and ((Card.Left=UpCard_Left2)or(Card.Left=Card2_Left)) then 
     begin 
         //第二列摆放好的牌位 
         Matter.Ground:=4; 
         for i:=0 to high(OkCard2) do 
          begin 
             if OkCard2[i]=Card.Tag then 
              begin 
                Matter.Index := i; 
              end; 
          end; 
       Result:=Matter; 
     end; 
 
     if (Card.Top=UpCard_Top) and ((Card.Left=UpCard_Left3)or(Card.Left=Card3_Left)) then 
     begin 
         //第三列摆放好的牌位 
         Matter.Ground:=5; 
         for i:=0 to high(OkCard3) do 
          begin 
             if OkCard3[i]=Card.Tag then 
              begin 
                Matter.Index := i; 
              end; 
          end; 
       Result:=Matter; 
     end; 
 
     if (Card.Top=UpCard_Top) and ((Card.Left=UpCard_Left4)or(Card.Left=Card4_Left)) then 
     begin 
         //第四列摆放好的牌位 
         Matter.Ground:=6; 
         for i:=0 to high(OkCard4) do 
          begin 
             if OkCard4[i]=Card.Tag then 
              begin 
                Matter.Index := i; 
              end; 
          end; 
       Result:=Matter; 
     end; 
 
     //--------------------------------------------- 
     //下边牌 
     if (Card.Top>=DownCard_Top) and (Card.Left=Card1_Left) then 
     begin 
       //下边第一列; 
         Matter.Ground := 7; 
         for i:=0 to high(NotCard1) do 
         begin 
            if NotCard1[i]=Card.Tag then 
            begin 
                Matter.Index:=i; 
                SetLength(Matter.Card,High(NotCard1)+1-i); 
                break; 
            end; 
         end; 
         j:=0; 
         for i:=Matter.Index to High(NotCard1) do 
         begin 
          Matter.Card[j]:=NotCard1[i]; 
          inc(j); 
         end; 
          Result:=Matter; 
     end; 
 
     if (Card.Top>=DownCard_Top) and (Card.Left=Card2_Left) then 
     begin 
         //下边第二列; 
         Matter.Ground := 8; 
         for i:=0 to high(NotCard2) do 
         begin 
            if NotCard2[i]=Card.Tag then 
             begin 
              Matter.Index := i; 
              SetLength(Matter.Card,High(NotCard2)+1-i); 
              Break; 
             end; 
         end; 
 
         j:=0; 
         for i:=Matter.Index to high(NotCard2) do 
         begin 
             Matter.Card[j]:=NotCard2[i]; 
             inc(j); 
         end; 
         Result:=matter; 
     end; 
 
     if (Card.Top>=DownCard_Top) and (Card.Left=Card3_Left) then 
     begin 
         //下边第三列; 
         Matter.Ground :=9; 
         for i:=0 to high(NotCard3) do 
         begin 
            if NotCard3[i]=Card.Tag then 
             begin 
              Matter.Index := i; 
              SetLength(Matter.Card,High(NotCard3)+1-i); 
              Break; 
             end; 
         end; 
 
         j:=0; 
         for i:=Matter.Index to high(NotCard3) do 
         begin 
             Matter.Card[j]:=NotCard3[i]; 
             inc(j); 
         end; 
         Result:=matter; 
 
      end; 
 
     if (Card.Top>=DownCard_Top) and (Card.Left=Card4_Left) then 
     begin 
        //下边第四列 
        Matter.Ground :=10 ; 
         for i:=0 to high(NotCard4) do 
         begin 
            if NotCard4[i]=Card.Tag then 
             begin 
              Matter.Index := i; 
              SetLength(Matter.Card,High(NotCard4)+1-i); 
              Break; 
             end; 
         end; 
 
         j:=0; 
         for i:=Matter.Index to high(NotCard4) do 
         begin 
             Matter.Card[j]:=NotCard4[i]; 
             inc(j); 
         end; 
         Result:=matter; 
     end; 
end; 
procedure TForm1.Timer1Timer(Sender: TObject); 
begin 
if CloseWord then 
begin 
 My:=My-1; 
 if my<-190 then 
 my:=width-100; 
 Label3.Top:=form1.height-80; 
 Label3.Left:=My; 
end; 
end; 
 
procedure TForm1.A1Click(Sender: TObject); 
begin 
  AboutBox.ShowModal; 
end; 
 
procedure TForm1.S1Click(Sender: TObject); 
begin 
Form1.Button1.Click; 
end; 
 
procedure TForm1.C1Click(Sender: TObject); 
begin 
if Closeword then 
begin 
CloseWord:=False; 
Timer1.Enabled:=False; 
Label3.Visible :=False; 
C1.Caption:='打开字幕(&O)'; 
Form1.Repaint; 
end 
else 
begin 
Timer1.Enabled :=True; 
Label3.Visible :=True; 
CloseWord:=True; 
C1.Caption :='关闭字幕(&C)'; 
end; 
end; 
procedure TForm1.FormPaint(Sender: TObject); 
var 
x,y:integer; 
begin 
 y := 0; 
  while y < Height do 
  begin 
    x := 0; 
    while x < Width do 
    begin 
      Canvas.Draw(x, y, Bitmap); 
      x := x + Bitmap.Width; 
    end; 
    y := y + Bitmap.Height; 
  end; 
end; 
 
procedure TForm1.WMEraseBkgnd(var m: TWMEraseBkgnd); 
begin 
  m.Result := LRESULT(False); 
end; 
 
procedure TForm1.N10Click(Sender: TObject); 
begin 
  if (not winhelp(Handle,'PlayCard.hlp',HELP_fINDER,0)) then 
  begin 
    showmessage('不能访问帮助信息'); 
    exit; 
  end; 
end; 
 
end.