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

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

Overview

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

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

先看看效果圖

貪吃蛇小遊戲

分析有哪些遊戲對象

毫無疑問,無論Kotlin仍是Java都是面向對象編程語言,那麼咱們要實現貪吃蛇遊戲的第一步就是要分析遊戲中有哪些對象,已有將對象都分析徹底了,咱們再能進行開發,從示意圖中咱們能夠發現最少有兩個對象。編程

  • 食物,貪吃蛇吃到食物後會增加
  • 貪吃蛇, 能夠明顯的看出來貪吃蛇是由一個個小方塊組成的,那麼其中每個方塊就是一個對象,將全部的方塊對象放入一個集合中,這個集合就組成了貪吃蛇。集合的第一個元素就是 蛇頭爲了以示區別,將蛇頭使用了不一樣的顏色跟身體區分出來。
  • 提取父類,無論是組成貪吃蛇的塊仍是食物對象,本質上都是遊戲對象,那麼咱們能夠將這兩個對象提取取來一個公共的父類,在父類中定義通用的屬性和方法。

Well,無論是貪吃和仍是食物,都是須要繪製出來的,那麼一提到繪製那麼就不得不提到座標了,座標的計算是至關繁瑣且容易出錯的,那麼咱們得想辦法將座標給抽象一下。從遊戲的示例圖咱們咱們能夠發現,全部的遊戲對象都是能夠經過一個行的索引,和一個類的索引來肯定的二維的平面結構,那麼咱們就能夠將原本的座標抽象成行列結構。到這裏公共父類的成員那就基本上就能夠肯定了,同時咱們的類的結構也能夠肯定了。抽取出來的類的結構以下。canvas

遊戲對象的類的結構

/** * 貪吃蛇遊戲中全部遊戲的父類,全部的遊戲對象都將會今後類繼承 * */
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
}
複製代碼

貪吃蛇是如何移動的

這個邏輯在貪吃和遊中算是個難點,由於貪吃蛇是能夠屢次拐彎的,移動蛇頭的實現思路以下。ide

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

當移動了貪吃蛇的位置之後就能夠進行碰撞檢測了函數

碰撞檢測

對於有序對象的碰撞檢測分爲三種狀況, 至於如何碰撞檢測只須要檢測行和列是否超出遊戲地圖範圍,或者是不是與其餘的遊戲對象重合便可。ui

  1. 貪吃蛇超出地圖的邊界-能夠看作爲撞牆
  2. 貪吃和吃到本身
  3. 貪吃蛇遲到食物,須要將貪吃蛇的長度+1,即在蛇的尾部在增長一個組成蛇的塊

對於上面的三種狀況咱們能夠提取出來兩個回調函數spa

interface OnCrashListener {
    fun onCrash()
}

/** * 貪吃蛇吃到食物的回調 * */
interface OnEatenFoodListener {
    fun onEaten()
}
複製代碼

源碼下載

剩下一些比較簡單的地方,也就沒再文章中講解,你們能夠到個人Github上下載所有的源碼。code

貪吃蛇小遊戲源碼下載

相關文章
相關標籤/搜索