Лучший способ хранить очки

Я создаю игру, похожую на линкор. Мне нужно хранить сетку полей на доске. Каждое значение поля имеет свой текущий статус - пусто / отправлено. Я объявил 2-мерный массив, как показано ниже:

//from createEmptyBoard() function in loop
playerBoard[x][y] = FIELD_EMPTY;

Теперь я хотел бы переписать код с использованием классов. Я определил классы GameBoard и Field

Класс GameBoard (TypeScript):

class GameBoard {
  private verticalFields: number;
  private horizontalFields: number;
  private fields = Array<Field>();

  constructor(verticalFields: number, horizontalFields: number) {
    this.verticalFields = verticalFields;
    this.horizontalFields = horizontalFields;
  }

  private initializeEmptyFields() {
    for (let x = 0; x < this.verticalFields; x++) {
      for (let y = 0; y < this.horizontalFields; y++) {
        this.addField(x, y);
      }
    }
  }

  private addField(x, y) {
    this.fields.push(new Field(x, y));
  }
//...

Поле класса (TypeScript):

class Field {
  private x: number;
  private y: number;
  private status: number;

  private static readonly FIELD_EMPTY = 0;
  private static readonly FIELD_SHIP = 1;
  private static readonly FIELD_MISS = 2;
  private static readonly FIELD_HIT = 3;


  constructor(x, y) {
    this.x = x;
    this.y = y;
    this.status = Field.FIELD_EMPTY;
  }

  public setAsEmpty() {
    this.status = Field.FIELD_EMPTY;
  }

  public setAsShip() {
    this.status = Field.FIELD_SHIP;
  }

В другом методе я проверяю, является ли поле, по которому щелкает пользователь, пустым или имеет корабль. В старом коде я сделал это следующим образом:

function fieldIsEmpty(x,y) {
  return playerBoard[x][y] == FIELD_FIELD_EMPTY;
}

Но сейчас я понятия не имею, как получить поле по координатам. Поиск объекта со свойствами x и y, который я ищу в цикле, - не самый эффективный способ.

Как хранить поля с возможностью получить одно по его координате?

1 ответ

Вы можете написать такую ​​функцию на GameBoard:

public getField(x, y) {
    return this.fields[x + this.verticalFields * y];
}
Другие вопросы по тегам