JavaScript纸牌游戏中玩家手的体系结构

JavaScript纸牌游戏中玩家手的体系结构,javascript,architecture,refactoring,Javascript,Architecture,Refactoring,所以,我在尝试简单的纸牌游戏。我有player“class”和draw功能,还有公共成员deck和hand,都是数组 我需要从牌组中抽出一张牌,把它放在手上,并在玩家的“手”区域显示它。我担心我“翻转”和“播放”按钮的方式(通过闭包) 代码如下: littlegame.player.prototype.draw = function() { if (this.canDrawCard()) { var card = this.deck.draw(); // this.dec

所以,我在尝试简单的纸牌游戏。我有
player
“class”和
draw
功能,还有公共成员
deck
hand
,都是数组

我需要从牌组中抽出一张牌,把它放在手上,并在玩家的“手”区域显示它。我担心我“翻转”和“播放”按钮的方式(通过闭包)

代码如下:

littlegame.player.prototype.draw = function() {
    if (this.canDrawCard()) {
        var card = this.deck.draw(); // this.deck is Array

        //Create card element on the playfield

        var card_object = $('<div class="card"></div>').append($('<span class="attack">' + card.attack + '</span>')).append($('<span class="defence">' + card.defence + '</span>'));

        // Add controls to card
        if (this.playerid == 1) {
            var flipper = $('<span class="flip">Flip</span>');
            flipper.click(function(){
                card.flip();
            });

            var actuator = $('<span class="play">Play</span>');
            console.log('Loading actuator closure with id ' + this.playerid + ' and name ' + this.playername);
            var player = this;

            var old_hand = this.hand.slice(0); // Store a copy of old hand. Stupid trick, i know. It doesn't work

            actuator.click(function(){
                card.play(player.playerid);
                delete card;
                player.hand = old_hand;
            });

            card_object = card_object.append(flipper).append(actuator);
        }

        this.element.append(card_object);
        card.element = card_object;

        // Put card in hand
        this.hand.push(card);
    }
};
littlegame.player.prototype.draw=function(){
if(this.canDrawCard()){
var card=this.deck.draw();//this.deck是数组
//在操场上创建卡片元素
var card_object=$('').append($(''+card.attack+'').append($(''+card.defence+'');
//将控件添加到卡中
如果(this.playerid==1){
变量flipper=$('Flip');
flipper.click(函数(){
card.flip();
});
var执行器=$('Play');
console.log('加载id为'+this.playerid+'和名称为'+this.playername'的致动器闭合装置);
var player=这个;
var old_hand=this.hand.slice(0);//存储一份old hand的副本。我知道这是个愚蠢的把戏。它不起作用
执行器。单击(功能(){
纸牌游戏(player.playerid);
删除卡片;
player.hand=旧手;
});
卡片对象=卡片对象。附加(翻转器)。附加(执行器);
}
this.element.append(card\u对象);
card.element=card\u对象;
//持卡
这个。手。推(卡);
}
};

我需要的是一种调用
card.play()
card.flip()
的方法,使用
card.play,在手上知道卡的位置,然后取出卡。我怎样才能做到这一点?

我尝试了以下方法。我不得不在闭包中留下手牌阵列的位置以及玩家和牌本身的链接。事情是这样的:

littlegame.player.prototype.draw = function() {
    if (this.hand.length < this.agility) {
        var card = this.deck.draw();

        // Put card in hand
        this.hand.push(card);

        var card_in_hand = this.hand[this.hand.length - 1];
        var card_position = this.hand.length;

        //Create card element on the playfield
        var card_object = $('<div class="card"></div>').append($('<span class="attack">' + card.attack + '</span>')).append($('<span class="defence">' + card.defence + '</span>'));

        // Add controls to card
        if (this.playerid == 1) {
            var flipper = $('<span class="flip">Flip</span>');
            flipper.click(function(){
                card_in_hand.flip();
            });

            var actuator = $('<span class="play">Play</span>');
            console.log('Loading actuator closure with id ' + this.playerid + ' and name ' + this.playername);
            var player = this;

            actuator.click(function(){
                card_in_hand.play(player.playerid);
                player.hand.remove(card_position);
            });

            card_object = card_object.append(flipper).append(actuator);
        }


        this.element.append(card_object);
        card_in_hand.element = card_object;
    }
};
littlegame.player.prototype.draw=function(){
if(this.hand.length
我还使用了John Resig的
Array.remove()

littlegame.player.prototype.draw=function(){
littlegame.player.prototype.draw = function() {
        if (this.canDrawCard()) {
                var card = this.deck.draw(); // this.deck is Array

                //Create card element on the playfield

                var card_object = $('<div class="card"></div>').append($('<span class="attack">' + card.attack + '</span>')).append($('<span class="defence">' + card.defence + '</span>'));

                // Add controls to card
                if (this.playerid == 1) {
                        var flipper = $('<span class="flip">Flip</span>');
                        flipper.click(function(){
                                card.flip();
                        });

                        var actuator = $('<span class="play">Play</span>');
                        console.log('Loading actuator closure with id ' + this.playerid + ' and name ' + this.playername);
                        var player = this;

                        var old_hand = this.hand.slice(0); // Store a copy of old hand. Stupid trick, i know. It doesn't work

                        actuator.click(function(){
                                card.play(player.playerid);
                                delete card;
                                player.hand = old_hand;
                        });

                        card_object = card_object.append(flipper).append(actuator);
                }

                this.element.append(card_object);
                card.element = card_object;

                // Put card in hand
                this.hand.push(card);
                var hand = this.hand;
                card.remove = function () {
                     var i;
                     for(i=0;i<hand.length;i++) {
                       if(hand[i]===this) {
                           hand.splice(i,1);
                       }
                     }
                }
        }
};
if(this.canDrawCard()){ var card=this.deck.draw();//this.deck是数组 //在操场上创建卡片元素 var card_object=$('').append($(''+card.attack+'').append($(''+card.defence+''); //将控件添加到卡中 如果(this.playerid==1){ 变量flipper=$('Flip'); flipper.click(函数(){ card.flip(); }); var执行器=$('Play'); console.log('加载id为'+this.playerid+'和名称为'+this.playername'的致动器闭合装置); var player=这个; var old_hand=this.hand.slice(0);//存储一份old hand的副本。我知道这是个愚蠢的把戏。它不起作用 执行器。单击(功能(){ 纸牌游戏(player.playerid); 删除卡片; player.hand=旧手; }); 卡片对象=卡片对象。附加(翻转器)。附加(执行器); } this.element.append(card\u对象); card.element=card\u对象; //持卡 这个。手。推(卡); var hand=this.hand; card.remove=函数(){ var i;
对于(i=0;哦,不走运。卡片有时只是留在手中:(为什么,哦,为什么JavaScript数组不像PHP数组?嗯。如果,比方说,我从手上拼接第三张牌,剩下的牌不会从1移到开头吗?
card.delete
很酷,我现在就试试。是的,但是因为我手头没有你的设计文档,我也不知道你在玩什么纸牌游戏,我不得不猜测你想要什么t、 事实上,我没有设计文档:)问题是在数组中存储指向对象的持久链接,这样当数组元素被删除时它们不会停止工作。无论如何,您的方法似乎确实很有效。谢谢:)