我已经编写了两个函数(takePath和movePlayer),它们对应于沿着网格的“移动”,网格上的斑点表示壁(1),平底(0)和晶体(2)。问题的这一部分要求我们编辑takePath函数以跟踪播放器收集的晶体数量。 (如果移入墙壁,将返回到原始起始位置,并且晶体将重置为0)。
从左上角开始按行主要顺序存储图块(注意:这意味着y轴是倒置的。减少y坐标在地图上的移动)。例如,如果网格为[[1,1,1],[0,2,0],[1,1,1]],则级别将在3x3网格上播放,其中该级别的顶部和底部各行都是墙砖,中间的行从左到右包含一个地砖,一个水晶和另一个地砖。如果玩家从第二行的最左边的图块开始,他们将能够向右移动两次以完成关卡。要访问图块,我们将使用[x,y]坐标,其中x是列号,y是从左上角开始并从0开始计数的行号。这允许图块点与数组索引相对应。例如,出口将位于点[2,1]处,并可以通过grid [1] [2]进入。
我已经尝试了for循环,if else语句等许多不同的组合,试图使其无效,因此下面只是一个有效的movePlayer函数和未编辑的takePath函数
function movePlayer(json_object, f){
var level = JSON.parse(json_object);
var grid = level["grid"];
var pos = level["start"];
var x = pos[0];
var y = pos[1];
var wacc=0,dacc=0,sacc=0,aacc=0
if (f=="w"){
y = y - 1;
wacc+=1;
}
else if (f=="s"){
y = y + 1;
sacc+=1;
}
else if (f=="a"){
x = x - 1;
aacc+=1;
}
else if(f=="d"){
x = x + 1;
dacc+=1;
}
if (grid[y]===undefined || grid[y][x] == 1){
x=x+aacc-dacc;
y=y+wacc-sacc;
pos=[x,y];
}
else if (y >= 0 && y < grid.length && x >= 0 && x < grid[y].length){
pos = [x, y];
}
else{
x=x+aacc-dacc;
y=y+wacc-sacc;
pos=[x,y];
}
return pos;
}
function takePath(jsonlevel, moves){
var usable=JSON.parse(jsonlevel);
var start=usable['start'];
for(var move of moves){
jsonlevel=JSON.stringify(usable);
start=movePlayer(jsonlevel,move);
usable['start']=start;
}
return usable['start'];
}