資訊內(nèi)容
Scratch第65講:24點(diǎn)小游戲-想象版
什么是想象版,就是CC哥光用腦子想了,沒(méi)有真的編程!是不是有點(diǎn)尷尬,不過(guò)CC哥以后還是會(huì)抽時(shí)間把程序?qū)懗鰜?lái)的,大家放心。不過(guò)這一講里可真的是只有想象,沒(méi)有代碼。
相信大家都玩過(guò)24點(diǎn),CC哥就特別不擅長(zhǎng)24點(diǎn),我覺(jué)得24點(diǎn)就是跳躍思維的一種能力,能夠迅速的嘗試不同的算法,就是經(jīng)驗(yàn)加跳躍思維的能力。CC哥的邏輯思維能力很強(qiáng),但是跳躍思維確實(shí)不夠,而跳躍思維往往也是人生發(fā)展過(guò)程中的一個(gè)重要能力。因?yàn)樘S思維往往能幫助你打破現(xiàn)有的思維框架,找到另辟蹊徑的解決方案。不論是搞科研,做生意,甚至玩金融,跳躍思維都是你致勝的一個(gè)有力武器。
不說(shuō)廢話,CC哥今天想用腦子想想編一個(gè)Scratch的24點(diǎn)游戲,兩個(gè)關(guān)鍵詞:一是用計(jì)算機(jī)來(lái)算24點(diǎn),一是用腦子想,而不是動(dòng)手做。
之所以用腦子想,而不是上來(lái)就動(dòng)手,是想告訴大家,知道怎么做,比動(dòng)手做要重要很多。讓我們一起來(lái)嘗試一下這個(gè)思維的旅程吧。
用計(jì)算機(jī)來(lái)做24點(diǎn),首先就要限定好條件,編程是嚴(yán)謹(jǐn)?shù)模瑳](méi)有邊界,那么就沒(méi)有程序。我們平時(shí)做事情的時(shí)候,往往會(huì)忽略一些條件,其實(shí)條件是真實(shí)存在的,只是因?yàn)槭浅WR(shí),我們把他忽略而已。比如如果我問(wèn)你早上醒來(lái)第一件事是什么?有人說(shuō)起床,有人說(shuō)上廁所,有人說(shuō)洗臉?biāo)⒀?,五花八門(mén)的答案,但實(shí)際上醒來(lái)的第一件事是睜眼!但是因?yàn)楸犙凼浅WR(shí),common sense,所以很多人就把它忽略了。而計(jì)算機(jī)不行,他需要我們?cè)谧雒恳粋€(gè)程序的時(shí)候,都要先做第一件事,把邊界確定下來(lái),如果不這樣做,你的程序就可能有bug了,想象一下,早上醒來(lái),你閉著眼去上廁所,刷牙會(huì)有什么后果。
如果想免費(fèi)獲得CC哥的講座中的程序代碼以及游戲素材,可以通過(guò)掃描二維碼關(guān)注《跟我學(xué)Scratch編程》,然后點(diǎn)擊獲取代碼即可。
24點(diǎn)的編程邊界是什么:先確定規(guī)則:
1:數(shù)字,我們只做1~10。(其實(shí)也可以做到K,無(wú)非是多算幾種組合,計(jì)算機(jī)也沒(méi)所謂的)
2:運(yùn)算方法,我們只用加減乘除(除法只算整除)的四則運(yùn)算的整數(shù)運(yùn)算。(排除乘方開(kāi)方以及分?jǐn)?shù)運(yùn)算)
限定這兩個(gè)條件是因?yàn)椋@是我們正常經(jīng)常玩24點(diǎn)的規(guī)則,另外編程也相對(duì)簡(jiǎn)單些。
有了規(guī)則,那么最關(guān)鍵的問(wèn)題來(lái)了,算法呢?計(jì)算機(jī)該用什么方法來(lái)算呢?
如果是人,通常這會(huì)我們首選用的是經(jīng)驗(yàn)和技巧,這里面有一些固定的思路:
常規(guī)的比如:
3*8=24,4*6=24,2*12=24,24*1=24。
頻率略低一些的:
25-1=24,23+1=24,22+2=24,15+9=24,28-4=24,36-12=24。
有了這個(gè)思路,再想辦法把四個(gè)數(shù)字盡量往上面的去靠,看能不能找到解。
但是計(jì)算機(jī)不會(huì)象人一樣思考,計(jì)算機(jī)最厲害的就是速度快,但是并不聰明,所以計(jì)算機(jī)就用最笨的方法來(lái)做,窮舉法!把所有的組合都來(lái)一遍,就知道答案了。
根本宗旨知道了,那么窮舉法怎么做呢?仔細(xì)思考,其實(shí)這就是一種排列組合的窮舉,只不過(guò)就是一種相對(duì)有些復(fù)雜的排列組合,如果把這個(gè)排列組合的方法想清楚了,那么程序就很容易編了。
24點(diǎn)的組合方法看似很亂,其實(shí)還是有規(guī)律的,首先:
1:24點(diǎn)最終是由兩個(gè)數(shù)字運(yùn)算得來(lái)的,我們假定是A和B。
2:那么A和B的任意一個(gè)數(shù)字,要么是4個(gè)初始數(shù)字之一,要么是其中兩個(gè)數(shù)字,或是3個(gè)數(shù)字運(yùn)算得來(lái)的,我們假定這個(gè)由三個(gè)數(shù)字運(yùn)算得來(lái)的數(shù)字是C。
3:C如果是由3個(gè)數(shù)字運(yùn)算得來(lái),那么這個(gè)C也可以理解成其實(shí)是由2個(gè)數(shù)字運(yùn)算得來(lái)的,其中一個(gè)是初始數(shù)字,另一個(gè)是另外兩個(gè)初始數(shù)字運(yùn)算得來(lái)的。
理解了之后,我們就可以考慮用程序怎么實(shí)現(xiàn)這種算法了:
1:給出的四個(gè)數(shù)字中,首先調(diào)出兩個(gè)數(shù)字來(lái),由這兩個(gè)數(shù)字進(jìn)行加減乘除所有運(yùn)算,再把得出的數(shù)字跟剩余的兩個(gè)數(shù)字組成三個(gè)數(shù)字。
這樣一共會(huì)得到多少組是3個(gè)數(shù)字呢?48組!
解:4個(gè)數(shù)字取兩個(gè)有多少種取法呢?小學(xué)學(xué)奧數(shù)的就知道,用C(4,2)的公式做,C(4,2)=A(4,2)/A(2,2),答案就是6種。但是考慮到取出來(lái)的數(shù)字,減法和除法還是有順序的,所以取出來(lái)的兩個(gè)數(shù)也需要考慮順序,所以還要乘以2。所以一共有12種??紤]到取出來(lái)的數(shù)字要進(jìn)行加減乘除4種運(yùn)算,那么我們一共得到48組三個(gè)數(shù)字,所以我們的問(wèn)題就變成了如何把這12種三個(gè)數(shù)字來(lái)通過(guò)運(yùn)算得到24的結(jié)果。
2:如果只有三個(gè)數(shù)字,我們?cè)撛趺醋瞿??還是取出任意的兩個(gè)數(shù)字,進(jìn)行加減乘除的所有運(yùn)算,再把得到的數(shù)字跟剩下的一個(gè)數(shù)字組成兩個(gè)數(shù)字。
這樣一組3個(gè)數(shù)字可以得到多少組2個(gè)數(shù)字呢?24組!
解:一樣的C(3,2),答案是3,考慮取出的兩個(gè)數(shù)的順序再乘以2,所以可以有6種取法,然后考慮到加減乘除,那么就是24組2個(gè)數(shù)字。
3:如果只有兩個(gè)數(shù)字該怎么辦呢?
到這一步就只有兩種情況了,要么A和B做一遍加減乘除,或者反過(guò)來(lái)B和A再做一遍加減乘除。所以一共有8種可能,如果8種可能中有得到24的運(yùn)算結(jié)果,那么就成功,但是如果沒(méi)有得到24的運(yùn)算結(jié)果。
所以一共也就是48*24*8了,一共有這么多種情況有機(jī)會(huì)組成24的運(yùn)算結(jié)果。這對(duì)計(jì)算機(jī)是很小的計(jì)算量了,秒算!
現(xiàn)在大家對(duì)編程思路已經(jīng)比較清楚了,那么用什么技巧呢?
1:用自定義命令的嵌套組合
2:取隨機(jī)數(shù)的技巧
技巧有了,那效果呢?
1:24點(diǎn)肯定用撲克牌來(lái)表現(xiàn)啦。所以需要在網(wǎng)上找找撲克牌的造型。
2:顯示答案可以用個(gè)角色去說(shuō)出答案,也可以用個(gè)列表變量顯示,或者做漂亮點(diǎn),用造型來(lái)表現(xiàn)的漂亮些。
該想的都想差不多了,就剩動(dòng)手做了,要不大家自己也動(dòng)手做做試試。
不過(guò)事先說(shuō)好,可能CC哥想的有bug,CC哥也不知道,只有過(guò)幾天CC哥編程驗(yàn)證了才知道哈。
聲明:本文章由網(wǎng)友投稿作為教育分享用途,如有侵權(quán)原作者可通過(guò)郵件及時(shí)和我們聯(lián)系刪除
