一个扑克牌发牌的实例

应用: 自定义组件, 自定义事件已经扑克牌发牌规则

unit uCommonDefine;

interface
uses
  ExtCtrls, Windows, Classes, SysUtils, Dialogs;

type
  TPukePanel = class(TPanel)
  private
    Images: array[0..3] of TImage;
    CardNames : array[0..3] of string;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  protected
    // Panel上的 Click 处理例程
    procedure ClickMe(Sender: TObject);
    // 扑克牌是上的Click 处理例程
    procedure ClickCard(Sender: TObject);
  end;

implementation

const
  CARDNAME_CARDSKIN: string = 'cardSkin';
  CARDNAME_54: string ='54';
  CARDNAME_GO: string ='GO';
  PICCARDNAMES: array[0..53] of string = ('blackJoker', 'redJoker',
'cl1', 'cl2', 'cl3', 'cl4', 'cl5', 'cl6', 'cl7', 'cl8', 'cl9', 'cl10', 'clj', 'clq', 'clk',
'di1', 'di10', 'di2', 'di3', 'di4', 'di5', 'di6', 'di7', 'di8', 'di9', 'dij', 'dik', 'diq',
'he1', 'he10', 'he2', 'he3', 'he4', 'he5', 'he6', 'he7', 'he8', 'he9','hej', 'hek',  'heq',
'sp1', 'sp10', 'sp2', 'sp3', 'sp4', 'sp5', 'sp6', 'sp7', 'sp8', 'sp9', 'spj', 'spk', 'spq');

var
  PicFileName: string = '';

  PicPath : string ='./Cards/';
{ TPukePanel }

procedure TPukePanel.ClickCard(Sender: TObject);
var
  cardname: string;
  PicIndex: Integer;
  i: Integer;
  HaveSelect: Boolean;
begin
  //ShowMessage((Sender as TImage).Name);
  Randomize;
  HaveSelect := False;
  while (not HaveSelect) do
  begin
    PicIndex := Random(54);
    for i := 0  to 3 do
      if PICCARDNAMES[picIndex] = CardNames[i] then
        HaveSelect := HaveSelect or True;
    if HaveSelect then
    begin
      ShowMessage('此张 Card 已经抽出 :' + PICCARDNAMES[picIndex]);
      HaveSelect := False
    end
    else
       Break;
  end;

//  if HaveSelect then //Exit; // 此张 Card 已经抽出
//  begin
//    ShowMessage('此张 Card 已经抽出 :' + PICCARDNAMES[picIndex]);
//    Exit;
//  end;

  CardNames[(Sender as TImage).Tag] := PICCARDNAMES[picIndex];
  cardname := PicPath + CardNames[(Sender as TImage).Tag] + '.BMP';
  if FileExists(cardname) then
    (Sender as TImage).Picture.LoadFromFile(cardname);
end;

procedure TPukePanel.ClickMe(Sender: TObject);
begin
  //ShowMessage('自定义的鼠标事件.');
end;

constructor TPukePanel.Create(AOwner: TComponent);
var
  i: Integer;
begin
  inherited Create(AOwner);
  Width := 500;
  Height := 120;
  for i := 0 to 3 do
  begin
    Images[i] := TImage.Create(Self);
    with Images[i] do
    begin
      Tag := i;
      Name := 'Image' + IntToStr(Tag);
      Parent := Self;
      AutoSize := True;
      Center := True;  // 居中
      //Transparent := True; 透明
      CardNames[i] := CARDNAME_CARDSKIN;
      PicFileName := PicPath + CardNames[i] + '.BMP';
      if FileExists(PicFileName) then Picture.LoadFromFile(PicFileName);
      Left := 50 + 80*i;
      Top := 10;
      // Card Click事件设定
      OnClick := ClickCard;
    end;
  end;
  // Panel Click 事件设定
  OnClick := ClickMe;
end;

destructor TPukePanel.Destroy;
var
  i: Integer;
begin
  for i := 0 to 3 do
  begin
    if Images[i]<> nil then FreeAndNil(Images[i]);
  end;
  inherited Destroy;
end;

end.


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值