戰(zhàn)棋游戲移動(dòng)范圍算法
---------------------------------------------------------------------------------
做一個(gè)四邊格戰(zhàn)棋類游戲的移動(dòng)范圍算法。
基本規(guī)則是:
? ? 四邊格,只允許臨邊移動(dòng)(上、下、左、右)。
? ? 有計(jì)步規(guī)則,每個(gè)格的計(jì)步權(quán)重為“1”。
? ? 障礙格不許移動(dòng)。
實(shí)現(xiàn)邏輯:
while (步數(shù) > 0) {
? ? 1. 設(shè)置角色當(dāng)前的位置
? ? 2. 計(jì)算當(dāng)前剩余的步數(shù)
? ? 3. 分別判斷當(dāng)前格子四周是否可以移動(dòng)(是否為障礙格或已達(dá)到邊界)
}
```
? ? ?+----+
? ? ?| 02 |
+----+----+----+
| 01 | 00 | 03 |
+----+----+----+
? ? ?| 04 |
? ? ?+----+
```
/**
* 獲取角色移動(dòng)范圍
* @param __actorSite__ 角色位置
* @param __moveRange__ 角色可移動(dòng)范圍
*/
XXX.prototype.getMovingRangeSites = function (__actorSite__, __moveRange__) {
? ?// 地圖大小
? ?let mapSize = this._battleAPI._battleData.getMapSize();
? ?// 初始化
? ?let siteHasBeenChosenArr = new Array(mapSize.width);
? ?for (let i = 0; i < siteHasBeenChosenArr.length; ++i) {
? ? ? ?siteHasBeenChosenArr[i] = new Array(mapSize.height);
? ?}
? ?// 檢索site是否被選擇的臨時(shí)用數(shù)組,標(biāo)記全地圖的site是否被使用
? ?for (let i = 0; i < mapSize.width; ++i) {
? ? ? ?for (let j = 0; j < mapSize.height; ++j) {
? ? ? ? ? ?siteHasBeenChosenArr[i][j] = 0;
? ? ? ?}
? ?}
? ?// 初始化結(jié)果數(shù)組
? ?let rangeSitesArr = [];
? ?// 判斷range范圍是否合法
? ?if (__moveRange__ >= 1 && __moveRange__ <= 20) {
? ? ? ?//
? ? ? ?let cellsToBeCheckArr = [];
? ? ? ?cellsToBeCheckArr.push(__actorSite__);
? ? ? ?// 根據(jù)角色移動(dòng)的步數(shù)檢索幾次
? ? ? ?for (let index = 1; index <= __moveRange__; index++) {
? ? ? ? ? ?// 臨時(shí)保存本次檢查出來的site
? ? ? ? ? ?let tempArr = [];
? ? ? ? ? ?// 當(dāng)前步數(shù)能走到的site
? ? ? ? ? ?for (const iterator of cellsToBeCheckArr) {
? ? ? ? ? ? ? ?// 檢索順序:左 上 右 下
? ? ? ? ? ? ? ?// 相鄰節(jié)點(diǎn)坐標(biāo)
? ? ? ? ? ? ? ?let siteLeft = {
? ? ? ? ? ? ? ? ? ?x: iterator.x - 1,
? ? ? ? ? ? ? ? ? ?y: iterator.y
? ? ? ? ? ? ? ?};
? ? ? ? ? ? ? ?// 判斷是否滿足邏輯要求的條件 及 檢索時(shí)是否已經(jīng)選擇過該點(diǎn)
? ? ? ? ? ? ? ?if (this._checkSiteEnable(siteLeft) && !this._checkSiteHasBeenChosen(siteLeft, siteHasBeenChosenArr)) {
? ? ? ? ? ? ? ? ? ?// 將該點(diǎn)設(shè)置成一倍檢索狀態(tài)
? ? ? ? ? ? ? ? ? ?siteHasBeenChosenArr[siteLeft.x][siteLeft.y] = 1;
? ? ? ? ? ? ? ? ? ?// 保存該點(diǎn)到結(jié)果數(shù)組
? ? ? ? ? ? ? ? ? ?rangeSitesArr.push(siteLeft);
? ? ? ? ? ? ? ? ? ?// 保存該點(diǎn)到臨時(shí)數(shù)組,作為下次循環(huán)的根節(jié)點(diǎn)
? ? ? ? ? ? ? ? ? ?tempArr.push(siteLeft);
? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ?let siteUp = {
? ? ? ? ? ? ? ? ? ?x: iterator.x,
? ? ? ? ? ? ? ? ? ?y: iterator.y + 1,
? ? ? ? ? ? ? ?};
? ? ? ? ? ? ? ?if (this._checkSiteEnable(siteUp) && !this._checkSiteHasBeenChosen(siteUp, siteHasBeenChosenArr)) {
? ? ? ? ? ? ? ? ? ?siteHasBeenChosenArr[siteUp.x][siteUp.y] = 1;
? ? ? ? ? ? ? ? ? ?rangeSitesArr.push(siteUp);
? ? ? ? ? ? ? ? ? ?tempArr.push(siteUp);
? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ?let siteRight = {
? ? ? ? ? ? ? ? ? ?x: iterator.x + 1,
? ? ? ? ? ? ? ? ? ?y: iterator.y
? ? ? ? ? ? ? ?};
? ? ? ? ? ? ? ?if (this._checkSiteEnable(siteRight) && !this._checkSiteHasBeenChosen(siteRight, siteHasBeenChosenArr)) {
? ? ? ? ? ? ? ? ? ?siteHasBeenChosenArr[siteRight.x][siteRight.y] = 1;
? ? ? ? ? ? ? ? ? ?rangeSitesArr.push(siteRight);
? ? ? ? ? ? ? ? ? ?tempArr.push(siteRight);
? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ?let siteDown = {
? ? ? ? ? ? ? ? ? ?x: iterator.x,
? ? ? ? ? ? ? ? ? ?y: iterator.y - 1,
? ? ? ? ? ? ? ?};
? ? ? ? ? ? ? ?if (this._checkSiteEnable(siteDown) && !this._checkSiteHasBeenChosen(siteDown, siteHasBeenChosenArr)) {
? ? ? ? ? ? ? ? ? ?siteHasBeenChosenArr[siteDown.x][siteDown.y] = 1;
? ? ? ? ? ? ? ? ? ?rangeSitesArr.push(siteDown);
? ? ? ? ? ? ? ? ? ?tempArr.push(siteDown);
? ? ? ? ? ? ? ?}
? ? ? ? ? ?}
? ? ? ? ? ?// 將本次循環(huán)檢索出來的site 放入待檢查數(shù)組,以便下次循環(huán)使用
? ? ? ? ? ?cellsToBeCheckArr = tempArr;
? ? ? ?}
? ?} else {
? ? ? ?// range不合法時(shí)直接返回null
? ? ? ?rangeSitesArr = null;
? ?}
? ?return rangeSitesArr;
};
標(biāo)簽: