山楂串求解器

最近很火的山楂串小游戲桶现,游戲鏈接http://www.wesane.com/game/848/也糊,是一個(gè)合成類的小游戲藤抡,游戲截圖如下所示咏窿。這個(gè)游戲我曾經(jīng)打到過31串碌秸。作為一名程序員荷腊,一個(gè)自然而然的問題就是艳悔,能否寫一個(gè)山楂串求解器打出更高的分?jǐn)?shù)。編寫這樣一個(gè)求解器大概相當(dāng)于leetcode中等難度的題目女仰,但是我想從更多的角度來看這個(gè)問題猜年。

111.jpg
222.jpg

我的第一版代碼是用python寫的,算法就是簡單的暴力求解+剪枝疾忍,包括測試代碼在內(nèi)也就200行出頭乔外。但是我遇到了第一個(gè)問題:程序的性能太低了,完成一次4步運(yùn)算需要的時(shí)間為20s左右一罩。這個(gè)時(shí)間是不可忍受的杨幼,我的期望值是做到秒的量級。于是我進(jìn)行了第一步改進(jìn):多線程聂渊。但出乎我意料的是推汽,python多線程的性能反而降低了。性能數(shù)據(jù)顯示歧沪,python并沒有完全做到多線程歹撒。在網(wǎng)上搜索之后,我發(fā)現(xiàn)問題出在python解釋器的GIL上诊胞。這是一個(gè)全局鎖暖夭,每個(gè)線程只有搶到這個(gè)鎖之后才能執(zhí)行锹杈,從而造成了運(yùn)行時(shí)間不降反升。于是我開始嘗試突破GIL迈着,一個(gè)直觀的方法就是換一個(gè)支持多線程的python解釋器竭望,我選擇了jython,Jython是用java寫的python解釋器裕菠。實(shí)際測試結(jié)果不理想咬清,除了要忍受jython較長的啟動(dòng)時(shí)間,實(shí)際運(yùn)算時(shí)間在12s左右奴潘,這離我的期望還是很遠(yuǎn)旧烧。

隨后我開始考慮換用其他編程語言來完成這件事,我想到了lua画髓,號稱具有python的便利性和接近C的性能掘剪。于是我用lua語言重寫了相關(guān)代碼。Lua的單線程測試結(jié)果為4s奈虾,這個(gè)結(jié)果到達(dá)了我的接受范圍夺谁。在此基礎(chǔ),我再次嘗試編寫多線程的代碼肉微。但是我驚奇的發(fā)現(xiàn)匾鸥,lua也不支持多線程,而是支持所謂的協(xié)程碉纳,其效果與python類似勿负,也是搶占式的執(zhí)行。

事已至此村象,我決定編寫C++的代碼笆环,此前覺得C++的代碼有些難寫,因此一直回避厚者。但為了性能躁劣,還是需要C++的幫助。我用C++重寫了單線程代碼库菲,在使用了-O2的編譯選項(xiàng)之后账忘,C++的測試結(jié)果達(dá)到0.2s。這個(gè)結(jié)果反而再次令我陷入了沉思熙宇,因?yàn)樵谶@個(gè)基礎(chǔ)上進(jìn)行多線程擴(kuò)展鳖擒,可能已經(jīng)沒有多少性能可以繼續(xù)挖掘了。

在實(shí)現(xiàn)CPP的多線程版本時(shí)烫止,發(fā)了幾個(gè)問題蒋荚。一個(gè)是thread對象不能被push進(jìn)vector,只好用thread數(shù)組加flag的方式實(shí)現(xiàn)馆蠕。二是多線程的時(shí)間測量是個(gè)問題期升,測出來的時(shí)間是所有子線程時(shí)間的總和惊奇,這里用std::chrono::system_clock::now()來統(tǒng)計(jì)墻上時(shí)間。三是直接啟動(dòng)了30個(gè)線程播赁,如果能控制系統(tǒng)中一直有8個(gè)線程可能性能會(huì)更好的一點(diǎn)颂郎。最終可以在0.05s內(nèi)計(jì)算4步。

這個(gè)項(xiàng)目到此并沒有結(jié)束容为,我還想繼續(xù)挖掘乓序。

  1. 能否實(shí)現(xiàn)在python中調(diào)用該C++代碼?

  2. 能否實(shí)現(xiàn)OCR和鼠標(biāo)點(diǎn)擊自動(dòng)打游戲坎背?

  3. 使用強(qiáng)化學(xué)習(xí)或者深度學(xué)習(xí)效果如何替劈?

  4. 能夠完成圖形界面,提供更好的游戲體驗(yàn)沼瘫?

相關(guān)代碼已經(jīng)在github開源https://github.com/ExquisiteFunction/shanzhachuan 抬纸,希望有大佬一起來繼續(xù)挖掘這個(gè)小游戲帶來的技術(shù)力咙俩。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末耿戚,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子阿趁,更是在濱河造成了極大的恐慌膜蛔,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,657評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脖阵,死亡現(xiàn)場離奇詭異皂股,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)命黔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,662評論 3 385
  • 文/潘曉璐 我一進(jìn)店門呜呐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人悍募,你說我怎么就攤上這事蘑辑。” “怎么了坠宴?”我有些...
    開封第一講書人閱讀 158,143評論 0 348
  • 文/不壞的土叔 我叫張陵洋魂,是天一觀的道長。 經(jīng)常有香客問我喜鼓,道長副砍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,732評論 1 284
  • 正文 為了忘掉前任庄岖,我火速辦了婚禮豁翎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘隅忿。我一直安慰自己心剥,他們只是感情好启搂,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,837評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著刘陶,像睡著了一般胳赌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上匙隔,一...
    開封第一講書人閱讀 50,036評論 1 291
  • 那天疑苫,我揣著相機(jī)與錄音,去河邊找鬼纷责。 笑死捍掺,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的再膳。 我是一名探鬼主播挺勿,決...
    沈念sama閱讀 39,126評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼喂柒!你這毒婦竟也來了不瓶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,868評論 0 268
  • 序言:老撾萬榮一對情侶失蹤灾杰,失蹤者是張志新(化名)和其女友劉穎蚊丐,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體艳吠,經(jīng)...
    沈念sama閱讀 44,315評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡麦备,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,641評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了昭娩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凛篙。...
    茶點(diǎn)故事閱讀 38,773評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖栏渺,靈堂內(nèi)的尸體忽然破棺而出呛梆,到底是詐尸還是另有隱情,我是刑警寧澤迈嘹,帶...
    沈念sama閱讀 34,470評論 4 333
  • 正文 年R本政府宣布削彬,位于F島的核電站,受9級特大地震影響秀仲,放射性物質(zhì)發(fā)生泄漏融痛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,126評論 3 317
  • 文/蒙蒙 一神僵、第九天 我趴在偏房一處隱蔽的房頂上張望雁刷。 院中可真熱鬧,春花似錦保礼、人聲如沸沛励。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,859評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽目派。三九已至坤候,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間企蹭,已是汗流浹背白筹。 一陣腳步聲響...
    開封第一講書人閱讀 32,095評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谅摄,地道東北人徒河。 一個(gè)月前我還...
    沈念sama閱讀 46,584評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像送漠,于是被迫代替她去往敵國和親顽照。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,676評論 2 351

推薦閱讀更多精彩內(nèi)容