2017-01-02 21 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

私はミスをしますか?私はちょうどデルファイを学び始めているので、私はあなたが何か「愚かな」ことをすれば理解できると思う。

+1

"DoIt"イベントハンドラは、ボタンのタグを照会します。フォームをデザインするときに、これらのタグに番号を割り当てましたか?そうでなければ、タグは0であり、タグが1,2などであることを期待しているため、DoItでは何も起こりません。 –

+1

デバッグは完了しましたか?あなたがデバッグする方法がわからない場合は、間違った質問をしています。デバッグのスキルを学ぶために激しい努力をしていなければ、あなたの努力を続けるのは無意味です。 –

+0

'{$ mode objfpc}'がどのようにコンパイルされているのだろうか?だから私はこれがLazarusにあり、Delphiではないと仮定していますか? –

答えて

1

フォームのボタンのタグプロパティを入力していない可能性があります。 Tagプロパティの各ボタンのプロパティのリストを参照してください。 HitBtnのタグは1である必要があります。少なくともTagの2つのボタンがあります。

+0

ええ、あなたは絶対に正しい。新しいボタンのタグを3に設定した後、ボタンを1に合わせ、ボタンを2にすると、プログラムは完全に機能します。私はまだ単純で基本的なことを学んでいるので、前にその "タグ"について私は知らなかった。まあ、私は新しいことを学ぶ。ありがとうございました。 – Johnny212

関連する問題