簡體   English   中英

盡管條件失敗,為什么項目被推入數組?

[英]why items are being pushed into array, despite failing conditional?

我正在 node.js 中編寫一個終端游戲,它會生成一個由以下組成的隨機字段

const hat = '^';
const hole = 'O';
const fieldCharacter = '░';
const pathCharacter = '*';

玩家需要穿過迷宮並找到他們的帽子。 字段表示為

randomArr

因為數組是隨機的,所以生成的字段可能無法通過,因為帽子被孔包圍,玩家根本無法到達那里,所以我正在制作一個算法首先檢查是否可能的功能獲勝(基本上是迷宮生成器)。 我有一個應該可以工作的代碼,但它無法正確執行,因為它陷入了無限循環。 它遇到了 conditional ,需要滿足條件才能將雙元素數組添加到嵌套數組中(條件是:相鄰方格必須是字段元素並且該方格之前沒有被訪問過)。 盡管不滿足第二個條件,算法會一遍又一遍地將相同的元素添加到數組中。

這是循環的開始:

while (true) {           
    //checking if next move is a winning move
    if (randomArr?.[p[0]]?.[p[1] + 1] === hat || randomArr?.[p[0]]?.[p[1] - 1] === hat || randomArr?.[p[0] + 1]?.[p[1]] === hat || randomArr?.[p[0] - 1]?.[p[1]] === hat) {
        console.table(visited, visitedTwice, visited3x, visited4x, visited5x);
        console.log(`solution found, reached postion ${p}`)
        return randomArr;
    }          
    //checking if neighbouring square hasn't been visited, if no, go there
    else if (randomArr?.[p[0]]?.[p[1] + 1] === fieldCharacter && !visited.includes([ p[0], p[1] + 1 ])) {
        p = [p[0], p[1] + 1];
        visited.push([p[0], p[1]]);
        //console.log(visited.includes([ p[0], p[1] + 1 ]), 0);
        //console.log(visited);
    } else if (randomArr?.[p[0]]?.[p[1] - 1] === fieldCharacter && !visited.includes([ p[0], p[1] - 1 ])) {
        p = [p[0], p[1] - 1];
        visited.push([p[0], p[1]]);
        //console.log(visited.includes([ p[0], p[1] - 1 ]), 1);
        //console.log(visited);
    } else if (randomArr?.[p[0] + 1]?.[p[1]] === fieldCharacter && !visited.includes([ p[0] + 1, p[1] ])) {
        p = [p[0] + 1, p[1]];
        visited.push([p[0], p[1]]);
        //console.log(!visited.includes([ p[0] + 1, p[1] ]), 2);
        //console.log(visited);
    } else if (randomArr?.[p[0] - 1]?.[p[1]] === fieldCharacter && !visited.includes([ p[0] - 1, p[1] ])) {
        p = [p[0] - 1, p[1]];
        visited.push([p[0], p[1]]);
        //console.log(!visited.includes([ p[0] - 1, p[1] ]), 3);
        //console.log(visited);

這段代碼繼續遍歷前 2 個 else if 語句,並不斷向visited的數組添加相同的元素。 (注釋掉的console.log語句是讓我檢查發生了什么)。

您不能使用!visited.includes([ p[0], p[1] + 1 ]) 數組是通過身份匹配的,而不是通過比較內容,所以這永遠不會是真的。

利用

!visited.some(([el1, el2]) => el1 == p[0] && el2 == p[1]+1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM