我目前正在使用数组存储基于文字的游戏的位置数据。
我试图相应地编辑数组中的每个字符串,例如,如果我的数组是['___','_1_','___']
,其中1
是字符而_
是空格;还将我的角色位置保持在另一个数组([1,1]
);如果我试图将角色向上移动1并用散列(#
)替换他的位置,那么它将无法工作。我可以编辑位置数组,但没有别的。
map[pos[1] - 1][pos[0]] = '1';
map[pos[1]][pos[0]] = '#';
pos[1] = pos[1] - 1;
这就是我现在正在使用的,但只有第三行实际上有效。如果我运行一次,地图数组仍然是['___','_1_','___']
,但我的位置数组将更改为[1,0]
。
更改地图值以满足我的需求的最佳方法是什么?
答案 0 :(得分:2)
问题是无法修改字符串。您必须改为创建一个新字符串。
数组符号可能会产生误导,charAt
符号显然是只读的。
然后,如果要更改字符串的给定字符,可以使用
function changeStr(str, pos, newChar) {
return str.substring(0, pos) + newChar + str.substring(pos+1);
}
像这样使用:
var map = ['___','_1_','___'], pos = [1,1,];
map[pos[1] - 1] = changeStr(map[pos[1] - 1], pos[0], '1');
map[pos[1]] = changeStr(map[pos[1]], pos[0], '#');
pos[1] = pos[1] - 1;
在您的情况下,由于您要修改数组中的字符串,您可以将上述内容简化为
function changeArrStr(arr, key, pos, newChar) {
arr[key] = arr[key].substring(0, pos) + newChar + arr[key].substring(pos+1);
}
var map = ['___','_1_','___'], pos = [1,1,];
changeArrStr(map, pos[1] - 1, pos[0], '1');
changeArrStr(map, pos[1], pos[0], '#');
pos[1] = pos[1] - 1;
答案 1 :(得分:2)
最好的方法是分离关注点,避免混淆。首先,能够在给定位置替换字符串中的char。 (from elsewhere on so)
String.prototype.replaceAt=function(index, character) {
return this.substr(0, index) + character + this.substr(index+character.length);
}
接下来,能够在特定的ascii数组中执行此操作。
replaceInAsciiMap = function(array, row, index, character) {
array[row] = array[row].replaceAt(index, character);
}
现在,您可以添加更新整数数组和ascii数组的函数,获取旧位置和新位置,等等。总结一下:原子首先是分子,然后是蛋白质,然后是细胞,然后是生物...