Выбор Street Fighter с использованием 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] находится в верхнем углу. Моя проблема состоит в том, чтобы решить, идет ли выбор первой строки, что означает, что выбранный боец ​​будет первым в ряду. Но выбор не должен выходить за верхний или нижний ряд!

Можете ли вы помочь мне с этой проблемой?

2 ответа

Решение

Вы можете проверить, если какой-то элемент в initial_position меньше 0 или больше максимума, который fighters.length или же fighters[0].length и сбросьте его до этого максимального числа.

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)

Здорово..! Я ненавижу if с и else s... Итак, давайте получим некоторый функционал и сделаем простую навигационную систему с нашим изобретением Array.prototype.rotate() для того, чтобы целевая клетка в fighters[0][0] положение все время.

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));

Другие вопросы по тегам