Я создал упрощенную игру жизни.Игра жизни - что с этим алгоритмом
Это моя клетка, где фактический материал происходит:
class Cell
{
public Cell(MainWindow correspondingMainWindow){
this.mainWindow = correspondingMainWindow;
}
public bool excluded;
public Boolean Occupied { get; set; }
public Control correspondingPanel;
private int[] coordinates;
private MainWindow mainWindow;
public int[] Coordinates
{
get { return this.coordinates; }
set {
if(value.Length != 2)
{
throw new ArgumentException();
}
else if(value[0] < 0 || value [1] < 0
|| value[0] > Settings.FIELDWIDTH
|| value[1] > Settings.FIELDHEIGHT)
{
throw new ArgumentException();
}
else{
correspondingPanel = mainWindow.FieldArea.Controls
.Find(String.Format("panel{0}_{1}", value[0], value[1]), true)
.FirstOrDefault();
this.coordinates = value;
}
}
}
//Surrounding Cells in the 3x3 around the current cell
//this is to speed up the updating as soon as the algorithm runs on many cells
public Cell Top { get; set; }
public Cell TopRight { get; set; }
public Cell Right { get; set; }
public Cell BotRight { get; set; }
public Cell Bot { get; set; }
public Cell BotLeft { get; set; }
public Cell Left { get; set; }
public Cell TopLeft { get; set; }
public void die()
{
this.Occupied = false;
this.correspondingPanel.BackColor = Color.Beige;
}
public void populate()
{
this.Occupied = true;
this.correspondingPanel.BackColor = Color.DarkRed;
}
}
Вот алгоритм в вопросе:
//should return true if there were any changes to any "living" state
bool Algorithm.runOver(Cell target)
{
if (target.Occupied && !target.excluded)
{
target.Right.populate();
target.Left.populate();
target.Top.populate();
target.Bot.populate();
target.Right.excluded = true;
target.Left.excluded = true;
target.Top.excluded = true;
target.Bot.excluded = true;
return true;
}
else
{
return false;
}
}
исключены и уже проложенные будут сброшены к ложному каждый раз алгоритм завершения работы все клеток один раз. это предотвращает вызов walkOver() на Ячейке, обновленный в этой прогулке.
Теперь, когда я беру свою ячейку в верхний левый край моего поля (который продолжается как простое змеевое поле), отметьте его и запустите алгоритм, он прекратит изменения после первого прогона.
Фактически он обновляет Cell в разработанном виде, но затем просто останавливается.
Я сохраняю свои ячейки в статическом списке в программе (я знаю, что не должен, но это самый простой способ, пока он работает правильно). ячейки имеют несколько панелей для соответствия. эти панели находятся в GroupBox с именем FieldArea. они генерируются динамически на основе некоторых статических константных настроек (которые вы видите в установленной проверке для координат).
Я уверен, что ячейки соответствуют панелям правильно. эта проблема возникает в диагонали через FieldArea слева вверху (0,0) вправо справа. любая другая стартовая точка работает правильно. так или иначе, когда большее количество клеток поступает из «верхней», ячейки образуют границу на верхнем и левом краю поля.
Вопрос: это то, что я делаю неправильно? Почему мое поле работает неправильно?
Если у вас возникли проблемы, пожалуйста, забудьте мой комментарий. –