Android-貪吃蛇小遊戲-分析與實現-Kotlin語言描述

來源:互聯網
上載者:User

標籤:java   就是   小遊戲   hlist   通用   大小   otl   draw   實現   

Android-貪吃蛇小遊戲-分析與實現-Kotlin語言描述Overview

本章的主要的內容是貪吃蛇小遊戲的分析和實現,關於實現的具體代碼可以在,文章底部的github的連結中找到。

整個遊戲通過通過在,View不斷的繪製實現的。

先看看

分析有哪些遊戲對象

毫無疑問,不管Kotlin還是Java都是物件導向程式設計語言,那麼我們要實現貪吃蛇遊戲的第一步就是要分析遊戲中有哪些對象,已有將對象都分析完全了,我們再能進行開發,從中我們可以發現最少有兩個對象。

  • 食物,貪吃蛇吃到食物後會增長
  • 貪吃蛇, 可以明顯的看出來貪吃蛇是由一個個小方塊組成的,那麼其中每一個方塊就是一個對象,將所有的方塊對象放入一個集合中,這個集合就組成了貪吃蛇。集合的第一個元素就是 蛇頭為了以示區別,將蛇頭使用了不同的顏色跟身體區分出來。
  • 提取父類,不管是組成貪吃蛇的塊還是食物對象,本質上都是遊戲對象,那麼我們可以將這兩個對象提取取來一個公用的父類,在父類中定義通用的屬性和方法。

Well,不管是貪吃和還是食物,都是需要繪製出來的,那麼一提到繪製那麼就不得不提到座標了,座標的計算是相當繁瑣且容易出錯的,那麼我們得想辦法將座標給抽象一下。從遊戲的樣本圖我們我們可以發現,所有的遊戲對象都是可以通過一個行的索引,和一個類的索引來確定的二維的單層式結構,那麼我們就可以將本來的座標抽象成行列結構。到這裡公用父類的成員那就基本上就可以確定了,同時我們的類的結構也可以確定了。抽取出來的類的結構如下。

/** * 貪吃蛇遊戲中所有遊戲的父類,所有的遊戲對象都將會從此類繼承 * */open class GameObject(var row: Int, var column: Int) {    /**     * 繪製遊戲對象     * @param canvas 畫布對象     * @param paint 畫筆對象     * */    open fun draw(canvas: Canvas, x: Float, y: Float, paint: Paint) {        canvas.drawRect(x, y, x + SnakeGameConfiguration.GRID_WIDTH, y + SnakeGameConfiguration.GRID_HEIGHT, paint)    }}/** * 貪吃蛇吃的食物 * */class Food(row: Int, column: Int) : GameObject(row, column) {    override fun draw(canvas: Canvas, x: Float, y: Float, paint: Paint) {        val gw = SnakeGameConfiguration.GRID_WIDTH        val gh = SnakeGameConfiguration.GRID_HEIGHT        canvas.drawCircle(x + (gw / 2), y + (gh / 2), gw / 2, paint)    }}/** * 因為蛇的組成是塊狀的,此對象就是組成蛇的塊 * */class SnakeBlock(row: Int, column: Int, val isHead: Boolean) : GameObject(row, column) {}
抽取遊戲的配置參數

在貪吃蛇的遊戲中,地圖的長度是固定的(也就是 的數量是固定的),每一個遊戲對象的寬度和高度是根據View的大小和行和列的數量來計算的。這些值我們都可以儲存為全域的變數,方便以後修改和調用。

object SnakeGameConfiguration {    var GRID_WIDTH = 0F    var GRID_HEIGHT = 0F    val GAME_COLUMN_COUNT = 20    val GAME_ROW_COUNT = 20}
貪吃蛇是如何移動的

這個邏輯在貪吃和遊中算是個痛點,因為貪吃蛇是可以多次拐彎的,移動蛇頭的實現思路如下。

  1. 首先從蛇的尾部開始,向前一個組成蛇的塊的對象的位置移動
  2. 然後倒數第二個想倒數第三個的位置移動,依次類圖
  3. 到蛇頭的位置以後,那麼根據移動的方向移動蛇頭

當移動了貪吃蛇的位置以後就可以進行碰撞檢測了

碰撞檢測

對於有序對象的碰撞檢測分為三種情況, 至於如何碰撞檢測只需要檢測行和列是否超出遊戲地圖範圍,或者是否是與其他的遊戲對象重合即可。

  1. 貪吃蛇超出地圖的邊界-可以看做為撞牆
  2. 貪吃和吃到自己
  3. 貪吃蛇遲到食物,需要將貪吃蛇的長度+1,即在蛇的尾部在增加一個組成蛇的塊

對於上面的三種情況我們可以提取出來兩個回呼函數

interface OnCrashListener {    fun onCrash()}/** * 貪吃蛇吃到食物的回調 * */interface OnEatenFoodListener {    fun onEaten()}
源碼下載

剩下一些比較簡單的地方,也就沒再文章中講解,大家可以到我的Github上下載全部的源碼。

貪吃蛇小遊戲源碼下載

Android-貪吃蛇小遊戲-分析與實現-Kotlin語言描述

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.