2017-01-02 67 views
0

所以我在这个forum上找到了一个二十一点的源代码,但是我有一个问题让它工作。我自己编写了代码,我认为这是问题所在。当我点击“新按钮”时,游戏应该开始,但是当我点击它时什么也没有发生。 这里是源代码:为什么我的按钮点击事件处理程序没有做到我所期望的?

unit Unit1; 

{$mode objfpc}{$H+} 

interface 

uses 
    Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, 
    ExtCtrls, Buttons; 

type 

    { TForm1 } 

    TForm1 = class(TForm) 
    BetCount: TLabel; //not used 
    MoneyEdit: TEdit; //not used 
    BetEdit: TEdit; //not used 
    HitBtn: TButton; 
    MoneyCountLbl: TLabel; //not used 
    NewBtn: TButton; 
    StandBtn: TButton; 
    PlayerEdit: TEdit; 
    DealerEdit: TEdit; 
    MemoDealer: TMemo; 
    MemoPlayer: TMemo; 
    procedure PickASuit; 
    procedure PickACard; 
    procedure CardName; 
    procedure LookAtHands; 
    procedure newDeal; 
    procedure DoIt(Sender: TObject); 
    procedure FormCreate(Sender: TObject); 
    private 
    { private declarations } 
    public 

    { public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.lfm} 
var 
suitNum, cardNum, current, total1, total2 : Integer; 
suitStr, cardStr : String[8]; 

procedure TForm1.PickASuit; 
begin 
suitNum := random(4)+1; 
Case suitNum of 
1 : suitStr := 'Spades'; 
2 : suitStr := 'Clubs'; 
3 : suitStr := 'Diamonds'; 
4 : suitStr := 'Hearts'; 
end; 
end; 



procedure TForm1.CardName; 
begin 
Case cardNum of 
1 : cardStr := 'Ace'; 
2 : cardStr := 'Two'; 
3 : cardStr := 'Three'; 
4 : cardStr := 'Four'; 
5 : cardStr := 'Five'; 
6 : cardStr := 'Six'; 
7 : cardStr := 'Seven'; 
8 : cardStr := 'Eight'; 
9 : cardStr := 'Nine'; 
10 : cardStr := 'Ten'; 
11 : cardStr := 'Jack'; 
12 : cardStr := 'Queen'; 
13 : cardStr := 'King'; 
end; 

Case cardNum of 
1 : cardNum := 11; 
10..13 : cardNum := 10; 
end; 

end; 

procedure TForm1.PickACard; 
begin 
cardNum := random(13)+1; 
PickASuit; {runs pickasuit procedure} 
CardName; {runs cardnume procedure} 

Case current of {tells the program what its doing} 
    1 : begin 
    MemoPlayer.Lines.Add(cardStr + ' of ' + suitStr); 
    total1 := total1 + cardNum; 
    PlayerEdit.Text := IntToStr(total1); 
    end; 

    2 : begin 
    MemoDealer.Lines.Add(cardStr + ' of ' + suitStr); 
    total2 := total2 + cardNum; 
    DealerEdit.Text := IntToStr(total2); 
    end; 

end; 
end; 

procedure TForm1.LookAtHands; 
Begin 
If total2 > 21 then ShowMessage('House Busted') 
Else if total1 > total2 then ShowMessage('You win') 
Else if total1 = total2 then ShowMessage('Draw') 
Else ShowMessage('You lose'); 
newDeal; 
End; 

procedure TForm1.newDeal; 
Begin 
MemoDealer.Clear; 
MemoPlayer.Clear; 
total1 := 0; 
total2 := 0; 
current := 1; 
PickACard; 
current := 2; 
PickACard; 
end; 

procedure TForm1.DoIt(Sender: TObject); 
begin 
current := (Sender as TButton).Tag; 
Case current of 
1 : Begin 
PickACard; 
If total1 > 21 then 
begin ShowMessage('Busted'); 
newDeal; 
end; 
end; 

2 : begin While total2 < 17 do PickACard; 
LookAtHands; 
end; 

3 : newDeal; 
end; 
end; 


procedure TForm1.FormCreate(Sender: TObject); 
begin 
    Randomize; 
end; 
end. 

我组命中,新和站按钮执行过程“大一”

enter image description here

难道我犯了一个错误?我刚开始学习delphi,所以我希望你们能理解我做了些什么“愚蠢”的事情。

+1

您的“DoIt”事件处理程序查询按钮的标签。在设计表单时,您是否为这些标签分配了一个编号?如果不是,那么标签为0,在“DoIt”中什么都不会发生,因为它预计标签为1,2等。 –

+1

您是否已经完成了任何调试?如果你不知道如何调试,那么你问的是错误的问题。如果你不努力学习调试技能,那么继续努力是毫无意义的。 –

+0

我想知道如何在Delphi中编译'{$ mode objfpc}'。所以我认为这是在拉撒路而不是在德尔福? –

回答

1

您可能没有在窗体上填充按钮的标签属性。查看Tag属性的每个按钮的属性列表。 HitBtn应该有一个标签1.至少有一个其他按钮应该有Tag为2.

+0

是的,你绝对正确。将新按钮的标签设置为3后,将按钮设置为1,将按钮设置为2,现在程序完美运行。因为我仍然在学习简单而基本的东西,所以之前我不知道那个“标签”。那么,我学习新的东西。谢谢。 – Johnny212