網站建設| 數據庫類| 圖形圖象| 程序設計| 現代辦公| 操作系統| 考試認證| 網絡技術| 軟件工程| 電腦相關| 文學作品
網站開發| 網頁制作| 操作系統| 圖象圖形| 考試認證| 數據庫類| 程序設計| 硬件技術| 現代辦公| 網絡技術| 笑話頻道
 
您的位置: 電腦書庫首頁-> 電腦文摘-> 程序設計-> C++Builder-> C++ Builder構建算二十四點小游戲

C++ Builder構建算二十四點小游戲
作者:佚名 來源:InterNet 加入時間:2005-1-28
相關文章
  • 用C++ Builder實現桌布自動更新
  • 用C++ Builder開發多層數據庫應用程序
  • C++ Builder中消息處理過程及應用
  • 用C++ Builder創建數字簽名
  • C++ Builder下數據庫報表Master/Detail關系功能的實現
  • 用C++ Builder實現網絡連接檢測程
  • 相關書籍:
  • C++ Builder 5.0經典入門
  • C++ Builder 3 核心編程技術
  • 所謂算二十四點可能是不少讀者朋友童年喜歡玩的撲克游戲之一,玩法是:把一副撲克牌從A到10選出來均分成兩份,兩個小朋友各持一份即可開始游戲,每人隨機抽兩張出來組成四張牌,把這四張牌加減乘除湊成結果為二十四,先算出來的一方贏得對方的兩張牌,進行下一輪,如果都沒計算出來為和局,直到把對方所有的撲克牌全部繳獲,游戲方告結束。

      想要自己算的最快嗎?那最好是讓程序來替你做個二十四點王。

      用程序實現二十四點的算法很多,但大都比較繁雜。考慮到湊出結果的可能情況并不是太多,在這里我們將主要靠自己窮舉可能的演算式外加循環計算來實現。

      一、四張牌的排列組合

      四張牌A B C D共有多少種排列組合?公式為P44,即1×2×3×4=24共24種組合。

      為什么要把四張牌的所有排列組合都羅列出來呢?因為我們將要采用的算法簡單說就是:窮舉所有算術式,比如A+B+C+D、A+B+C-D等等,讓每一個算術式的四個變量都去排列組合一次,尋找是否存在一個排列組合使算術式的值為24。舉個例子A+B+C-D:

      把四張牌(四個變量)放入表2的(Pos.1、Pos.2、Pos.3、Pos.4)四個位置中去,總共應該有24種放置方法。

      如果在表3內找到一個公式使A+B+C-D的值等于24,則打印出此算術式,否則說明此算術式不滿足需要,再進行下一個算術式的變量的排列組合。如果窮舉所有的算術式都不能滿足要求,那么表示此題無解。

      一、窮舉所有算術式

      這個工作比較煩瑣,但很考驗你的邏輯演算能力。筆者按加、減、乘、除、括號的順序基本羅列完了所有算術式,表4—表6只羅列了一部分,剩下的讀者可以自己來完成:

      二、制作游戲

      有了前面的基礎后,開始編程。筆者在這里使用的是Borland C++ Builder,下面簡單介紹一下制作流程并講解其中的難點:

      1.動手設計一個人性化的界面。

      2.程序編制流程:

      不管是手動輸入四個數還是隨機產生,都把這四個數值存儲起來,然后進行求解。求解時遵循這樣的規律:這里共有45種算術式(包括無解),從第一個算術式開始不斷調用排列組合,如果成立(結果為24),退出求解過程并輸出結果,不成立則嘗試下一個算術式,直到最后一個算術式的調用,如果都不滿足則打印無解。

      3.隨機產生數字:

      產生四個數,一種方式是手動錄入,一種方式是隨機產生,這里只給出隨機產生數字的代碼:(程序里的變量沒作說明均為全局變量)

    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    flag=false;
    randomize();
    NumberA=random(10)+1;
    NumberB=random(10)+1;
    NumberC=random(10)+1;
    NumberD=random(10)+1;
    Edit1->Text=FloatToStr(NumberA);
    Edit2->Text=FloatToStr(NumberB);
    Edit3->Text=FloatToStr(NumberC);
    Edit4->Text=FloatToStr(NumberD);
    Button4->SetFocus();
    }

      4.求解過程:

    ////////////求解
    for(j=1;j<=45;j++)
    {
    switch(j)
    {
    ///////////////
    case 2://對應表4的第二種情況
    for(i=1;i<=24;i++)//注意case1只循環1次,因為四個變量求和不必考慮變量的位置
    {
    kind(i);//調用子函數
    answer=A+B+C-D;
    if(answer==24)
    {
    flag=true; //設置標志
    result=FloatToStr(A)+"+"+FloatToStr(B)+"+"+FloatToStr(C)+"-"+FloatToStr(D)+"=24";
    Label1->Caption=result;
    Label1->Visible =true;
    break;
    }
    }
    if(flag==true)break;//退出switch
    ……………………//余下的求解算術式的方法與case2相似,這里就不重復了。
    case 45:
    flag=true;
    result="無解";
    Label1->Caption=result;
    Label1->Visible =true;
    break;
    if(flag==true)break;
    //////////////////////
    /////////////////////
    }
    if(flag==true)//退出循環
    break;
    }

      子函數:

    int kind(int k)
    {
    switch(k)//排列組合4個數,對應表1
    {
    case 1:A=NumberA;B=NumberB;C=NumberC;D=NumberD;break;
    case 2:A=NumberA;B=NumberB;D=NumberC;C=NumberD;break;
    case 3:A=NumberA;C=NumberB;B=NumberC;D=NumberD;break;
    case 4:A=NumberA;D=NumberB;B=NumberC;C=NumberD;break;
    ……
    case 22:D=NumberA;B=NumberB;A=NumberC;C=NumberD;break;
    case 23:D=NumberA;B=NumberB;C=NumberC;A=NumberD;break;
    default:D=NumberA;C=NumberB;B=NumberC;A=NumberD;
    }
    }

      小結:

      值得注意的是在羅列算術式時既要避免重復,如A+B×C+D與A×B+C+D是一致的,需要丟棄一個,又要列舉全面,還要考慮到排除掉不可能實現的算術式,此程序的算法不難理解,關鍵在于算術式的準確。理清楚了算法,編程是很快的。

    [文章錄入員:nancy]

    相關文章
  • 用C++ Builder實現桌布自動更新
  • 用C++ Builder開發多層數據庫應用程序
  • C++ Builder中消息處理過程及應用
  • 用C++ Builder創建數字簽名
  • C++ Builder下數據庫報表Master/Detail關系功能的實現
  • 用C++ Builder實現網絡連接檢測程
  • 相關書籍:
  • C++ Builder 5.0經典入門
  • C++ Builder 3 核心編程技術
  • 本站推薦內容

    近期主機類熱搜關鍵詞:
    美國服務器 美國服務器租用 海外服務器租用 國外服務器租用

    C++Builder
    C/C++/VC
    C++Builder
    Basic/VB類
    Delphi/Pascal
    Java編程
    FORTRAN
    其它
    電腦教程閱讀排行
    ·模擬鍵盤按鍵 自動輸入文字
    ·在C++Builer中多線程的實...
    ·C++ Builder構建算二十...
    ·C++ Builder中消息處理...
    ·用C++ Builder實現桌布...
    ·用C++ Builder實現網絡...
    ·用C++ Builder開發多層...
    ·用C++Builder 建立數據...
    ·用BCB開發有身份認證功能的Em...
    ·個性凸現的動畫 特技效果
    福建22选5号码走势图