public class NCell
{
private var _player: NPlayer;
public function set player(value: NPlayer):void
{
this._player = value;
}
public function get player():NPlayer {return this._player}
}
public class NPlayer
{
private var _cell: NCell;
public function set cell(value: NCell):void
{
if (this._cell != null)
{
this._cell.player = null;
}
this._cell = value;
if (this._cell != null)
{
this._cell.player = this;
this.position = this.cell.position;
}
}
}
Итак, у меня есть поле NCells (размер 20x15) и несколько игроков на нем. Для перемещения игрока я пишу
player.cell = field[4][4];
После этого игрок знает свою ячейку (и позицию), и ячейка имеет ссылку на игрока. Таким образом, у меня есть все, чтобы рассчитать доступные ходы. Иногда возникают ситуации, когда у игрока есть «ячейка», но «игрок» в ячейке == ноль. Это плохо. Это происходит потому, что когда я вычисляю ходы, я сохраняю позицию игроков, затем перемещаю игроков и затем продолжаю поиск, а когда игровые очки становятся равными 0, я восстанавливаю позиции игроков и продолжаю поиск. Например. У меня есть поле c1 == [3] [4], поле c2 == [4] [4], поле c3 == [5] [4], p1.cell == c1, p2.cell == c2. p2 перемещается в c3, а затем p1 перемещается в c1. Тогда я восстановлю положение:
//c2.player == p1
p2.cell = c2;//now c2.player == c2 but p1.cell == c2
p1.cell = c1;//and here c2.player == null
и это не зависит от последовательности восстановления. Как избежать стирания ссылок?