精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Android 原生控件打造經典貪吃蛇游戲實戰指南

移動開發 Android
貪吃蛇是一款經典的游戲,以其簡單易上手、策略性強、挑戰性高等特點深受玩家喜愛。下面我們使用Android原生控件來實現這個小游戲。

游戲說明

貪吃蛇是一款經典的游戲,以其簡單易上手、策略性強、挑戰性高等特點深受玩家喜愛。

游戲玩法:

  • 玩家使用方向鍵操控一條長長的蛇不斷吞下豆子,蛇身隨著吞下的豆子不斷變長
  • 游戲的目標是盡可能長時間地生存下去,同時避免蛇頭撞到自己的身體或屏幕邊緣

游戲特點:

  • 簡單易上手:游戲操作簡單,玩家只需要控制蛇的移動和轉向,吃掉食物即可
  • 策略性:雖然游戲看似簡單,但需要玩家靈活運用策略,在有限的空間內避免碰撞
  • 挑戰性:游戲難度逐漸增加,隨著蛇身的增長,玩家需要更加謹慎地操作

下面我們使用Android原生控件來實現這個小游戲(PS:不包含自定義View的方式)。

實現思路

1.游戲場景

使用GridLayout作為游戲板,大小為20x20,同時包含游戲分數和控制按鈕,下面是布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">

    <TextView
        android:id="@+id/scoreTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="16dp"
        android:text="分數: 0"
        android:textSize="18sp" />

    <GridLayout
        android:id="@+id/gameBoard"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:columnCount="20"
        android:rowCount="20" />

    <RelativeLayout
        android:layout_width="160dp"
        android:layout_height="160dp"
        android:layout_gravity="center">

        <Button
            android:id="@+id/upButton"
            android:layout_width="60dp"
            android:layout_height="60dp"
            android:layout_centerHorizontal="true"
            android:text="↑" />

        <Button
            android:id="@+id/leftButton"
            android:layout_width="60dp"
            android:layout_height="60dp"
            android:layout_centerVertical="true"
            android:text="←" />

        <Button
            android:id="@+id/rightButton"
            android:layout_width="60dp"
            android:layout_height="60dp"
            android:layout_alignParentEnd="true"
            android:layout_centerVertical="true"
            android:text="→" />

        <Button
            android:id="@+id/downButton"
            android:layout_width="60dp"
            android:layout_height="60dp"
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true"
            android:text="↓" />
    </RelativeLayout>
</LinearLayout>

預覽效果

private fun initializeGame() {
    // 初始化蛇
    snake.add(Pair(boardSize / 2, boardSize / 2))
    // 生成食物
    generateFood()
    // 初始化游戲板
    for (i in 0 until boardSize) {
        for (j in 0 until boardSize) {
            val cell = TextView(this)
            cell.width = 50
            cell.height = 50
            cell.setBackgroundColor(Color.WHITE)
            gameBoard.addView(cell)
        }
    }
    updateBoard()
}

private fun generateFood() {
    do {
        food = Pair(Random.nextInt(boardSize), Random.nextInt(boardSize))
    } while (snake.contains(food))
}
    
private fun updateBoard() {
    for (i in 0 until boardSize) {
        for (j in 0 until boardSize) {
            val cell = gameBoard.getChildAt(i * boardSize + j) as TextView
            when {
                Pair(i, j) == snake.first() -> cell.setBackgroundColor(Color.RED)
                snake.contains(Pair(i, j)) -> cell.setBackgroundColor(Color.GREEN)
                Pair(i, j) == food -> cell.setBackgroundColor(Color.BLUE)
                else -> cell.setBackgroundColor(Color.WHITE)
            }
        }
    }
}

初始化游戲板,大小為20*20,使用TextView作為每個單元格,用于表示可移動的范圍網格。初始化蛇的位置在游戲板中央,蛇被表示為MutableList<Pair<Int, Int>>,每個Pair代表蛇身體的一個部分的坐標。同時隨機在范圍中生成食物,最后更新游戲板給蛇和食物生成不同的顏色樣式。

