2016-12-27 3 views
-1

2次元配列で選択の履歴を作りたいと思います。 何私が得たことはこれです:結果は例えばあるとして私が欲しいものJavaScriptを使ったストリートファイターの選択

var fighters = [ 
["Ryu", "E.Honda", "Blanka", "Guile", "Balrog", "Vega"], 
["Ken", "Chun Li", "Zangief", "Dhalsim", "Sagat", "M.Bison"] 
]; 

var initial_position = (0,0) 
var moves = ['right', 'down', 'left', 'left', 'left', 'left', 'right'] 

['E.Honda', 'Chun Li', 'Ken', 'M.Bison', 'Sagat', 'Dhalsim', 'Sagat'] 

位置[0,0]上隅にあります。 私の問題は、選択された戦闘機が行の最初のものであることを意味する最初の行の選択が行われるかどうかを判断することです。しかし、選択は一番下の行の上にあるべきではありません!

この問題を解決できますか?

+0

: '(0,0)'だけ '0'です。 Javascriptにはタプルがありません。 – deceze

答えて

1

initial_positionにおけるいくつかの要素がfighters.lengthfighters[0].lengthであり、その最大数にリセットされ、最大その後、0または大きな少ないしているかどうかを確認できます。

var fighters = [ 
 
    ["Ryu", "E.Honda", "Blanka", "Guile", "Balrog", "Vega"], 
 
    ["Ken", "Chun Li", "Zangief", "Dhalsim", "Sagat", "M.Bison"] 
 
]; 
 

 
var moves = ['right', 'down', 'left', 'left', 'left', 'left', 'right'] 
 

 
var result = [] 
 
var ipos = [0, 0]; 
 
moves.forEach(function(e) { 
 
    if (e == 'right') { 
 
    ipos[0] += 1 
 
    } else if (e == 'left') { 
 
    ipos[0] -= 1 
 
    } else if (e == 'down') { 
 
    ipos[1] += 1; 
 
    } else if (e == 'up') { 
 
    ipos[1] -= 1 
 
    } 
 
    if (ipos[0] > fighters[0].length - 1 || ipos[0] < 0) ipos[0] = fighters[0].length - 1; 
 
    if (ipos[1] > fighters.length - 1 || ipos[1] < 0) ipos[1] = fighters.length - 1; 
 

 
    result.push(fighters[ipos[1]][ipos[0]]) 
 
}) 
 

 
console.log(result)

+0

私は 'fighters.length - 1;'で間違いを犯しましたが、 'fixed 'なので' down'にするとそれ以上の行が残ってしまいますが、それを変更して0にリセットすることもできます –

0

クールな...!私はifsとelsesが嫌いです...だから、fighters[0][0]の位置に常にターゲットセルを持っていくために、いくつかの機能を得て、私たちの発明の簡単なナビゲーションシステムを作りましょう。Array.prototype.rotate()

Array.prototype.rotate = function(n) { 
 
          var len = this.length; 
 
          return !(n % len) ? this.slice() 
 
              : this.map((e,i,a) => a[(i + (len + n % len)) % len]); 
 
         }; 
 

 
function navigate(m,f){ 
 
    var d = { left: a => a.map(e => e.rotate(-1)), 
 
      right: a => a.map(e => e.rotate(1)), 
 
       up: a => a.rotate(-1), 
 
      down: a => a.rotate(1) 
 
      }; 
 
    return m.reduce((p,c) => (f = d[c](f), p.concat(f[0][0])) ,[]); 
 
} 
 

 
var fighters = [["Ryu", "E.Honda", "Blanka", "Guile", "Balrog", "Vega"], 
 
       ["Ken", "Chun Li", "Zangief", "Dhalsim", "Sagat", "M.Bison"] 
 
       ], 
 
     moves = ['right', 'down', 'left', 'left', 'left', 'left', 'right']; 
 
console.log(navigate(moves,fighters));

これは非常に微細であるが、代わりに、常に[0] [0]の位置で標的細胞を維持するためにアレイを回転させる、一方は単にカーソルオブジェクトを保つことができると受信したコマンドに従ってカーソル位置を調整するメソッドを保持するようにdオブジェクトを変更します。次に、{x: 0, y: 0}のような追加のカーソルオブジェクトが必要です。私がもはやArray.prototype.rotate()というものを必要としないものを実装しようとしましょう。別に

function navigate(m,f){ 
 
    var c = {x: 0, y: 0}, 
 
     d = { left: c => (c.x = (c.x + f[c.y].length - 1 % f[c.y].length) % f[c.y].length,c), 
 
      right: c => (c.x = (c.x + f[c.y].length + 1 % f[c.y].length) % f[c.y].length,c), 
 
       up: c => (c.y = (c.y + f.length - 1 % f.length) % f.length,c), 
 
      down: c => (c.y = (c.y + f.length + 1 % f.length) % f.length,c) 
 
      }; 
 
    return m.reduce((p,n) => (d[n](c),p.concat(f[c.y][c.x])),[]); 
 
} 
 

 
var fighters = [["Ryu", "E.Honda", "Blanka", "Guile", "Balrog", "Vega"], 
 
       ["Ken", "Chun Li", "Zangief", "Dhalsim", "Sagat", "M.Bison"] 
 
       ], 
 
     moves = ['right', 'down', 'left', 'left', 'left', 'left', 'right']; 
 
console.log(navigate(moves,fighters));

関連する問題