HarmonyOS迷宮游戲鴻蒙應用開發實戰:從零構建隨機迷宮游戲(初版)

????????在鴻蒙應用開發中,游戲類應用能很好地鍛煉 UI 布局、狀態管理與邏輯交互能力。本文將以一個隨機迷宮游戲為例,詳細拆解從首頁設計到迷宮生成、角色控制、通關判定的完整開發流程,帶你掌握 ArkUI 框架的核心應用技巧。

一、項目整體架構

本次開發的隨機迷宮游戲包含兩個核心頁面,頁面間通過router路由實現跳轉,整體結構清晰,便于后續擴展維護:

頁面名稱頁面功能核心組件 / 邏輯
UI_test1(首頁)游戲入口,展示標題與開始按鈕Column、Stack、Button、router.pushUrl
migong(迷宮頁)隨機迷宮生成、角色控制、通關判定Grid、@State 狀態管理、BFS 路徑檢測、AlertDialog

二、首頁開發:打造簡潔的游戲入口

首頁作為用戶的第一個交互界面,需兼顧視覺吸引力與操作便捷性。我們采用背景圖 + 居中布局的設計,突出 “迷宮游戲” 主題與 “開始游戲” 按鈕。

界面演示:

1. 核心代碼解析

typescript

import router from '@ohos.router'; // 導入路由模塊,實現頁面跳轉
@Entry
@Component
struct UI_test1{build() {// 外層Column確保頁面占滿屏幕Column(){// Stack實現背景圖與前景內容的層疊Stack(){// 背景圖:寬度100%、高度100%,鋪滿整個頁面Image($r("app.media.bg")).width('100%').height('100%')// 內層Column:居中展示標題與按鈕Column(){// 游戲標題:白色、斜體、加粗,調整margin優化位置Text('迷宮游戲 ').fontColor(Color.White).fontSize(58).width(250).height(100).fontStyle(FontStyle.Italic).fontWeight(FontWeight.Bold).margin({ left: '12.00vp' })// 開始游戲按鈕:淡藍色背景、白色文字,點擊跳轉迷宮頁Button('開始游戲').fontColor(Color.White).fontSize(30).width(200).height(50).backgroundColor('#9964f0fd').margin({ top: '400.00vp' }) // 向下偏移,與標題形成層次感.onClick(()=>{// 路由跳轉:跳轉到test_pages目錄下的migong頁面router.pushUrl({ url: "test_pages/migong" });});}.width('100%').height('100%').justifyContent(FlexAlign.Center) // 子組件垂直居中}}.width('100%').height('100%')}
}

2. 關鍵設計思路

