Моя Игра Памяти "Локомотива"


В основном для опыта (но и так я мог тратить часы, играя его), я сделал простой карточная игра памяти в JavaScript. Я построил его так, что он имеет костяк основы, которая может быть легко расширена путем срывания своей фактической реализации. Это костяк я бы остановился здесь, и в основном:

  1. Мой ОО - ничего плохого; ничего, что могло бы улучшить?
  2. Очевидная эффективность кода: нет ничего, что могло бы сделать его более эффективным?
  3. Структура: структура игры хорошая идея?

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;
})();

К сожалению про длину, это частично, почему я хочу его пересмотреть.

Чтобы узнать, как его реализовать и полный код см. здесь

Редактировать: кстати, я понимаю, что игра в данный момент не растяжимо. Например, если я хотела, чтобы было несколько типов игр, я не могу пока. Я уверен, что я знаю, как добавить это, но я хотел убедиться, что моя конструкция была лучше.



Комментарии
2 ответа

Я начну с некоторых вопросов, потому что вы используете методы, которые не имеют большого опыта работы с.


  • Какой среде вы планируете использовать? (Или другими словами, какие браузеры вы хотите поддержать?) Объект.создать очень новый и не очень широкое распространение.

  • Зачем вы оборачиваете всех свойств и методов в своей "суб-объекты"?

Оба пункта вместе приводят к (ИМХО) очень громоздкий код


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

что будет намного проще с "нормальными" объектами:

var card = new Card(i);

Кстати, с помощью такого "большого" класса, представляют собой простую карту видит, немного перебор для меня, но если это просто для практики это нормально.

Однако даже на практике добавить способ плохо написано. Наверное, лучше разложить все карты в массив в порядке создания, а затем перемешать массив. Взгляните на Фишер-Йейтс , который считается "стандартный" алгоритм для перетасовки.

1
ответ дан 15 июня 2011 в 12:06 Источник Поделиться

Сначала я вижу, что оба класса зависят друг от друга и тесно взаимосвязаны вместе. Почему объект карты нужно знать собственный индекс в массиве?

Во-вторых, объект карты обновляет объект игры, но цель игры содержит в себе множество карт, что означает, что объект игра владеет кучей объектов карты.

Если вы должны были убрать двойной зависимостью, то вы могли бы переписать свой метод ismatch быть

    isMatch: {
value: function(inCard) {
return (this.val == inCard.val);
}
}

2
ответ дан 17 июня 2011 в 03:06 Источник Поделиться