史萊姆論壇

返回   史萊姆論壇 > 專業主討論區 > 程式語言討論區
忘記密碼?
論壇說明

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


發文 回覆
 
主題工具 顯示模式
舊 2005-06-30, 05:08 PM   #1
不知道
長老會員
榮譽勳章
UID - 548
在線等級: 級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時
註冊日期: 2002-12-06
住址: 桃園
文章: 8606
現金: 1491 金幣
資產: 1183995 金幣
預設 猜數字遊戲程式設計(C++ Builder)

開這個版面希望以小弟的程式設計經驗和大家互相學習,也請大家不吝賜教
[猜數字]遊戲是請猜的人輸入一組四位數的數字,若猜對數字和位置就以"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();
}
若大家有興趣,歡迎一起討論

<未完待續>
__________________
地獄變現記
[人身得來不易,願大家能尊重生命--勿傷胎命][好淫者請好自為之吧--割鳥]
南泉禪師道:
道不屬知,不屬不知。知是妄覺,不知是無記。若真達不疑之道,猶如太虛,廓然蕩豁,豈可強是非邪?」
德山宣鑒禪師:
「如果明白無事,則勿妄求,妄求而得,亦非得也。汝但無事於心,無心於事,則虛而靈,空而妙。若毛端許,言之本末者,皆為自欺。何故?毫氂繫念,三塗業因。瞥爾情生,萬劫羈鎖。聖名凡號,盡是虛聲。殊相劣形,皆是幻色。汝欲求之,得無累乎?」
不知道 目前離線  
送花文章: 5469, 收花文章: 5341 篇, 收花: 24549 次
回覆時引用此帖
舊 2005-06-30, 07:27 PM   #2 (permalink)
註冊會員
榮譽勳章
UID - 79625
在線等級: 級別:13 | 在線時長:235小時 | 升級還需:17小時級別:13 | 在線時長:235小時 | 升級還需:17小時級別:13 | 在線時長:235小時 | 升級還需:17小時
註冊日期: 2003-06-21
VIP期限: 2009-10
文章: 60
精華: 0
現金: 5588 金幣
資產: 10588 金幣
預設

受教了
謝謝樓主
建議樓主可以在標題上加上是用何種語言寫的^^
cocoking 目前離線  
送花文章: 74, 收花文章: 1 篇, 收花: 1 次
回覆時引用此帖
舊 2005-06-30, 07:57 PM   #3 (permalink)
長老會員
榮譽勳章
UID - 548
在線等級: 級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時
註冊日期: 2002-12-06
住址: 桃園
文章: 8606
現金: 1491 金幣
資產: 1183995 金幣
預設

引用:
作者: cocoking
受教了
謝謝樓主
建議樓主可以在標題上加上是用何種語言寫的^^
謝謝您的建議

已經改了(原本有想到,可是沒想到去做 )

< >
不知道 目前離線  
送花文章: 5469, 收花文章: 5341 篇, 收花: 24549 次
回覆時引用此帖
舊 2005-06-30, 10:28 PM   #4 (permalink)
長老會員
榮譽勳章
UID - 548
在線等級: 級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時
註冊日期: 2002-12-06
住址: 桃園
文章: 8606
現金: 1491 金幣
資產: 1183995 金幣
預設

再來輸入判斷既然已經完成
當然就是亂數部分啦
首先將第6行的
String num="5431";
改成
String num;
接著亂數產生時機應該在表單的OnCreat事件
語法:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  int s;
  randomize();
  num=random(10);
  while(1){
    s=random(10);
    for(int i=1;i<=num.Length();i++){
      if(IntToStr(s)==num.SubString(i,1)) {s=0; break;}
    }
    if(s!=0) num=num+IntToStr(s);
    if(num.Length()==4) break;
  }
  ShowMessage(num);
}
加ShowMessage(num);行的目的在於設計時必須掌握住亂數值,以方便除錯,正式啟用時請移除
while{...}是為了防止出現重複數字
好了,大家玩玩看吧!!!
然而大家或許會發現仍有些問題,譬如當您猜對後依然可以繼續猜
這時我們必須修改[我猜(SpeedButton1)]的OnClick事件,如下
語法:
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)) if(i!=j)bn++;
    }
    ListBox1->Items->Add(Edit1->Text+" => "+IntToStr(an)+"A"+IntToStr(bn)+"B");
    if(an==4) {
        ListBox1->Items->Add("猜對了...");
        SpeedButton1->Enabled=false;
        Edit1->Enabled=false;
    }
    Edit1->Text="";
}
當然[重玩(SpeedButton2)]的OnClick事件也需要修改啦,如下
語法:
void __fastcall TForm1::SpeedButton2Click(TObject *Sender)
{
    ListBox1->Clear();
    num="";
    FormCreate(Sender);
    SpeedButton1->Enabled=true;
    Edit1->Enabled=true;
    Edit1->SetFocus();
}
如何?好玩嗎?
下個禮拜再與大家討論利用Socket物件設計可和好友網路對戰吧

< >
不知道 目前離線  
送花文章: 5469, 收花文章: 5341 篇, 收花: 24549 次
回覆時引用此帖
舊 2005-06-30, 10:35 PM   #5 (permalink)
長老會員
榮譽勳章
UID - 548
在線等級: 級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時級別:59 | 在線時長:3787小時 | 升級還需:53小時
註冊日期: 2002-12-06
住址: 桃園
文章: 8606
現金: 1491 金幣
資產: 1183995 金幣
預設

剛剛想到還可以在加入一個功能,就是當使用者按下Enter時等於按下[我猜]
這是利用Edit1的OnKeyPress事件,如下:
語法:
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
{
  if((Key==13)&&(Edit1->Text.Length()==4))SpeedButton1Click(Sender);
}
Key=13代表Enter鍵...

< >
不知道 目前離線  
送花文章: 5469, 收花文章: 5341 篇, 收花: 24549 次
回覆時引用此帖
舊 2005-07-01, 08:57 AM   #6 (permalink)
管理版主
 
mini 的頭像
榮譽勳章
UID - 4144
在線等級: 級別:97 | 在線時長:9858小時 | 升級還需:138小時級別:97 | 在線時長:9858小時 | 升級還需:138小時級別:97 | 在線時長:9858小時 | 升級還需:138小時級別:97 | 在線時長:9858小時 | 升級還需:138小時級別:97 | 在線時長:9858小時 | 升級還需:138小時級別:97 | 在線時長:9858小時 | 升級還需:138小時級別:97 | 在線時長:9858小時 | 升級還需:138小時
註冊日期: 2002-12-07
文章: 13341
精華: 0
現金: 26444 金幣
資產: 3024304 金幣
預設

Thx share ^^

有越來越多版友參與 與分享 很高興
不論是 實例 還是 概念 問題
都歡迎大家提出 ^^
mini 目前線上  
送花文章: 2013, 收花文章: 8001 篇, 收花: 26805 次
回覆時引用此帖
發文 回覆



發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用


所有時間均為台北時間。現在的時間是 08:51 PM


Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.


SEO by vBSEO 3.6.1