  • 層疊布局(Stack):通過 Stack 將背景圖與前景內容(標題、按鈕)疊加,避免背景圖被其他組件遮擋;
  • 路由跳轉(router):使用router.pushUrl實現首頁到迷宮頁的跳轉,url需與頁面實際路徑一致(此處為test_pages/migong);
  • 視覺優化:標題采用 “斜體 + 加粗” 組合提升辨識度,按鈕使用半透明背景色(#9964f0fd,前兩位99為透明度),避免與背景圖產生強烈沖突。

三、迷宮頁開發:核心邏輯與交互實現

迷宮頁是整個游戲的核心,需實現隨機迷宮生成、角色移動、路徑檢測、通關彈窗四大功能。下面分模塊拆解實現細節。

1. 隨機迷宮生成:確保有有效路徑

迷宮本質是一個 20x20 的網格(1 表示墻壁,0 表示可通行區域),為避免生成 “死胡同” 迷宮,我們通過固定邊界 + 隨機填充 + 路徑檢測的邏輯,確保從 “入口(1,1)” 到 “出口(18,18)” 有有效路徑。

界面演示:

(1)核心函數:generateRandomWall

typescript

// 生成隨機迷宮數組
generateRandomWall() {const originalWall = [/* 初始迷宮數組,略 */]; // 基礎迷宮模板const rows = 20; // 迷宮行數const cols = 20; // 迷宮列數let newWall: number[] = [];// 1. 固定邊界:第一列、最后一列、第一行、最后一行保持為墻壁(1)// 固定第一行for (let i = 0; i < cols; i++) {newWall.push(originalWall[i]);}// 固定中間行的第一列和最后一列for (let r = 1; r < rows - 1; r++) {newWall.push(originalWall[r * cols]); // 第一列(墻壁)// 中間列隨機填充:50%概率為可通行區域(0),50%為墻壁(1)for (let c = 1; c < cols - 1; c++) {let randomValue = Math.random() > 0.5 ? 1 : 0;// 固定入口(1,1)和出口(18,18)為可通行區域if (r === 1 && c === 1) randomValue = 0;if (r === rows - 2 && c === cols - 2) randomValue = 0;newWall.push(randomValue);}newWall.push(originalWall[r * cols + cols - 1]); // 最后一列(墻壁)}// 固定最后一行for (let i = cols * (rows - 1); i < cols * rows; i++) {newWall.push(originalWall[i]);}// 2. 路徑檢測:若當前迷宮無有效路徑,重新生成while (!this.checkPathExists(newWall)) {let tempWall = this.generateRandomWall();newWall = tempWall.slice(); // 深拷貝新迷宮數組}return newWall;
}
(2)路徑檢測:BFS 算法確保連通性

使用廣度優先搜索(BFS)?檢測從入口到出口是否存在可通行路徑,避免生成 “無法通關” 的迷宮:

界面演示:

typescript

// 檢查迷宮是否存在有效路徑(BFS算法)
checkPathExists(wall: number[]) {const rows = 20;const cols = 20;const startX = 1, startY = 1; // 入口坐標const endX = cols - 2, endY = rows - 2; // 出口坐標// visited數組:記錄已訪問的格子,避免重復檢測let visited: boolean[][] = [];for (let i = 0; i < rows; i++) {visited[i] = new Array(cols).fill(false);}// 隊列:存儲待訪問的格子坐標(BFS核心)let queue: [number, number][] = [];queue.push([startX, startY]);visited[startY][startX] = true;// 四個移動方向:上、下、左、右const directions = [[0, 1], [1, 0], [0, -1], [-1, 0]];while (queue.length > 0) {let item = queue.shift(); // 取出隊列頭部格子if (item) {const [x, y] = item;// 若到達出口,返回true(存在有效路徑)if (x === endX && y === endY) return true;// 遍歷四個方向,檢測相鄰格子是否可通行for (let direction of directions) {const newX = x + direction[0];const newY = y + direction[1];// 條件判斷:1. 格子在迷宮范圍內;2. 未被訪問;3. 可通行(值為0)if (newX >= 0 && newX < cols && newY >= 0 && newY < rows && !visited[newY][newX] && wall[newY * cols + newX] === 0) {queue.push([newX, newY]);visited[newY][newX] = true;}}}}// 遍歷完所有格子仍未到達出口,返回false(無有效路徑)return false;
}

2. 迷宮渲染:使用 Grid 組件構建網格

通過Grid組件將wall數組(20x20)渲染為可視化迷宮,其中:

  • 值為 0 的格子:白色背景(可通行區域);
  • 值為 1 的格子:灰色背景(墻壁)。

核心代碼:

typescript

// 迷宮網格渲染
Grid() {// ForEach:遍歷wall數組,生成每個格子ForEach(this.wall, (item: number) => {GridItem() {if (item === 0) { // 可通行區域Text('').fontSize(32).backgroundColor(Color.White).width(18).height(21).textAlign(TextAlign.Center)} else if (item === 1) { // 墻壁Text('').fontSize(32).backgroundColor('#8a5e929b').width(18).height(21).textAlign(TextAlign.Center)}}})
}
// 網格配置:20列、20行,列間距與行間距為1(避免格子粘連)
.columnsTemplate('1fr 1fr ... 1fr') // 重復20次1fr,省略部分代碼
.rowsTemplate('1fr 1fr ... 1fr')   // 重復20次1fr,省略部分代碼
.columnsGap(1).rowsGap(1)
.width('90%').height(400) // 控制網格大小,適配屏幕
.backgroundColor(Color.White)

3. 角色控制:狀態管理實現移動邏輯

通過@State裝飾器管理角色的坐標(peoplexpeopley)與當前格子索引(positionnumber),點擊方向按鈕(←↑↓→)時更新角色位置,并判斷是否撞墻(撞墻則回退位置)。

(1)狀態定義

typescript

@State wall: number[] = this.generateRandomWall(); // 迷宮數組(初始生成)
@State peoplex: number = 34; // 角色初始X坐標
@State peopley: number = 100; // 角色初始Y坐標
@State positionnumber: number = 1; // 角色初始格子索引(對應入口)
@State over: boolean = false; // 通關狀態標記
(2)方向按鈕邏輯(以 “→” 和 “↓” 為例)

typescript

// 向右移動按鈕
Button('→').backgroundColor('#20101010').height(60).width(60).onClick(() => {this.positionnumber += 1; // 索引+1(向右移動一格)// 若目標格子可通行(值為0),更新X坐標;否則回退索引if (this.wall[this.positionnumber] === 0) {this.peoplex += 16.4; // 每次移動的像素值(根據格子寬度計算)} else {this.positionnumber -= 1; // 撞墻,回退到原位置}})// 向下移動按鈕(含通關判定)
Button('↓').backgroundColor('#20101010').height(60).width(60).onClick(() => {// 若當前位置是出口前一格,觸發通關彈窗if (this.positionnumber === this.wall.length - 2) {AlertDialog.show({title: '游戲成功',message: '恭喜通關',autoCancel: true,alignment: DialogAlignment.Bottom,primaryButton: {value: '確定',action: () => console.info('通關彈窗-確定按鈕點擊')},secondaryButton: {value: '最優路徑',action: () => router.pushUrl({ url: "test_pages/migong1" }) // 跳轉最優路徑頁},cancel: () => console.info('彈窗關閉')});} else {// 普通向下移動邏輯(與向右類似)this.positionnumber += 20; // 索引+20(向下移動一行,共20列)if (this.wall[this.positionnumber] === 0) {this.peopley += 20;} else {this.positionnumber -= 20;}}})

4. 角色渲染與額外功能

  • 角色顯示:使用Image組件加載角色圖片,通過position屬性綁定peoplexpeopley,實現角色隨坐標更新而移動;
  • 返回首頁:左上角添加 “返回” 圖標,點擊通過router跳轉回首頁;
  • 最優路徑:底部添加 “解鎖最優路徑” 按鈕,跳轉至migong1頁面(可擴展 Dijkstra 算法實現最優路徑繪制)。

四、開發總結與優化方向

1. 核心技術點回顧

  • ArkUI 布局:靈活使用 Column、Stack、Grid 組件實現復雜 UI 結構;
  • 狀態管理@State裝飾器實現角色位置、迷宮數組的響應式更新;
  • 路由跳轉router模塊實現頁面間的無縫切換;
  • 算法應用:BFS 算法確保迷宮連通性,為后續擴展最優路徑(如 Dijkstra、A*)奠定基礎。

2. 可優化方向

  1. 角色移動優化:當前通過固定像素值移動,可改為根據格子寬高動態計算,適配不同屏幕;
  2. 觸摸控制:新增滑動手勢控制角色移動(如左滑→向左移動),提升操作體驗;
  3. 難度分級:增加 “簡單(10x10)”“中等(20x20)”“困難(30x30)” 選項,動態調整迷宮大小;
  4. 路徑可視化:在migong1頁面中,通過改變格子背景色(如綠色)繪制最優路徑,幫助用戶理解迷宮邏輯。

????????通過本次隨機迷宮游戲開發,不僅能掌握 ArkUI 的核心語法與組件使用,還能將數據結構(如 BFS)與實際應用結合,為后續鴻蒙游戲或復雜應用開發積累經驗。如果你有更多優化想法,歡迎在評論區交流!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/100362.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/100362.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/100362.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

石頭科技出海升級:全球電商業財一體化與OMS實踐

石頭科技作為智能清潔設備領域的獨角獸&#xff0c;2023 年海外收入占比超過 60%&#xff0c;產品銷往全球 60 多個國家。然而&#xff0c;智能硬件出海的復雜性&#xff0c;讓企業在業財管理上面臨前所未有的挑戰。智能硬件業財痛點 產品生命周期管理&#xff1a;研發、生產到…

《URP管線中后處理效果的創新應用與優化實踐》

硬件性能的飛速提升與玩家對畫面品質的高要求形成了相互推動的態勢,而渲染效果作為游戲視覺體驗的核心載體,直接決定了玩家對游戲的第一印象與沉浸感。后處理效果作為URP管線的“點睛之筆”,通過在渲染流程末尾對最終圖像進行二次加工,能夠模擬真實世界的光學現象(如光線散…

【Java 底層】JVM 垃圾回收機制深度剖析:從對象生死判定到收集器實戰

【Java 底層】JVM 垃圾回收機制深度剖析&#xff1a;從對象生死判定到收集器實戰 【Java 底層】JVM 垃圾回收機制深度剖析&#xff1a;從對象生死判定到收集器實戰 Java 之所以被稱為 “開發效率利器”&#xff0c;很大程度上得益于其自動內存管理機制 —— 開發者無需手動分配…

網絡問題排查

網絡連通性測試&#xff1a;ping ip持續性監測&#xff1a;ping -t ipnetstat 可以查看網絡連接狀態&#xff0c;可以看到顯示系統的網絡連接&#xff0c;路由表&#xff0c;接口等信息。netstat -nult 回車-t:顯示的是tcp的連接-u:顯示udp的連接-l:只顯示監聽狀態的端口-n:顯示…

tuple/dict/list 這三個數據類型在取值時候的區別

tuple&#xff08;元組&#xff09;、dict&#xff08;字典&#xff09;、list&#xff08;列表&#xff09;在取值時的區別。 1. list&#xff08;列表&#xff09; &#x1f449; 列表就是“一串有順序的東西”&#xff0c;像排隊的人。 取值方式&#xff1a;用 下標&#xf…

深度解析大模型服務性能評測:AI Ping平臺助力開發者精準選型MaaS服務

深度解析大模型服務性能評測&#xff1a;AI Ping平臺助力開發者精準選型MaaS服務 &#x1f31f; Hello&#xff0c;我是摘星&#xff01; &#x1f308; 在彩虹般絢爛的技術棧中&#xff0c;我是那個永不停歇的色彩收集者。 &#x1f98b; 每一個優化都是我培育的花朵&#xff…

OpenCV物體跟蹤:從理論到實戰的全面解析

? 一、引言? 在計算機視覺的廣闊領域中&#xff0c;物體跟蹤技術宛如一顆璀璨的明星&#xff0c;散發著獨特的魅力與價值&#xff0c;發揮著舉足輕重的作用。它致力于在連續的圖像幀或視頻序列里&#xff0c;精準識別并持續定位特定的目標物體&#xff0c;這一過程看似簡單…

【Python】OS模塊操作目錄

1、概述os模塊是一個Python內置的操作目錄和查看系統基礎信息的模塊&#xff0c;可用于讓我們對目錄進行批量操作&#xff0c;其中包括&#xff1a;查看系統信息&#xff08;環境變量、分隔符、換行符等&#xff09;&#xff0c;對目錄進行創建、刪除、重命名、查看目錄內容等&…

JavaScript中 i++ 與 ++i

在 JavaScript 編程中&#xff0c;i&#xff08;前置自增&#xff09;和i&#xff08;后置自增&#xff09;是兩個常用但極易混淆的運算符。它們看似都能實現變量自增 1 的功能&#xff0c;但其執行時機和返回值的差異&#xff0c;常常導致開發者在實際編碼中出現邏輯錯誤。本文…

fastapi 中間件的使用

1. 中間件基礎結構from starlette.middleware.base import BaseHTTPMiddlewareclass RequestLoggerMiddleware(BaseHTTPMiddleware):async def dispatch(self, request: Request, call_next):# 1. 請求處理前邏輯# 2. 調用后續處理response await call_next(request)# 3. 響應…

網絡白菜包子手動安裝 Arch Linux

大家好&#xff01;我是大聰明-PLUS&#xff01;針對初學者的 Arch Linux 安裝詳細教程。我曾經花了不少時間才搞清楚安裝過程。本文旨在提供一種“捷徑”&#xff0c;讓每個人都能輕松上手&#xff0c;無論他們是否有 Linux 使用經驗。Arch 的主要特點是極其靈活的系統配置&am…

Linux學習筆記(五)--Linux基礎開發工具使用

在Linux中軟件包通常是指一個包含了軟件程序、元數據、依賴關系信息和安裝腳本的壓縮文件??。因為在Linux上如果沒有軟件包管理器,那么想要下載軟件會非常麻煩,不僅需要自己去手動編譯和安裝,而且難以卸載和管理,所以軟件包的出現解決了這些問題.軟件包一般是由程序文件(編譯…

數據結構(陳越,何欽銘) 第十講 排序(下)

10.1 快速排序 10.1.1 算法概述10.1.2 選主元10.1.3 子集劃分10.1.4 算法實現10.2 表排序 10.2.1 算法概述10.2.2 物理排序10.3 基數排序 10.3.1 桶排序10.3.2 基數排序10.3.3 多關鍵字的排序10.4 排序算法的比較

vue 使用print.js 打印文本,HTML元素,圖片,PDF

vue 使用print.js 打印文本,HTML元素,圖片,PDF 安裝 npm install print-js --save示例 <template><div class"print-example"><h2>Print.js 打印示例</h2><!-- 打印區域 --><div id"printableArea" class"printable…

jenkins審批機器人功能概述-Telegram版

Jenkins審批機器人 - 功能概述 代碼鏈接&#xff0c;私聊可得 項目簡介 Jenkins審批機器人是一個集成Jenkins CI/CD流程的自動化審批系統&#xff0c;通過Telegram機器人提供便捷的發布審批功能。該系統支持多環境部署審批、用戶權限管理、構建結果通知等完整的DevOps審批流程。…

Rust : 關于解引用“*”

關于解引用*操作符&#xff0c;謹供參考&#xff01; 一、主要代碼 use std::ops::Deref; fn main() {model_1();model_2();model_3();model_4();model_5();model_6();model_7();model_8();model_9(); }二、*操作符與常見的引用和解引用 fn model_1(){let reference:&St…

【高級終端Termux】在安卓手機/平板上使用Termux 搭建 Debian 環境并運行 PC 級 Linux 應用教程(含安裝WPS,VS Code)

Termux 搭建 Debian 環境并運行 PC 級 Linux 應用教程 一、前言 1. 背景 眾所周知&#xff0c;最新搭載澎湃OS和鴻蒙OS的平板都內置了PC級WPS&#xff0c;辦公效率直接拉滿&#xff08;板子終于從“泡面蓋”升級為“生產力”了&#xff09;。但問題來了&#xff1a;如果不是這…

從循環到矩陣運算:矢量化加速機器學習的秘訣

矢量化實現全解析&#xff1a;從原理到實戰 在學習數據科學、機器學習和深度學習的過程中&#xff0c;我們經常會聽到一個高頻詞——矢量化&#xff08;Vectorization&#xff09;。很多庫的官方文檔、教程里也不斷強調“要盡量使用矢量化操作&#xff0c;而不是顯式循環”。那…

大數據畢業設計-大數據-基于大數據的熱門游戲推薦與可視化系統(高分計算機畢業設計選題·定制開發·真正大數據)

&#x1f34a;作者&#xff1a;計算機編程-吉哥 &#x1f34a;簡介&#xff1a;專業從事JavaWeb程序開發&#xff0c;微信小程序開發&#xff0c;定制化項目、 源碼、代碼講解、文檔撰寫、ppt制作。做自己喜歡的事&#xff0c;生活就是快樂的。 &#x1f34a;心愿&#xff1a;點…

從零到一:用 Qt + libmodbus 做一個**靠譜**的 Modbus RTU 小工具(實戰總結)

文章目錄從零到一&#xff1a;用 Qt libmodbus 做一個**靠譜**的 Modbus RTU 小工具&#xff08;實戰總結&#xff09;你會得到什么快速背景&#xff1a;為什么是 Modbus RTU&#xff1f;協議速查&#xff08;夠用不啰嗦&#xff09;工程結構與 UI 組織連接“三板斧”&#xf…