C++ Builder構建算二十四點小遊戲

來源:互聯網
上載者:User

 所謂算二十四點可能是不少讀者朋友童年喜歡玩的撲克遊戲之一,玩法是:把一副撲克牌從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是一致的,需要丟棄一個,又要列舉全面,還要考慮到排除掉不可能實現的算術式,此程式的演算法不難理解,關鍵在於算術式的準確。理清楚了演算法,編程是很快的。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.