首先,我是JavaScript的新手,为了更好地理解OOP,我决定构建单人纸牌游戏(请记住,三张牌)。在单人纸牌游戏中(我确信这是众所周知的),您以任何模式分发纸牌,其余纸牌放在一边。我称这些为“备用”套牌。然后,您按照游戏规则移动所处理的卡(只能将红色6放在黑色7上,依此类推),当用尽所有选项时,您可以将三张卡从“保留”的顶部拉出并看到如果您可以使用第三张卡继续播放。如果没有,则再拉三张牌,依此类推,直到“储备”卡牌中的卡用完为止。此时,您可以将所有从“备用”卡座顶部拔出的卡放回到“备用”卡座,然后以相同的方式重复使用。
这是我的JavaScript损坏的地方。因此,我创建了一个具有属性playSlots
,winSlots
,reserve
和pick
的Table对象。 playSlots
是发牌的数组阵列,reserve
是“预留”卡片组中存在的牌数组,winSlots
与该问题无关,{ {1}}是一个数组,在整个游戏过程中都需要填充pick
中的卡片。很不言自明。 reserve
为空,并且您想将reserve
卡放回去时,目前我的代码是:
pick
这个问题是,它只会遍历if(!Array.isArray(newGame.reserve) || !newGame.reserve.length){
newGame.pick.forEach(function(cur, i, arr){
newGame.reserve.push(arr.shift());
});
}
数组中卡片的一半。我在调试器中进行了检查,实际上是一次将卡片重新添加到备用卡中,但是一旦到达第13张卡片,它就会退出循环(以单人纸牌方式分发28张卡片,将24个保留在备用甲板中...)。
我非常确定此问题与pick
条件有关。这种情况是我在这里找到的:
Check if array is empty / does not exist. JS
尽管回答者对他的解释很清楚,但是我对它的含义还是有点模糊。事实是,我也尝试过以下条件:
!newGame.reserve.length
,结果完全相同。 if(newGame.reserve[0] === undefined)
循环仅迭代了一半的数组元素。...我在这里错过了什么?
答案 0 :(得分:0)
您可以使用Array splice
轻松实现这一点注意:这会将选择反向转换为保留的末尾,而您的代码则不会
如果您不需要颠倒它,只需删除.reverse()
尚不清楚您是否要选择拨回储备金
var newGame = {
pick: [1,2,3,4],
reserve: [10,11,12]
};
newGame.reserve.push(...newGame.pick.splice(0, newGame.pick.length).reverse());
console.log(newGame);
在“旧学校” javascript中,可以使用.push.apply
var newGame = {
pick: [1,2,3,4],
reserve: [10,11,12]
};
newGame.reserve.push.apply(newGame.reserve, newGame.pick.splice(0, newGame.pick.length).reverse());
console.log(newGame);