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