2.游戲主循環

此時的游戲是不會動的,需要一個游戲主循環讓游戲不斷更新才能使游戲畫面動起來,使用Handler定期調用游戲更新邏輯,每200毫秒更新一次游戲狀態。

private val updateDelay = 200L // 游戲更新間隔,毫秒

private fun startGameLoop() {
    handler.postDelayed(object : Runnable {
        override fun run() {
            moveSnake()
            checkCollision()
            updateBoard()
            handler.postDelayed(this, updateDelay)
        }
    }, updateDelay)
}

每發送一次事件對蛇進行移動,檢查游戲是否結束(蛇是否咬到自己),更新GridLayout網格顯示,發送下一次更新事件

3.蛇的移動

蛇移動的核心邏輯,計算新的蛇頭位置,使用模運算確保蛇能夠穿過游戲邊界,檢查是否吃到食物,如果是,增加分數并生成新食物;否則,移除蛇尾。

private fun moveSnake() {
    val head = snake.first()
    val newHead = Pair(
        (head.first + direction.first + boardSize) % boardSize,
        (head.second + direction.second + boardSize) % boardSize
    )
    snake.add(0, newHead)

    if (newHead == food) {
        score++
        scoreTextView.text = "分數: $score"
        generateFood()
    } else {
        snake.removeAt(snake.size - 1)
    }
}

(1) 獲取蛇頭位置:

val head = snake.first()

蛇被表示為一個坐標對(Pair)的列表,第一個元素是蛇頭。

(2) 計算新的蛇頭位置:

val newHead = Pair(
    (head.first + direction.first + boardSize) % boardSize,
    (head.second + direction.second + boardSize) % boardSize
)

direction(控制的方向)來移動蛇頭,加上 boardSize 并對 boardSize 取模,確保新位置總是在游戲板內

direction = Pair(-1, 0) //上
direction = Pair(1, 0)  //下
direction = Pair(0, -1) //左
direction = Pair(0, 1)  //右

(3) 將新的蛇頭添加到蛇身列表的開頭:

snake.add(0, newHead)

蛇一直是在移動的,蛇頭坐標一直在變化。

(4) 檢查是否吃到食物:

if (newHead == food) {
    score++
    scoreTextView.text = "Score: $score"
    generateFood()
} else {
    snake.removeAt(snake.size - 1)
}

如果新的蛇頭位置與食物位置相同,增加分數,更新分數顯示,并生成新的食物。如果沒有吃到食物,則移除蛇尾,保持蛇的長度不變。

4.碰撞檢測

private fun checkCollision() {
    val head = snake.first()
    if (snake.subList(1, snake.size).contains(head)) {
        // 游戲結束
        handler.removeCallbacksAndMessages(null)
    }
}

檢查蛇頭是否與蛇身相撞,如果是,游戲結束。

5.生成食物

private fun generateFood() {
    do {
        food = Pair(Random.nextInt(boardSize), Random.nextInt(boardSize))
    } while (snake.contains(food))
}

隨機生成新的食物位置,確保不與蛇身重疊

6.顯示更新

private fun updateBoard() {
    for (i in 0 until boardSize) {
        for (j in 0 until boardSize) {
            val cell = gameBoard.getChildAt(i * boardSize + j) as TextView
            when {
                Pair(i, j) == snake.first() -> cell.setBackgroundColor(Color.RED)
                snake.contains(Pair(i, j)) -> cell.setBackgroundColor(Color.GREEN)
                Pair(i, j) == food -> cell.setBackgroundColor(Color.BLUE)
                else -> cell.setBackgroundColor(Color.WHITE)
            }
        }
    }
}

遍歷游戲板的每個單元格,根據其狀態(蛇頭、蛇身、食物或空白)設置不同的顏色。

游戲效果

7.游戲開始結束

此時的蛇可以掉頭和在游戲場景里穿越,下面我們改進一下,蛇撞到游戲邊界游戲結束

