所謂算二十四點可能是不少讀者朋友童年喜歡玩的撲克遊戲之一,玩法是:把一副撲克牌從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)
4.求解過程:
求解for(j=1;j<=45;j++)
}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)
} 小結:
值得注意的是在羅列算術式時既要避免重複,如a+b×c+d與a×b+c+d是一致的,需要丟棄乙個,又要列舉全面,還要考慮到排除掉不可能實現的算術式,此程式的演算法不難理解,關鍵在於算術式的準確。理清楚了演算法,程式設計是很快的。
C Builder構建算二十四點小遊戲
所謂算二十四點可能是不少讀者朋友童年喜歡玩的撲克遊戲之一,玩法是 把一副撲克牌從a到10選出來均分成兩份,兩個小朋友各持乙份即可開始遊戲,每人隨機抽兩張出來組成四張牌,把這四張牌加減乘除湊成結果為二十四,先算出來的一方贏得對方的兩張牌,進行下一輪,如果都沒計算出來為和局,直到把對方所有的撲克牌全部繳...
C Builder構建算二十四點小遊戲
所謂算二十四點可能是不少讀者朋友童年喜歡玩的撲克遊戲之一,玩法是 把一副撲克牌從a到10選出來均分成兩份,兩個小朋友各持乙份即可開始遊戲,每人隨機抽兩張出來組成四張牌,把這四張牌加減乘除湊成結果為二十四,先算出來的一方贏得對方的兩張牌,進行下一輪,如果都沒計算出來為和局,直到把對方所有的撲克牌全部繳...
C Builder構建算二十四點小遊戲
所謂算二十四點可能是不少讀者朋友童年喜歡玩的撲克遊戲之一,玩法是 把一副撲克牌從a到10選出來均分成兩份,兩個小朋友各持乙份即可開始遊戲,每人隨機抽兩張出來組成四張牌,把這四張牌加減乘除湊成結果為二十四,先算出來的一方贏得對方的兩張牌,進行下一輪,如果都沒計算出來為和局,直到把對方所有的撲克牌全部繳...