最近在公司新接了乙個遊戲的修改任務。遊戲名字叫《彩色泡泡》。主要是參考經典的泡泡龍實現的。這個遊戲從接手到修改,走了很多彎路。我修改後的**簡直是慘不忍睹。也許再過一段時間我看自己的**,可能會說「靠,哪個
sb寫的**
」。所以寫這份文件一是對我**的乙個補充,二是對泡泡龍出現的演算法自己做乙個小小的總結。
言歸正傳,泡泡龍的主要演算法有下面幾個:
1、發射泡泡的運動軌跡。
2、發射泡泡的碰撞檢測。
3、發射泡泡運動停止的後的位置定位。
4、泡泡的自動消除。
5、泡泡的掉落。下面就這
5個演算法,一一簡單介紹演算法的實現。
發射泡泡的運動軌跡。發設泡泡的運動軌跡主要是根據發射前泡泡的角度與初始化的發射速度來確定泡泡的運動軌跡。需要注意兩個問題:一是發射速度不能過小,不然泡泡移動緩慢。二是移動的過程需要慢慢移動,比如在y
方向上每次移動的距離為
20,那麼就可以分成
20次,每次移動
1個距離,否則會由於移動速度的過大,導致碰撞檢測有較大的偏差。
發射泡泡的碰撞檢測。碰撞檢測是泡泡龍中的乙個核心演算法。如果碰撞做的不好,會發現泡泡從靜止的泡泡上穿過去了,進而對泡泡的定位造成影響,使得泡泡定位的時候或出現泡泡重疊的現象。這會給使用者造成非常不好的影響。
移動的泡泡在什麼時候會與螢幕上的泡泡相撞呢?我們可以把泡泡抽象成乙個圓。圓與圓之間的關係有下面種:相離,外切,相交,內切,內含。很顯然,如果泡泡如要相撞,必須要泡泡之間相交(相交的時候就必須把泡泡停止,然後修正位置,所以不考慮內切)。如果兩圓心距用d
來表示,兩圓的半徑分別用
r,r(r≧
r)來表示。
根據初中學的幾何知識即可知,如果兩元圓相交,其圓心之間的距離小於他們的半徑之和,大於他們之間的半徑之差。即當r-r時,兩圓相交。使用此方法與螢幕中的泡泡逐一進行碰撞檢測。這樣,就完成了對泡泡的碰撞檢測。
發射泡泡運動停止的後的位置定位。考慮這個問題之前,必須要知道如果發射泡泡與與螢幕上的一泡泡進行碰撞,它跟被碰撞的泡泡的關係。發射的泡泡必然在被碰撞泡泡的周圍的六個位置,如下圖所示。(發射的泡泡為紅色泡泡,被碰撞的泡泡為綠色)。
發射泡泡位於被碰撞的泡泡同一列或下一列情況很常見所以很容易理解,但位於被碰撞泡泡的上一列也是有可能的。當發射泡泡與被碰撞泡泡的上部分發生碰撞的時候就會是這樣的情況。
泡泡的自動消除。泡泡龍遊戲的核心規則是當發射泡泡定位以後如果跟三個或三個以上相連的泡泡同色,那麼就可以進行消除。很顯然,這個可以使用遞迴來優雅而又簡單的解決。從新放上去的泡泡開始,檢查跟那個新泡泡相切的四周的泡泡,如果有同色的泡泡,將泡泡的狀態設為bubble_can_pop
,然後繼續檢查被標為
bubble_can_pop
四周的泡泡是否與它同色,如果同色,也將它標為
bubble_can_pop
……如果被標為
bubble_can_pop
的數目大於
3,那麼滿足消除條件。否則,需要將狀態還原。
泡泡的掉落。如果泡泡發生消除,可能由於一些泡泡失去「連線點」而導致泡泡掉落。當然,最頂部的泡泡的「連線點」是永遠都不會失去的。因為他的連線點是頂部的牆壁,而其他泡泡的連線點只能是依附在其他泡泡之上。所以,當泡泡消除這個動作完成之後,我們檢查所有的泡泡通過泡泡之間的聯絡而與上面一排的泡泡是否相連。只要與上面一排的任何乙個泡泡相連,那麼該泡泡就不會掉落。反之,該泡泡就會掉落。所以,我們迴圈上面一排所有的泡泡,使用遞迴的方法把跟上面泡泡直接相連或間接相連的泡泡的狀態標記為bubble_link_to_top
,然後理所當然的,未標記為
bubble_link_to_top
就是失去連線點的泡泡。
整個泡泡龍演算法基本介紹完畢。最後兩個演算法都是使用遞迴的方法。尤其要注意遞迴的出口。整個演算法基本由同事提供,自己做了一定的修正。有興趣的可以討論。
用python實現詞語接龍遊戲
由於剛學python沒幾天,又是很簡單的乙個程式,沒有用到物件導向的方法 其實是還沒有學會 通過簡單的過程實現了。幾點說明 為了防止總是重複的回答,電腦先是在庫中找到全部符合條件的詞語,然後隨機選乙個回答。採用tkinter作為gui,曾在vs code下消除了每乙個警告,所以import時把每乙個...
演算法實現自動掃雷遊戲
1.遊戲的構思 2.演算法偽 的實現 3.演算法的實現 1.首先需要建立起遊戲的整個框架 棋盤的繪製,地雷的生成,基本函式的實現等 2.構思ai演算法的大概樣貌 先嘗試寫偽碼 voidai ai演算法 if first selectrandompos 遊戲開始隨機選擇一處位置翻開 selectpos...
2048小遊戲主要演算法實現
描述 2048是一款最近較為流行的數字遊戲,很多同學在課堂上研究如何得到更高的積分,以至影響了學習效果,不如自己寫下這款遊戲吧,這樣估計也就沒有玩的興趣了。遊戲的規則是 給定乙個4 4的方格,開始的時候只有若干個2,每次可以選擇上下左右其中乙個方向去滑動,每滑動一次,所有的數字方塊都會往滑動的方向靠...