成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Openharmony 軍棋工兵尋徑算法的實現(xiàn)

系統(tǒng) OpenHarmony
在軌道上自由移動,怎樣走都行,只要不超過 軌道的區(qū)域,想走多遠就走多遠,但是如果有個棋子(不論敵我)堵住路 線,你就不能按照那個路線行進;同時我們還要尋找到最近的路徑。

??想了解更多關(guān)于開源的內(nèi)容,請訪問:??

??51CTO 開源基礎(chǔ)軟件社區(qū)??

??https://ost.51cto.com??

一、引言

工兵可在鐵路線上任意行走,其它棋子在鐵路線上只能直走或 經(jīng)過弧形線,不能轉(zhuǎn)直角彎; 工兵在普通路線上跟其他棋子一樣,走一格。但是在軌道上,就 如入無人之地了。可以在軌道上自由移動,怎樣走都行,只要不超過 軌道的區(qū)域,想走多遠就走多遠,但是如果有個棋子(不論敵我)堵住路 線,你就不能按照那個路線行進;同時我們還要尋找到最近的路徑。

openharmony 軍棋工兵尋徑算法的實現(xiàn)-開源基礎(chǔ)軟件社區(qū)

二、算法分析

大體要求

1、工兵從起點到終點過程中不能有障礙物阻擋。

2、如何尋求到路徑最短?且是否用時最快。

3、也有可能起點到終點是死路。

軍旗的工兵走法特別像迷宮走法

迷宮算法

1、深度優(yōu)先搜索(DFS)

它和遞歸的探測思路是基本一致的,可以看成是遞歸方式的非遞歸版本。

2、廣度優(yōu)先搜索(BFS)

廣度優(yōu)先搜索法利用隊列的特點,一層層向外擴展查找可走的方塊,直到找到出口為止,最先找到的這個答案就必然是最短的。

3、根據(jù)特點我們希望最先找到最短的距離故采用bfs的方式。

采用隊列來記錄探測點;當前探測點的四個方向,可以通過的點,保存到這個隊列中,并移除當前探測點。

openharmony 軍棋工兵尋徑算法的實現(xiàn)-開源基礎(chǔ)軟件社區(qū)

右 下 左 上 的 四個方向探測。

openharmony 軍棋工兵尋徑算法的實現(xiàn)-開源基礎(chǔ)軟件社區(qū)

采用一個二維數(shù)組來存儲 x,y上的障礙物,和探測的點。

let noChessBoard: number[][] = [ // a[j][h]代表j行h列數(shù)據(jù)  // 1,行:row 2、列:column  export const ROW = 12  export const COLUMN = 4
[1, 1, 1, 1, 1],
[0, 0, 0, 0, 0],
[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0],
[0, 0, 0, 0, 0],
[0, 1, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0],
[0, 0, 0, 0, 0],
[1, 1, 1, 1, 1]]

代碼實現(xiàn)

(1)獲取到起點和終點坐標。

this.routeNode = this.engineerRoute(firstChess, moveChess);

(2)獲取二維數(shù)組迷宮標記。

二維數(shù)組是記錄棋盤上 0 是表示可通狀態(tài),1表示不可通。默認是棋盤鐵路都為0可通。

然后,敵方和友方其中全部設(shè)置為不可通1。

// 工兵路徑尋找 (bfs 廣度優(yōu)先搜索)
private engineerRoute(start: Chess, end: Chess): RouteNode {
let noChessBoard: number[][] = [ // a[j][h]代表j行h列數(shù)據(jù) // 1,行:row 2、列:column export const ROW = 12 export const COLUMN = 4
[1, 1, 1, 1, 1],
[0, 0, 0, 0, 0],
[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0],
[0, 0, 0, 0, 0],
[0, 1, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0],
[0, 0, 0, 0, 0],
[1, 1, 1, 1, 1]]

for (let i = 0;i < this.aList.length; i++) {
let a = this.aList[i]
noChessBoard[a.y][a.x] = 1
}
for (let i = 0;i < this.bList.length; i++) {
let b = this.bList[i]
noChessBoard[b.y][b.x] = 1
}

return this.bfs(start, end, noChessBoard)
}

(3)進行廣度優(yōu)先搜索。

private bfs(start: Chess, end: Chess, roads: number[][]): RouteNode{
Logger.d(TAG, `bfs roads:${JSON.stringify(roads)}`)
Logger.d(TAG, `bfs start:${JSON.stringify(start)}`)
Logger.d(TAG, `bfs end:${JSON.stringify(end)}`)
let routeQueue = new MyArrayQueue()
let first = new RouteNode(start.x, start.y, 0)
routeQueue.push(first)
while (routeQueue.size() != 0) {
Logger.d(TAG, `bfs scan while routeQueue:${JSON.stringify(routeQueue)}`)
let node = routeQueue.pop()
Logger.d(TAG, `bfs scan pop node:${JSON.stringify(node)}`)
let x = node.x
let y = node.y
if (x === end.x && y === end.y) {
return node
// break
}
for (var i = 0; i < 4; i++) {
let tx = x + this.dx[i]
let ty = y + this.dy[i]
Logger.d(TAG, `bfs scan tx:${tx} ty:${ty}`)
if (tx >= 0 && tx <= COLUMN && ty >= 0 && ty <= ROW && roads[ty][tx] === 0) { // 如果該位置可以走動
// 入隊
Logger.d(TAG, `bfs add tx:${tx} ty:${ty}`)
let temp = new RouteNode(tx, ty, node.step + 1)
temp.prev = node
routeQueue.push(temp)
Logger.d(TAG, `bfs scan push :${JSON.stringify(routeQueue)}`)
roads[ty][tx] = 1
}
}
// 擴展完
Logger.d(TAG, `bfs scan one end...`)
}
return null
}