private fun moveSnake() {
    val head = snake.first()
    val newHead = Pair(
        head.first + direction.first,
        head.second + direction.second
    )

    // 檢查是否撞到邊界
    if (newHead.first < 0 || newHead.first >= boardSize || 
        newHead.second < 0 || newHead.second >= boardSize) {
        endGame()
        return
    }

    snake.add(0, newHead)

    if (newHead == food) {
        score++
        scoreTextView.text = "分數: $score"
        generateFood()
    } else {
        snake.removeAt(snake.size - 1)
    }
}

添加邊界檢測,檢測到坐標在游戲板邊界,游戲結束

findViewById<Button>(R.id.upButton).setOnClickListener { 
    if (isGameRunning) {
        direction = Pair(-1, 0)
    } else {
        restartGame()
    }
}
findViewById<Button>(R.id.downButton).setOnClickListener { 
    if (isGameRunning) {
        direction = Pair(1, 0)
    } else {
        restartGame()
    }
}
findViewById<Button>(R.id.leftButton).setOnClickListener { 
    if (isGameRunning) {
        direction = Pair(0, -1)
    } else {
        restartGame()
    }
}
findViewById<Button>(R.id.rightButton).setOnClickListener { 
    if (isGameRunning) {
        direction = Pair(0, 1)
    } else {
        restartGame()
    }
}

修改方向按鈕的點擊監聽器,使其能夠重新開始游戲

private fun endGame() {
    isGameRunning = false
    handler.removeCallbacksAndMessages(null)
    scoreTextView.text = "游戲結束!最終分數: $score\n點擊任意方向鍵重新開始"
}

private fun restartGame() {
    snake.clear()
    snake.add(Pair(boardSize / 2, boardSize / 2))
    direction = Pair(0, 1)
    score = 0
    generateFood()
    isGameRunning = true
    startGameLoop()
    updateBoard()
    scoreTextView.text = "分數: 0"
}

游戲結束和重新開始,通過isGameRunning變量控制游戲主循環

private fun startGameLoop() {
    handler.post(object : Runnable {
        override fun run() {
            if (isGameRunning) {
                moveSnake()
                if (isGameRunning) {  // 再次檢查,因為 moveSnake 可能會結束游戲
                    checkCollision()
                    updateBoard()
                    handler.postDelayed(this, updateDelay)
                }
            }
        }
    })
}

完整代碼

游戲效果

Github源碼https://github.com/Reathin/Sample-Android/tree/master/module_snake

責任編輯:趙寧寧 來源: 沐雨花飛蝶
相關推薦

2021-06-15 09:18:51

鴻蒙HarmonyOS應用

2012-06-05 14:42:57

Silverlight

2022-10-28 09:33:10

Linux貪吃蛇

2015-07-31 11:26:24

Swift貪吃蛇

2022-11-07 11:27:00

JS游戲開發

2020-08-20 20:30:49

C語言小游戲貪吃蛇

2021-09-02 15:25:53

鴻蒙HarmonyOS應用

2024-01-18 11:22:41

C++Windows開發

2022-07-25 14:17:04

JS應用開發

2023-10-17 10:20:53

VueReact

2021-04-20 11:40:12

Linux圖形庫curses

2024-12-06 09:20:22

Android游戲新數字

2024-12-09 09:18:21

Android原生控件

2025-02-27 09:31:05

2016-09-19 21:24:08

PythonAsyncio游戲

2016-09-22 21:12:14

2016-09-14 21:17:47

PythonAsyncio游戲

2010-02-05 15:00:44

Android 調用u

2018-08-31 15:48:33

2015-07-07 15:47:57

Razer雷蛇
點贊
收藏

51CTO技術棧公眾號

