0

私はJavascriptを学んでおり、プロジェクトの課題としてチェスゲームを作っています。ルーク、ポーン、ナイト、ビショップの動きのロジックをコーディングしました。今、クイーンの動きにハマっています。クイーンの移動は、基本的にビショップとルークの移動ロジックを含みます。

私がやりたいのは、クイーンが移動したときに、ソースタイルのファイルが宛先タイルと同じかどうかを確認することです。同じ場合は、Rook のコード移動ロジックを呼び出します。そうでない場合は、Bishop のコード移動ロジックを呼び出します。たとえば、クイーンが d4 (ソース タイル) に配置され、d8 または g4 (宛先タイル) に移動された場合。次に、この場合、Rook の move 関数を呼び出す必要があります。

すべてのピース オブジェクトには move() が含まれています。この場合、Queen の move() から Rook の move() を呼び出したいと思います。私はここで立ち往生しています。よろしくお願いします。関連するコードを以下に貼り付けます。同様に、Rook やその他のオブジェクトを作成しました。この Queen() の move() から、Rook/Bishop の move() を呼び出したいと思います。

        chess.QueenFactory =
            {
                instance: function(color, type)
                {
                    var Queen =
                            {
                                move: function(color, type)
                                {
                                    alert("In Queen");
                                }
                            };
                    createPiece.call(Queen, color, type);
                    return Queen;
                }
            };

ビショップのわざ機能はこんな感じで配置

chess.BishopFactory = 
{
    instance: function(color, type) 
    {
        var Bishop =
        {
            move: function(source, destn) 
            { //Code here
            }
        }
    }
}

この関数を Queen の move() から呼び出したいと思います。それ、どうやったら出来るの?

以下のhtmlリンクでコード全体を見つけてください。

https://github.com/varunpaprunia/ChessInJavascript/blob/master/ChessBoard_Tags_1.html

4

2 に答える 2

1

次のテストを実行して、使用する方法を決定します

// source tile
var a = 'abcdefgh'.indexOf(source_tile[0]), // 0 to 7
    b = parseInt(source_tile[1]) - 1;       // 0 to 7
// destination tile
var x = 'abcdefgh'.indexOf(dest_tile[0]),   // 0 to 7
    y = parseInt(dest_tile[1]) - 1;         // 0 to 7
// test to see how it's moving
if (a + b === x + y || a - x === b - y) {   // bLeft to tRight || tLeft to bRight
    // queen is moving like a bishop
} else if ( a === x || b === y) {           // top to bottom || left to right
    // queen is moving like a rook
} else {                                    // impossible move
    // invalid move
}

コメントから、どのフォローアップを呼び出すかがわかります。の場合a === x && b === ysource_tile === dest_tile、駒の移動とは見なされません。これらは、パスがブロックされているかどうかをチェックしません。そのためには、さらにロジックが必要です。

于 2013-06-30T13:15:58.053 に答える
0

私はこれができると思います:

function bishopFn(source, destn){ /* bishop move */}
function rookFn(source, destn){ /* rook move */ }

次に、それらをビショップとルークの移動オブジェクトに割り当てます。クイーンの場合は、状態に応じて任意のオブジェクトを呼び出すだけです。

move: function(source, destn){
    /* condition construction can be done here */
    if (/*condition*/) bishopFn(source, destn);
    else rookFn(source, destn);
}
于 2013-06-30T13:03:36.717 に答える