Лучший способ хранить очки
Я создаю игру, похожую на линкор. Мне нужно хранить сетку полей на доске. Каждое значение поля имеет свой текущий статус - пусто / отправлено. Я объявил 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];
}