另类小说色综合| www.成人av| 国产黄色录像片| 日韩综合一区二区三区| 亚洲成av人片一区二区梦乃| 日本公妇乱淫免费视频一区三区| 91在线精品入口| 91久久视频| 最近中文字幕日韩精品| 一区二区在线免费观看视频| 91精品论坛| 亚洲视频免费看| 欧美一级二级三级| 亚洲av无码国产精品久久不卡| 国产日韩一区| 久久亚洲精品毛片| 日韩一级视频在线观看| 精品一区二区三区中文字幕 | 精品人妻大屁股白浆无码| 亚洲 欧美 自拍偷拍| 精品一区二区精品| 国产a级全部精品| 国产无码精品视频| 亚州av乱码久久精品蜜桃| 国产网站欧美日韩免费精品在线观看| 99九九精品视频| 性欧美gay| 亚洲va欧美va国产va天堂影院| 亚洲亚洲精品三区日韩精品在线视频 | 91这里只有精品| 93久久精品日日躁夜夜躁欧美| 91牛牛免费视频| 成人黄色免费网| 99亚洲一区二区| 久久69精品久久久久久国产越南| 91免费在线看片| 久久av免费| 日韩成人av在线| 中文字幕人妻熟女人妻a片| 巨胸喷奶水www久久久| 欧美日韩国产精品专区 | 污污在线观看| ...av二区三区久久精品| 日韩av一区二区三区在线观看| 日韩中文字幕观看| 国产suv精品一区二区883| 成人乱人伦精品视频在线观看| 成年人晚上看的视频| 久久国产精品久久久久久电车| 欧美激情一区二区三级高清视频| 亚洲一级生活片| 久久在线播放| 久久九九免费视频| 国产精品无码无卡无需播放器| 欧美日韩xxxx| 亚洲视频在线观看免费| 少妇按摩一区二区三区| 亚洲婷婷丁香| 亚洲欧美另类国产| 久久只有这里有精品| 免费视频亚洲| 影音先锋日韩有码| 国产在视频线精品视频| 久久视频精品| 久久成人精品视频| 久热精品在线观看| 国产精品亚洲综合久久| 情事1991在线| 伊人成人在线观看| 国产一区二三区好的| 亚洲一区二区三区四区在线播放| 国产手机精品视频| 国产成人免费在线视频| 韩国成人av| 青青操在线视频| 国产午夜亚洲精品不卡| 亚洲免费久久| 肉肉视频在线观看| 欧美午夜电影在线| 色多多视频在线播放| 国产精品成人3p一区二区三区| 日韩欧美一区在线观看| 毛茸茸free性熟hd| 女厕嘘嘘一区二区在线播放| 一区二区三区黄色| 久久精品视频免费在线观看| 日韩天天综合| 国产精品美女久久久免费| 99热这里只有精品5| 成人国产电影网| 欧美激情www| 久做在线视频免费观看| 夜夜精品浪潮av一区二区三区| 激情五月宗合网| 国产成人久久精品麻豆二区| 欧美一级片免费看| 中文字幕5566| 99久久精品网| 欧美一级免费视频| 国产精品-色哟哟| av亚洲产国偷v产偷v自拍| 日韩免费三级| 好看的中文字幕在线播放| 色综合久久久网| 日韩精品――色哟哟| 国产精品嫩草影院在线看| 欧美精品日韩三级| 性高潮视频在线观看| 国产成a人亚洲| 五月天久久综合网| 国产v日韩v欧美v| 欧美精品777| 在线 丝袜 欧美 日韩 制服| 中文在线日韩| 国产精品一区二区三区久久久| 亚洲男人第一天堂| 国产精品欧美久久久久无广告| 成人在线国产视频| 95精品视频| 亚洲图片欧洲图片av| 国产无遮无挡120秒| 麻豆精品新av中文字幕| 免费电影一区| 嗯~啊~轻一点视频日本在线观看| 欧美日韩三级一区二区| 极品白嫩丰满美女无套| 韩国一区二区三区在线观看| 国产日本欧美一区二区三区| 欧美午夜黄色| 夜夜亚洲天天久久| 欧美xxxxxbbbbb| 国产精品99久久久久久动医院| 人体精品一二三区| 午夜在线视频观看| 亚洲一区二区三区四区五区中文| 中文字幕 日韩 欧美| 欧美日韩一二三四| 国产成人中文字幕| 国产在线中文字幕| 在线观看亚洲一区| 免费福利视频网站| 久久婷婷影院| 日本一区二区久久精品| 成人动漫一区| 亚洲乱码国产乱码精品精| 日本熟伦人妇xxxx| 成人av在线一区二区| 久久久久久久9| 我要色综合中文字幕| 久久精品国产一区二区电影| 在线视频1卡二卡三卡| 国产欧美日本一区视频| 9久久婷婷国产综合精品性色 | 播五月开心婷婷综合| 狠狠精品干练久久久无码中文字幕| 久久亚洲精品人成综合网| 伊人亚洲福利一区二区三区| 国产精品自拍第一页| 国产精品视频麻豆| 日本中文字幕二区| 国产精品精品国产一区二区| 成人网在线观看| 国产在线激情视频| 欧美精品久久一区| 日日骚一区二区三区| 高清在线观看日韩| 少妇av一区二区三区无码| 麻豆成人入口| 日本国产一区二区三区| 第一视频专区在线| 欧美丰满一区二区免费视频| 欧美日韩黄色网| 成人永久aaa| 黄网站欧美内射| 免费国产自久久久久三四区久久| 国产成人综合亚洲| 免费黄网站在线播放| 日韩欧美一级二级| av大片在线免费观看| 国产日产欧美一区二区视频| 亚洲色图久久久| 综合五月婷婷| 久久久神马电影| yiren22亚洲综合| 久久高清视频免费| 日韩在线视频第一页| 在线观看亚洲一区| 免费在线黄色片| 久久中文娱乐网| www激情五月| 在线亚洲观看| 一区二区在线中文字幕电影视频| 8848成人影院| 国产精品wwwwww| av网址在线免费观看| 日韩国产激情在线| 亚洲天堂久久久久| 五月天国产精品| 亚洲色图100p| 91视视频在线观看入口直接观看www| 色哟哟精品视频| 亚洲成人中文| 国产精品h视频| 日韩电影不卡一区| 91美女福利视频高清| 亚洲深夜视频| 欧美大片免费观看| 日本在线免费| 精品视频在线播放| 精品人妻一区二区三区三区四区| 色999日韩国产欧美一区二区| 国产1区2区3区4区| 国产偷国产偷精品高清尤物| 中文字幕乱视频| 极品少妇xxxx偷拍精品少妇| wwwxxx黄色片| 在线看片一区| 欧美a级免费视频| 久久美女精品| 日韩三级电影免费观看| 国产精品毛片视频| 91中文精品字幕在线视频| 456亚洲精品成人影院| 国模精品一区二区三区色天香| 久久久久久国产精品免费无遮挡 | 在线观看www91| 日韩成人免费在线观看| 亚洲人妖av一区二区| 亚洲av成人无码久久精品| 99r国产精品| 亚洲精品鲁一鲁一区二区三区| 免费欧美在线视频| 人妻无码视频一区二区三区| 亚洲激情午夜| 国产精品www在线观看| 欧美激情综合色综合啪啪| 亚洲啪啪av| 精品一区二区三区中文字幕老牛| 久久久久久精| 视频小说一区二区| 国外成人在线视频网站| 成人爽a毛片免费啪啪红桃视频| 成人在线中文字幕| 久久青草免费| 国产精品最新在线观看| 久久精品超碰| 成人黄色生活片| 亚洲高清国产拍精品26u| 国产精品久久久久久久久免费 | 影音先锋在线播放| 久久综合免费视频| 成人午夜在线影视| 欧美老少做受xxxx高潮| 日本三级在线观看网站| 欧美日韩成人精品| 欧美理论片在线播放| 欧美大秀在线观看| 123区在线| 国产91精品不卡视频| 色偷偷色偷偷色偷偷在线视频| 欧美一区二区三区免费视| 欧美xxxhd| 国产97色在线| 国产伊人久久| 亚洲最大福利网站| 成人精品动漫一区二区三区| 国产午夜精品在线| 亚洲+变态+欧美+另类+精品| 免费精品视频一区| 人人狠狠综合久久亚洲婷婷| 中文字幕久久综合| 午夜天堂精品久久久久| 亚洲理论电影在线观看| 亚洲一区二区网站| 欧美精品aaaa| 国产麻豆9l精品三级站| 在线成人免费av| av资源站一区| 91精品国自产在线| 亚洲综合男人的天堂| 国产女同在线观看| 欧美视频在线观看一区| 国产精品无码在线播放| 欧美成人精品福利| 青青青免费视频在线2| 日韩专区中文字幕| 1区2区3区在线| 国产欧美久久久久久| 91亚洲精品视频在线观看| 欧美日韩国产免费一区二区三区| 99成人超碰| 成人免费性视频| 久久一区二区三区超碰国产精品| 久久99爱视频| 99re66热这里只有精品3直播| 精品丰满少妇一区二区三区| 亚洲主播在线播放| 天堂免费在线视频| 亚洲第一区在线| 69av在线| 欧美在线视频一区二区| 国产高清亚洲| 欧美日韩亚洲在线| 欧美另类女人| 一本色道久久亚洲综合精品蜜桃| 不卡视频一二三| 国产精品suv一区二区88| 亚洲国产欧美在线人成| 亚洲综合免费视频| 亚洲男人天堂网站| 免费网站在线观看人| 国产欧美日韩专区发布| 小嫩嫩12欧美| 99er在线视频| 精彩视频一区二区三区| av女人的天堂| 亚洲成人一区二区| 99国产精品99| 日韩中文字幕精品| 欧美自拍电影| 精品日本一区二区三区在线观看| 国产精品久久久久9999赢消| 日韩黄色片视频| proumb性欧美在线观看| 99精品久久久久| 欧美人妖巨大在线| 韩国福利在线| 91av在线不卡| ady日本映画久久精品一区二区| 中文字幕久精品免| 久久精品二区亚洲w码| 精品国产成人亚洲午夜福利| 欧美色视频日本版| 无码精品在线观看| 777国产偷窥盗摄精品视频| 99re91这里只有精品| 日韩一二区视频| 久久av中文字幕片| 少妇太紧太爽又黄又硬又爽小说| 欧洲在线/亚洲| 国产区在线视频| 国产成人中文字幕| 精品国产一区二区三区四区| 六月丁香婷婷在线| www亚洲一区| 少妇太紧太爽又黄又硬又爽| 亚洲精品国产免费| 中文在线аv在线| 欧美在线3区| 三级久久三级久久| 日本美女xxx| 欧美巨大另类极品videosbest| a视频网址在线观看| 国产精品欧美在线| 青草国产精品| 亚洲理论中文字幕| 亚洲欧美日韩一区| 99国产精品一区二区三区| 不卡av电影院| 极品国产人妖chinesets亚洲人妖| 妺妺窝人体色777777| 91免费观看视频| 神马久久久久久久| 综合激情国产一区| 99视频这里有精品| 亚洲国产一二三精品无码| 国产**成人网毛片九色 | 免费在线亚洲| 国产伦精品一区二区三区视频女| 欧美日韩成人一区二区| 国产成人在线视频免费观看| 国产精品12| 亚洲综合丁香| 国产又色又爽又高潮免费| 在线播放91灌醉迷j高跟美女 | www.日本久久| 五月激情丁香一区二区三区| 国产在线资源| 999久久久| 久久久精品网| 欧美日韩色视频| 日韩av在线网| 久久69成人| 人妻夜夜添夜夜无码av| 日本一区二区三区视频视频| 99久久婷婷国产一区二区三区| 久久久伊人日本| 欧美最新另类人妖| 国产成人av片| 91精品办公室少妇高潮对白| 精精国产xxxx视频在线| 国产亚洲一区二区三区在线播放| 日韩电影一区二区三区四区| 国产一二三区精品| 日韩精品在线免费观看| 成人黄色91| 黄色一级一级片| 一区二区三区色| 丁香在线视频| 国产日韩一区欧美|