2017-01-04 13 views
1

私は自分のプログラムで直面している方向を確認しています: 'N'、 'E'、 'S'、W '。現在の方向を確認するswitch文を作成し、コマンドを右( 'r')にするか左に( 'l)するかによって、方向を変更してユーザーに新しい方向を返します。私は配列を呼び出すと、最後の方向とコマンドに従って正しい方向に着陸するようにインデックスの位置を減算することでそれをしようとしています。私はそれを正しくしていないと確信しています。これまでのところ私のコードがあります(コンテキストにオブジェクトが含まれています)。私はJavascriptを初めて使う人です。if/elseステートメントまたはswitchステートメントで、どのように異なるインデックス位置を返すのですか?

var myRover = { 
 
    position: [0,0], 
 
    direction: 'N', 
 
    roverDirections = ['N', 'E', 'S', 'W'], 
 
    marsGrid: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], 
 
    obstacles: [] 
 
}; 
 

 
function turn(command){ 
 

 
    if (command === 'l') { 
 

 
     switch (myRover.direction) { 
 
     case 'N': 
 
     myRover.direction = (myRover.roverDirections.length - 1) 
 
     break; 
 
     case 'E': 
 
     myRover.direction = (myRover.roverDirections.length - 4) 
 
     break; 
 
     case 'S': 
 
     myRover.direction = (myRover.roverDirections.length - 3) 
 
     break; 
 
     case 'W': 
 
     myRover.direction = (myRover.roverDirections.length - 2) 
 
     break; 
 
     } 
 

 
    if (command === "r") { 
 
     switch (myRover.direction) { 
 
     case 'N': 
 
     myRover.direction = (myRover.roverDirections.length - 3) 
 
     break; 
 
     case 'E': 
 
     myRover.direction = (myRover.roverDirections.length - 2) 
 
     break; 
 
     case 'S': 
 
     myRover.direction = (myRover.roverDirections.length - 1) 
 
     break; 
 
     case 'W': 
 
     myRover.direction = (myRover.roverDirections.length - 4) 
 
     break; 
 
    }

また、これをループすると、はるかに効率的であるかもしれないことを私に起こっています。しかし、私がインデックスの位置付けを理解することなくそれを概念化するのは難しいです。

+0

'と新しいdirection'戻る - まあ、あなたは' –

答えて

0

インデックスを使用せず、新しい方向を直接調整するのはなぜですか?

function turn(command) { 
    var direction = myRover.roverDirections.indexOf(myRover.direction); 
    if (command === 'l') { 
     direction++; 
    } else if (command === 'r') { 
     direction += 3; 
    } 
    return myRover.direction = myRover.roverDirections[direction % 4]; 
} 

またはオブジェクト

function turn(command) { 
    var direction = myRover.roverDirections.indexOf(myRover.direction); 
    direction += { l: 1, r: 3 }[command] || 0; 
    return myRover.direction = myRover.roverDirections[direction % 4]; 
} 
+0

ありがとう関数から値をreturn'するために 'return'書が必要になりますが!これは優雅な解決策のようです。なぜ我々はその方向をモジュロにするのだろうか? – universesurfer

+0

が必要なインデックスよりも大きい可能性があるためです。有効な範囲に制限します。 –

0

あなたの変数myRover.directionが文字列であると。関数の順番では、変数myRover.directionに文字列を渡す必要があります。ここでは、数を渡す(すなわち:(myRover.roverDirections.length - 1))ここで

例:

switch (myRover.direction) { 
    case 'N': 
    myRover.direction = myRoverDirections[3] 
    break; 
2

の代わりに、この配列から新たな方向性を得る

roverDirections = ['N', 'E', 'S', 'W'] 

どうしてこのようにしないのですか

case 'N': 
    myRover.direction = 'W' 
break 

エラープロンプトその配列の要素の順番でリレーするのではなく、コードがより記述的であるためです。

とにかく、あなたの関数が終了

function turn(command){ 

if (command === 'l') { 

    switch (myRover.direction) { 
    case 'N': 
    myRover.direction = (myRover.roverDirections.length - 1) 
    break; 
    case 'E': 
    myRover.direction = (myRover.roverDirections.length - 4) 
    break; 
    case 'S': 
    myRover.direction = (myRover.roverDirections.length - 3) 
    break; 
    case 'W': 
    myRover.direction = (myRover.roverDirections.length - 2) 
    break; 
    } 

if (command === "r") { 
    switch (myRover.direction) { 
    case 'N': 
    myRover.direction = (myRover.roverDirections.length - 3) 
    break; 
    case 'E': 
    myRover.direction = (myRover.roverDirections.length - 2) 
    break; 
    case 'S': 
    myRover.direction = (myRover.roverDirections.length - 1) 
    break; 
    case 'W': 
    myRover.direction = (myRover.roverDirections.length - 4) 
    break; 
} 
    return myRover.direction; 
} 

そして今、ちょうどあなたがこの機能を使用することができ

console.log(turn('l')) // prints 'W' 
+0

ありがとう!これは簡単な解決策です。今度は、実際にグリッド上でローバーの向きを変更する方法を理解するだけです。 – universesurfer

0

特定のコマンドを使用してその関数を呼び出すでreturnを追加し、任意の値を返すされていません。

function turn(command){ 
    return myRover.direction = myRover.roverDirections[ 
      (myRover.roverDirections.indexOf(myRover.direction) 
      + ' r l'.indexOf(command)) % 4]; 
} 
2

switchステートメントは不要です配列がすでに「時計回り」の順序でソートされている場合右に回すと、配列の次の要素を取得することを意味し、左に回すということは配列内の前の要素を取得することを意味します。

var myRover = { 
 
    direction: 'N', 
 
    roverDirections: ['N', 'E', 'S', 'W'], 
 
    turn: function(command) { 
 
    var offset = command === 'r' ? 1 : 3; 
 
    var oldDirectionIndex = this.roverDirections.indexOf(this.direction); 
 
    var newDirectionIndex = (oldDirectionIndex + offset) % 4; 
 
    this.direction = this.roverDirections[newDirectionIndex]; 
 
    return this.direction; 
 
    } 
 
}; 
 

 
console.log(myRover.turn('r')); 
 
console.log(myRover.turn('r')); 
 
console.log(myRover.turn('r')); 
 
console.log(myRover.turn('r')); 
 
console.log(myRover.turn('l')); 
 
console.log(myRover.turn('l')); 
 
console.log(myRover.turn('l')); 
 
console.log(myRover.turn('l'));

関連する問題