【发布时间】:2018-07-14 02:41:05
【问题描述】:
首先,我是 JavaScript 新手,为了更好地理解 OOP,我决定构建纸牌游戏(请注意,三卡版本)。在纸牌中——我敢肯定这是众所周知的——你以 whatever 模式发牌,剩下的牌放在一边;我称这些为“储备”甲板。然后你按照游戏规则移动你发出的牌(只能将红色 6 放在黑色 7 上,等等),当你用完选项时,你可以从“储备”顶部拉出三张牌并查看如果您可以使用第三张牌继续玩。如果没有,你再拉三张牌,依此类推,直到你用完“储备”牌组中的牌。此时,您从“保留”套牌顶部拉出的所有卡片都可以放回“保留”套牌中,然后以相同的方式重复使用。
这就是我的 javascript 崩溃的地方。所以我创建了一个具有属性playSlots、winSlots、reserve 和pick 的表对象。 playSlots 是发牌的数组数组,reserve 是存在于“保留”牌组中的牌数组,winSlots 与此问题无关,pick 是一个数组在整个游戏过程中都需要使用来自reserve 的卡片。不言自明。 当reserve 变为空时并且您想将pick 卡片放回其中,我目前的代码是:
if(!Array.isArray(newGame.reserve) || !newGame.reserve.length){
newGame.pick.forEach(function(cur, i, arr){
newGame.reserve.push(arr.shift());
});
}
这样做的问题是它只遍历pick 数组中的一半 卡片。我在调试器中进行了检查,实际上是一次将一张牌添加回备用牌组,但是一旦到达第 13 张牌,它就会跳出循环(以单人纸牌模式分发 28 张牌) ,将 24 人留在后备甲板上……)。
我很确定这个问题与!newGame.reserve.length 条件有关。这种情况是我在这里找到的:
Check if array is empty / does not exist. JS
虽然回答者对此的解释非常清楚,但我仍然对它的含义有些模糊。问题是,我也尝试过这个条件:
if(newGame.reserve[0] === undefined)
并得到完全相同的结果。 .forEach 循环只迭代了一半以上的数组元素....我在这里缺少什么?
【问题讨论】:
-
在循环遍历数组时从数组中删除元素时,您通常需要向后迭代以避免重新索引。请参阅此相关帖子:Looping through array and removing items, without breaking for loop
-
console.log(arr)在循环内看看会发生什么...... -
不是循环只是试图实现
newGame.reserve.push(...newGame.pick.splice(0, newGame.pick.length)); -
@TylerRoper 好的,但这不会将元素放入“保留”数组中吗?如果是这样,那在游戏的上下文中就行不通了……我想如果这是唯一的方法,那就有
.reverse()方法,但是……真的吗? -
你的代码并没有把它们倒过来,是吗? (提示:它没有)
标签: javascript oop foreach