街头霸王选择 javascript
Street Fighter selection with 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]在顶角。
我的问题是决定选择是否进入第一行,这意味着所选战斗机将成为该行中的第一名。但选择不能越过底行下的最高顺序!
你能帮我解决这个问题吗?
您可以检查 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
s 和 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));
我想在二维数组中创建选择历史记录。 我得到的是:
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]在顶角。 我的问题是决定选择是否进入第一行,这意味着所选战斗机将成为该行中的第一名。但选择不能越过底行下的最高顺序!
你能帮我解决这个问题吗?
您可以检查 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
s 和 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));