主要是为了体验(也是为了浪费时间玩它),我在JavaScript中做了一个简单的记忆卡游戏。我构建它是因为它有一个骨干框架,可以通过去掉实际实现轻松地进行扩展。这是我想在这里复习的脊梁,而且主要是:
var Card = (function() {
var self = Object.create({}, {
val: {
value: -1
},
index: {
value: -1
},
addTo: {
value: function(game) {
var random = -1;
counter = 0; //break counter to stop infinite loop. :)
while ((game.cards[random] !== undefined && counter <= 100) | random === -1) {
random = Math.round(game.cards.length * Math.random());
counter++;
}
this.index = random;
game.cards[random] = this;
}
},
isMatch: {
value: function(game) {
if (this.val == game.selected.val) {
game.matches++;
return true;
}
return false;
}
}
});
return self;
})();
var Game = (function() {
var self = Object.create({}, {
cards: {
value: new Array(30)
},
matches: {
value: 0
},
init: {
value: function(func) {
for (i = 0; i < this.cards.length / 2; i++) {
var card = Object.create(Card, {
val: {
value: i
}
});
var card2 = Object.create(Card, {
val: {
value: i
}
});
card.addTo(this);
card2.addTo(this);
}
if (typeof func === 'function') {
func();
}
}
},
selected: {
value: null
}
});
return self;
})();抱歉,这段时间太长了,这也是我想要复习的部分原因。
要了解如何实现它和完整的代码,请参阅这里
编辑: FYI,我意识到游戏目前是不可扩展的。例如,如果我希望有多种类型的匹配,我还不能做到这一点。我很确定我知道如何添加,但我想确保我的设计结构是坚实的,首先。
发布于 2011-06-15 12:18:13
我将从一些问题开始,因为你使用的技术,我没有太多的经验。
Object.create是非常非常新的,因此支持的范围不太广。这两个点共同导致(IMHO)非常笨重的代码,例如
var card = Object.create(Card,{ val:{ value: I });
这对于“普通”对象来说要简单得多:
var card = new Card(i);说到这一点,用这样一个“大”类来表示一张简单的卡片对我来说有点过分,但如果只是为了练习,那就没关系了。
然而,即使在实践中,addTo方法也写得很糟糕。最好将所有卡片按创建顺序放入数组中,然后对数组进行洗牌。看看费舍-耶茨,它被认为是洗牌的“标准”算法。
发布于 2011-06-17 15:14:49
首先,我看到两个类相互依赖,紧密耦合在一起。为什么Card对象需要知道自己在Array中的索引?
其次,卡片对象更新游戏对象,但是游戏对象包含一个卡片数组,这意味着游戏对象拥有一堆卡片对象。
如果要删除双重依赖项,则可以将isMatch方法重写为
isMatch: {
value: function(inCard) {
return (this.val == inCard.val);
}
}https://codereview.stackexchange.com/questions/2949
复制相似问题