1

オブジェクト リテラルと配列のループに問題があると思います。以前に配列を使用していた「マップ」にオブジェクト リテラルを使用しようとしています。オブジェクト リテラルを使用する理由は、変数にその位置の名前を表示させたいからです。今のところ、常に loc[2][1] = player; で問題が発生します。

var room0 = [
        [blank, blank, blank, blank],
        [blank, blank, blank, blank],
        [blank, player, blank, doorRight],
        [blank, blank, blank, blank]
];
var room1 = [
        [blank, blank, blank, blank],
        [blank, blank, blank, blank],
        [blank, blank, blank, blank],
        [blank, blank, blank, blank]
];

var loc = room0;

var map = {
    "living room": room0,
    "Bedroom": room1,
    "Outside": room2
};

function moveRight() {
    for (var y = 0; y < loc.length; y++) {
        var posX = loc[y].indexOf(player);
        if (posX <= -1) continue;

        // if going to the next room to the right
        if (loc[y][posX+1] == doorRight) {

            for (var name in map) {
                if (loc == map[name]) {
                    var rightLoc = map[name+1];
                }
            }


            loc[y][posX] = blank;
            loc = rightLoc;
            loc[2][1] = player;
            break;
        }

        if (loc[y][posX+1]  != blank) break;
        if (posX < loc[y].length - 1) {
            loc[y][posX] = blank;
            loc[y][posX + 1] = player; 
        }
        break;
    }
}
4

2 に答える 2

3

map[name+1]で識別される次の部屋を魔法のように指していないため、マップにさまざまなものを保持する必要がありますname

var map = {
    "living room": 0,
    "Bedroom": 1,
    "Outside": 2
};

var rooms = [room0, room1, room2];

ではmap['living room']、 にインデックスが保持されるため、rooms数値加算を使用して次の部屋に「移動」できます。コードは次のようになります。

var rightLoc;

for (var name in map) {
    if (loc == map[name]) {
        rightLoc = map[name] + 1;
    }
}

loc = rooms[rightLoc];

このコードには、常に入る余地があることを確認するためのチェックがまだいくつか欠けていますが、自分でそれを理解できると確信しています:)

于 2013-05-02T07:35:31.297 に答える
2

そのコード行に到達すると、rightLocが未定義になるようです。

変数rightLocは次の値に設定されます。map[name + 1]

mapのプロパティは文字列なので、でname + 1終わる文字列になります1

したがって、map[name + 1]は未定義であり、逆参照できません。

重要な点は、for ループがオブジェクトのプロパティを反復処理していることです。

ループの反復ごとに、name は文字列になります。

問題を示すフィドルは次のとおりです。

var map = {
    "living room": 'room0',
        "Bedroom": 'room1',
        "Outside": 'room2'
};

for (var name in map) {
    if (name === 'Bedroom') {
        var badKey = name + 1;
        var theType = typeof map[badKey];
        alert('key: ' + badKey + ' type: ' + theType);
    }
}

出力:

key: Bedroom1 type: undefined 

MDNのドキュメント を読むと、 for in ループがオブジェクト プロパティを任意の順序で反復することがわかります。つまり、この手法は機能しません。


このようなエラーをすばやく見つけるのに役立つ 2 つの重要なツール:

  • ドキュメントを読んでください (google " javascript mdn for in loop ")
  • デバッガーの使用法を学ぶ (変数の検査は、 Firebugを使用すると非常に簡単です)
于 2013-05-02T07:03:42.840 に答える