Мне нужен выход - PullRequest
       2

Мне нужен выход

0 голосов
/ 18 августа 2010
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

и это не зависит от последовательности восстановления. Как избежать стирания ссылок?

1 Ответ

0 голосов
/ 18 августа 2010

Ну, я не уверен, что вы храните свои данные лучше.Если вы действительно хотите такого рода связи, вы можете подумать о создании ячейки, способной вместить нескольких игроков.Это решит вашу текущую проблему и будет более гибким, в дальнейшем.

В принципе, ваша проблема может быть решена следующим образом:

public class NPlayer
{
    private var _cell: NCell;
    public function set cell(value: NCell):void
    {
        if (this._cell != null && this._cell.player == this) //only the owner may remove a link!
        { 
            this._cell.player = null;
        }

        this._cell = value;

        if (this._cell != null)
        { 
            this._cell.player = this;
            //this.position     = this.cell.position; <-- no need for that, see below
        }  
    }
}

Если у вас нет доступа к NPlayer::position раз в миллионкадр, нет смысла его хранить.Это только вводит потенциальный источник ошибок.Свойство должно быть вычислено, просто возвращая this.cell.position или значащее значение по умолчанию, если у игрока нет ячейки (или вызывает исключение, если это не должно происходить).

greetz
back2dos

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...