開這個版面希望以小弟的程式設計經驗和大家互相學習,也請大家不吝賜教
[猜數字]遊戲是請猜的人輸入一組四位數的數字,若猜對數字和位置就以"A"表示,若數字對,位置不對則以"B"表(小弟小時候很喜歡玩)
以下是小弟表單的排列:
語法:
object Form1: TForm1
Left = 192
Top = 107
BorderStyle = bsDialog
Caption = '猜數字'
ClientHeight = 163
ClientWidth = 233
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object SpeedButton1: TSpeedButton
Left = 16
Top = 56
Width = 73
Height = 25
Caption = '我猜'
Flat = True
OnClick = SpeedButton1Click
end
object SpeedButton2: TSpeedButton
Left = 16
Top = 88
Width = 73
Height = 25
Caption = '重來'
Flat = True
OnClick = SpeedButton2Click
end
object SpeedButton3: TSpeedButton
Left = 16
Top = 128
Width = 73
Height = 25
Caption = '離開'
Flat = True
OnClick = SpeedButton3Click
end
object Edit1: TEdit
Left = 8
Top = 8
Width = 89
Height = 40
Font.Charset = ANSI_CHARSET
Font.Color = clWindowText
Font.Height = -27
Font.Name = 'Fixedsys'
Font.Style = []
MaxLength = 4
ParentFont = False
TabOrder = 0
OnChange = Edit1Change
end
object ListBox1: TListBox
Left = 104
Top = 8
Width = 121
Height = 145
ItemHeight = 13
TabOrder = 1
end
end
接下來先暫時設定一個值
請在上面第6行TForm1 *Form1;
加一段程式碼
String num="5431";
在設計初,若程式有些是屬於亂數控制的值,您可以先將他設成固定值,這樣除錯會比較方便
再來就是當使用者資料輸入完後按下[我猜]按鈕時的程式碼
語法:
void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
{
int an=0,bn=0;
for(int i=1;i<=4;i++){
if(Edit1->Text.SubString(i,1)==num.SubString(i,1)) an++; //位置與數字均正確的數量
for(int j=1;j<=4;j++)
if(Edit1->Text.SubString(i,1)==num.SubString(j,1)) bn++; //只有數字正確的數量
}
ListBox1->Items->Add(Edit1->Text+" => "+IntToStr(an)+"A"+IntToStr(bn)+"B"); //將結果顯示在ListBox1裡
if(an==4) ListBox1->Items->Add("猜對了..."); /若是數字位置全對的數目有4組,表示猜對了
Edit1->Text="";
}
這樣設計應該不成問題,不過當使用者淘氣一點輸入"1111"時,竟然變成"1A4B"(B多加了一次)
主要原因是
if(Edit1->Text.SubString(i,1)==num.SubString(j,1)) bn++;多加了一次...
應該改成if(Edit1->Text.SubString(i,1)==num.SubString(j,1))
if(i!=j)bn++;(判對若位置不同才相加)
不過對於輸入我們也不允許使用者輸入重複的數字,所以我們必須追加限制
當然加在TEdit的OnChange事件
語法:
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
for(int i=1;i<Edit1->Text.Length();i++)
if(Edit1->Text.SubString(Edit1->Text.Length(),1)==Edit1->Text.SubString(i,1)){
Edit1->Text=Edit1->Text.Delete(Edit1->Text.Length(),1);
Edit1->SelStart=Edit1->Text.Length();
}
}
這樣當使用者每輸入一個字,就會跟前面的做比較,若已經有了,就清除掉
再來剩下[重來]與[關閉]的按鈕
目前是這樣設計的
[重來]按鈕
語法:
void __fastcall TForm1::SpeedButton2Click(TObject *Sender)
{
ListBox1->Clear();
}
[關閉]按鈕
語法:
void __fastcall TForm1::SpeedButton3Click(TObject *Sender)
{
Close();
}
若大家有興趣,歡迎一起討論
<未完待續>