首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的记忆游戏“引擎”

我的记忆游戏“引擎”
EN

Code Review用户
提问于 2011-06-14 17:25:37
回答 2查看 2.1K关注 0票数 4

主要是为了体验(也是为了浪费时间玩它),我在JavaScript中做了一个简单的记忆卡游戏。我构建它是因为它有一个骨干框架,可以通过去掉实际实现轻松地进行扩展。这是我想在这里复习的脊梁,而且主要是:

  1. 我的天.有什么不对的地方吗?
  2. 明显的代码效率:有什么东西可以使它更高效吗?
  3. 结构:游戏的结构是个好主意吗?
代码语言: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,我意识到游戏目前是不可扩展的。例如,如果我希望有多种类型的匹配,我还不能做到这一点。我很确定我知道如何添加,但我想确保我的设计结构是坚实的,首先。

EN

回答 2

Code Review用户

回答已采纳

发布于 2011-06-15 12:18:13

我将从一些问题开始,因为你使用的技术,我没有太多的经验。

  • 您正在考虑使用什么运行时环境?(换句话说,您想要支持哪些浏览器?) Object.create是非常非常新的,因此支持的范围不太广。
  • 为什么要将所有属性和方法包装在它们自己的“子对象”中?

这两个点共同导致(IMHO)非常笨重的代码,例如

var card = Object.create(Card,{ val:{ value: I });

这对于“普通”对象来说要简单得多:

代码语言:javascript
复制
var card = new Card(i);

说到这一点,用这样一个“大”类来表示一张简单的卡片对我来说有点过分,但如果只是为了练习,那就没关系了。

然而,即使在实践中,addTo方法也写得很糟糕。最好将所有卡片按创建顺序放入数组中,然后对数组进行洗牌。看看费舍-耶茨,它被认为是洗牌的“标准”算法。

票数 1
EN

Code Review用户

发布于 2011-06-17 15:14:49

首先,我看到两个类相互依赖,紧密耦合在一起。为什么Card对象需要知道自己在Array中的索引?

其次,卡片对象更新游戏对象,但是游戏对象包含一个卡片数组,这意味着游戏对象拥有一堆卡片对象。

如果要删除双重依赖项,则可以将isMatch方法重写为

代码语言:javascript
复制
    isMatch: {
        value: function(inCard) {
            return (this.val == inCard.val);
        }
    }
票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/2949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档