繁体   English   中英

Function 总是返回相同的值

[英]Function always returning same value

我目前正在开发一款游戏,该游戏使用户能够将棋子放置到网格上。 一旦一块被放置在网格上,应该有一些功能可以防止更多的块被添加到相同的网格位置。 以下是我迄今为止为此功能设计的内容。

我遇到的问题是 function 总是返回 false,因此即使放置了船,也可以将碎片不断添加到相同的网格位置。 startend都是 integer 值, direction是水平或垂直:

    const checkIfShipPresent = (direction, start, end) => {
        if (direction === 'horizontal') {
            for (let i = start; i <= end; i++) {
                shipYard.forEach((ship => {
                    if (ship.position.includes(i)) {
                        return true;
                    }
                }))
            };
            return false;

下面的代码说明了我如何尝试测试 function:

    const checkIfShipPresent = (direction, start, end) => {
        if (direction === 'horizontal') {
            for (let i = start; i <= end; i++) {
                shipYard.forEach((ship => {
                    console.log(ship.position)
                    console.log(i)
                    console.log(ship.position.includes(i))
                    if (ship.position.includes(i)) {
                        console.log("triggered")
                        return true;
                    }
                }))
            };
            console.log("firing")
            return false;

以下是相关的控制台日志结果(将一艘船放置在网格位置 [0,1,2,3,4] 并单击单元格 0):

gameboardFactory.js:71 (5) [0, 1, 2, 3, 4]
gameboardFactory.js:72 0
gameboardFactory.js:73 true
gameboardFactory.js:75 triggered
gameboardFactory.js:71 (5) [0, 1, 2, 3, 4]
gameboardFactory.js:72 1
gameboardFactory.js:73 true
gameboardFactory.js:75 triggered
gameboardFactory.js:71 (5) [0, 1, 2, 3, 4]
gameboardFactory.js:72 2
gameboardFactory.js:73 true
gameboardFactory.js:75 triggered
gameboardFactory.js:71 (5) [0, 1, 2, 3, 4]
gameboardFactory.js:72 3
gameboardFactory.js:73 true
gameboardFactory.js:75 triggered
gameboardFactory.js:71 (5) [0, 1, 2, 3, 4]
gameboardFactory.js:72 4
gameboardFactory.js:73 true
gameboardFactory.js:75 triggered
gameboardFactory.js:80 firing

如果有船存在,我需要 function 返回 true,但正如您所见,它永远不会脱离循环,因此总是返回 false。

再次仔细查看代码的这一部分 - 特别是return true;

for (let i = start; i <= end; i++) {
    shipYard.forEach((ship => {
        if (ship.position.includes(i)) {
            return true;
        }
    }))
};
return false;

return从 - 并退出 - function 它在里面。 这是传递给forEach方法的匿名箭头 function 。 请注意, forEach实际上忽略了传递给它的回调的任何返回值——它只对传递给它的 function 的任何副作用有用。

如果您希望在if条件成立时从更广泛的 function 返回true ,则应使用标准for循环而不是forEach 这不涉及任何功能,因此return将按照您的意愿进行:

for (let i = start; i <= end; i++) {
    for (const ship of shipYard) {
        if (ship.position.includes(i)) {
            return true;
        }
    }))
};
return false;

(我使用了更简洁for... of循环形式,但是常规for (let j = 0; j < shipYard.length; j++)样式循环也可以正常工作。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM