試著自己寫了個24點游戲,如有改進或者不對的地方請指出。
基本知識:
游戲規(guī)則很簡單,就是利用加減乘除將撲克牌的任一4張牌的組合,運算后得到結(jié)果24.
界面用Qt完成后
界面沒有多下功夫,可以添加時間提醒,修改目標數(shù)值(24),增加牌數(shù)應(yīng)該也是可以的,不過我沒有去試一下。感覺花哨了沒有簡單來的好一些。
next會生成新的牌。answer查看答案。
牌的數(shù)值使用QlineEdit做的,可以自己設(shè)置值。
CardCalculation類會根據(jù)輸入的牌數(shù)(vector<double>)計算出響應(yīng)的表達式。
計算流程:
數(shù)據(jù)結(jié)構(gòu)的書還沒看完,算法完全是自己憑空去試。最后寫出來后其實也不知道自己再考慮這方便問題時思路怎么展開。盡快抽時間看下算法的書才行。
我們拿※作為任意的操作符(+-*/)來說明。
根據(jù)vec元素個數(shù):
1. a※b,直接計算即可。
2. a※b※c,可能操作為:
(a※b)※c
a※(b※c)
3. a※b※c ※d,可能操作為:
(a※b)※c ※d
a※(b※c) ※d
a※b※(c ※d)
因此采用遞歸求解,好處是如果增加牌的張數(shù)時應(yīng)該容易修改一些,具體實現(xiàn)函數(shù)為calCards。
剛傳進vec時,大小為4,屬于第三種情況。遍歷vec,將可能操作后形成的新的vector再次作為函數(shù)參數(shù)傳入,直到遇到1情況返回,如果滿足返回true,否則返回false。返回true時,修改第二個參數(shù)保存表達式。
關(guān)于如何返回表達式這里我弄了很長時間。計算出正確的表達式后,每次遞歸都會加一對括號,其實后面應(yīng)該可以對表達式優(yōu)化下可能減少括號的數(shù)量,不過我沒有寫。
程序里都寫了注釋~如果還是有問題請給我留言J /Files/izualzhy/TwentyFourGame.rar