TypeError:无法分配给字符串的只读属性'0'

2022-06-30 00:00:00 arrays loops typeerror javascript

我正在开发一款终端游戏。游戏场地被字段(░)和洞(O)占据

该字段是随机生成的,但我还希望确保路径字符(*)始终位于该字段的左上角(由一定数量的数组组成)

为此,我将第一个数组的第一个索引分配给了pathCharacter(*)。请参阅下面的代码:

数据-lang="js"数据-隐藏="假"数据-控制台="真"数据-巴贝尔="假">
String.prototype.replaceAt = function(index, replacement) {
  return this.substr(0, index) + replacement + this.substr(index + replacement.length);
}

hat = '^';

hole = 'O';

fieldCharacter = '░';

pathCharacter = '*';

class Field {
  constructor(field) {
    this._field = field;
  }

  print() {
    this._field = field.join('
');
    console.log(this._field.replace(/,/g, ''))
  }

  static generateField(height, width) {
    let finalArray = []
    for (let i = 0; i < height; i++) {
      finalArray.push(fieldCharacter.repeat(width));
    }
    for (let i = 0; i < finalArray.length; i++) {
      let randomHoleX = Math.floor(Math.random() * width);
      let randomHoleY = Math.floor(Math.random() * height);
      finalArray[randomHoleY] = finalArray[randomHoleY].replaceAt(randomHoleX, hole);
    }

    // what I tried to do
    finalArray[0][0] = pathCharacter;
    return finalArray.join('
').replace(/,/g, '');
  }
}

console.log(Field.generateField(5, 10));

输出内容:类型错误:无法分配给字符串‘░░O░░░░░░O’的只读属性‘0’

我想要的示例:

*░░O░░░░░O
░░░░░░░░░░
░░░░O░░░░░
░░░░░░░░░░
░░░O░O░░░░

解决方案

有许多我需要解决的问题。

  • 首先,您确实不应该向String.prototype添加您自己的方法;如果您想要任何类型的可维护性,那么这种方法就是疯狂的。
  • 第二,您的print()方法不能工作(它引用隐式全局field来修改实例字段_field),但这并不意味着您无论如何都在使用它。
  • 您可能应该使用数组数组而不是字符串,以减少操作的笨拙。
  • 您不需要Field的类:
const hat = "^";
const hole = "O";
const fieldCharacter = "░";
const pathCharacter = "*";

function generateField(height, width) {
  const field = [];
  for (let y = 0; y < height; y++) {
    field.push(Array.from(fieldCharacter.repeat(width)));
  }
  for (let y = 0; y < field.length; y++) {
    const randomHoleY = Math.floor(Math.random() * height);
    const randomHoleX = Math.floor(Math.random() * width);
    field[randomHoleY][randomHoleX] = hole;
  }

  field[0][0] = pathCharacter;
  return field;
}

function printField(field) {
  for (let y = 0; y < field.length; y++) {
    console.log(field[y].join(""));
  }
}

const field = generateField(5, 10);
printField(field);

此输出

*░░░░░░░░░
░░O░░░░░░░
░░░░O░░░░░
░░░░░░░░░░
O░O░░░O░░░

相关文章