(4)本案例還記錄路徑,采用的是鏈表數(shù)據(jù)結(jié)構(gòu)。

每次 把prev給記錄下來。這下就可以追溯到整個完整的探測路線。

export class RouteNode extends Point {
prev: RouteNode ; //前一個節(jié)點
next: RouteNode ; //下一個節(jié)點
step: number
constructor(x: number, y: number, step: number) {
super(x, y)
this.step = step
}
}

(5)隊列是自己利用數(shù)組改成的。

openharmony 目前 Deque、Queue 有bug,沒法用;只能用數(shù)組,然后 數(shù)組的pop是最后一個,就把探測順序插入第一個。

export class MyArrayQueue {
nodes: RouteNode[]
constructor() {
this.nodes = new Array
}

push(node: RouteNode) {
Logger.d(TAG, `push ...:${JSON.stringify(node)}`)
this.nodes.unshift(node)
Logger.d(TAG, `push end.:${JSON.stringify(this.nodes.length)}`)
}

pop(): RouteNode{
return this.nodes.pop()
}

size() {
return this.nodes.length
}
}

三,總結(jié)

可能代碼直接拷貝過去跑不通。

本文也就闡述一種思維,同時體現(xiàn)一下openharmony目的能力可達之處。

??想了解更多關(guān)于開源的內(nèi)容,請訪問:??

??51CTO 開源基礎(chǔ)軟件社區(qū)??

??https://ost.51cto.com??

責任編輯:jianghua 來源: 51CTO 開源基礎(chǔ)軟件社區(qū)
相關(guān)推薦

2022-12-19 16:56:48

游戲開發(fā)鴻蒙

2023-12-20 08:35:54

Dijkstra算法A*算法計算機圖形學(xué)

2012-08-13 14:17:35

算法代碼

2017-07-26 15:59:51

尋路算法Dijkstra游戲

2022-03-08 08:55:35

黑客網(wǎng)絡(luò)工兵

2021-07-29 15:46:28

數(shù)字藍耘算力

2022-05-31 15:27:11

CSS動畫

2021-01-28 10:55:31

算法可視化數(shù)據(jù)

2022-07-19 20:33:38

MQTT阿里云IoT服務(wù)

2022-05-27 14:55:34

canvas畫布鴻蒙

2023-06-14 15:15:13

刪除列表項新增列表項

2024-06-20 11:11:07

2022-07-25 14:17:04

JS應(yīng)用開發(fā)

2022-06-28 14:42:26

ETS購物車應(yīng)用

2022-06-20 15:27:00

socket對話鴻蒙

2022-03-03 19:31:31

隊列算法Harmony

2017-04-11 21:03:50

機器人智能化人工智能

2022-08-10 16:08:38

鴻蒙CSS

2015-08-17 15:17:37

數(shù)據(jù)中心數(shù)據(jù)中心效率

2022-03-21 15:42:36

智能家居物聯(lián)網(wǎng)MQTT
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产一级黄色网 | 国产精品久久久久久久久久 | 亚洲欧美综合 | 精品在线观看一区 | 在线视频一区二区三区 | 99视频在线播放 | 在线一区视频 | 亚洲精品一区二区三区免 | 亚洲成人免费在线 | 日韩一级电影免费观看 | 亚洲视频在线看 | 男人天堂网址 | 瑟瑟免费视频 | 中文字幕国产一区 | 欧美天堂在线观看 | 韩日精品一区 | 黄色免费在线观看网站 | 中文字幕一区二区三区在线观看 | 久久精品91 | 在线伊人网 | 特级a欧美做爰片毛片 | 国产精品1区2区3区 国产在线观看一区 | 中国一级特黄视频 | 国产网站在线免费观看 | 亚洲综合在线播放 | 日韩精品无码一区二区三区 | 精品精品视频 | 国产精品久久av | 欧美国产日韩一区二区三区 | 亚洲精品视频二区 | 久久久91精品国产一区二区三区 | 欧美一级黄色片 | 蜜桃精品视频在线 | 久久久久久久国产精品影院 | 成人在线免费看 | 国产视频线观看永久免费 | 久久伊人影院 | 天天天操操操 | 久久久久九九九女人毛片 | 成人国产精品视频 | 成人高潮片免费视频欧美 |