Звучит так, будто вы хотите, чтобы мир развивался одинаково каждый раз, как жизнь Конвея. В Life вы смотрите на каждую ячейку и рассчитываете, какой будет результат для нее на основе предыдущего состояния. Если у ячейки есть два соседа, она будет жить следующему поколению, независимо от того, не будут ли эти соседи в следующем поколении. Исходное состояние должно быть доступно только для чтения, а правила должны работать независимо от того, что.
Например, что если у вас есть два волка рядом с овцой, они оба ее съедят или только один? Если только один, то вам нужно правило, по которому можно есть овец, а другому нужно это знать. Вы могли бы пойти противоположным путем, то есть посмотреть на овец, найти животное, которое бы его съело. Допустим, вы хотите, чтобы только один волк съел овец, и вы говорите, что волк с наименьшей координатой «Y» получает овцу или наименьшую координату «X», если есть два волка с одинаковым «Y». Если вы обрабатываете волка, вам нужно убедиться, что нет другого волка, который сначала съел бы овцу. Это может стать еще более запутанным, потому что, возможно, рядом с ним будет другая овца, которую она будет есть, поэтому она не будет есть первую ...
Самым простым способом было бы сказать, что все животные могут выполнять свои действия независимо от того, что происходит с ними в ходе эволюции до следующего раунда или что делает любое другое животное. Если овца окружена тремя волками, она будет мертва в следующем раунде, и все волки разделят пищу. Если рядом с овцой есть трава, овца будет есть ее, даже если овца окружена волками. Для волков все они будут накормлены этим раундом, потому что они были рядом с овцой.
public class Cell {
public int CellType = 0; // 0 == empty, 1 == grass, 2 == sheep, 3 == wolf
public int Feedings = 0;
}
public class World {
public Cell [] Cells = new Cell[100];
public int Rows = 10, Cols = 10;
public Cell GetCell(x, y) {
if (x < 0 || x >= Cols || y < 0 || y >= Rows) return null;
if (Cells[y * Cols + x] == null) {
Cells[y * Cols + x] = new Cell();
}
return Cells[y * Cols + x];
}
public World Evolve() {
World w = new World();
for (int y = 0; y < Rows; y++) {
for (int x = 0; x < Cols; x++) {
HandleCell(w, x, y);
}
}
return w;
}
public void HandleCell(World newWorld, int x, int y) {
Cell result = newWorld.GetCell(x, y);
Cell c = GetCell(x, y);
if (c.CellType == 2) { // sheep
bool foundWolf = false;
bool foundGrass = false;
// code here to find if a wolf or grass are around the sheep
if (foundWolf) {
// default cell type is empty, so leave it be (wolf ate me)
} else {
result.cellType = 2; // still a sheep here
if (foundGrass) {
result.Feedings = c.Feedings + 1; // and he ate!
} else {
result.Feedings = c.Feedings; // or not...
}
}
}
if (c.CellType == 3) { // wolf
bool foundSheep = false;
// code here to find if a sheep is around the wolf
result.CellType = 3;
if (foundSheep) {
result.Feedings = c.Feedings + 1; // ate the sheep!
} else {
result.Feedings = c.Feedings;
}
}
}