Mega8 и реализация игры "Жизнь"

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
ZUB
Открыл глаза
Сообщения: 66
Зарегистрирован: Пт сен 04, 2009 20:16:35
Откуда: Симферополь-Севастополь

Сообщение ZUB »

Есть задумка сделать устройство на микроконтроллере с жки дисплеем (например тот же лсд от нокии 3310) которое бы реализовало эту игру.

Вот ссылка из википедии:
http://ru.wikipedia.org/wiki/%D0%96%D0% ... 0%D0%B0%29
А так же: http://written.ru/articles/science/life/work/life_1

У кого какие предложения по реализации, примерный алгоритм, формулы и т.д. Если есть нечто подобное, просьба дать ссылку.
Контактная информация:
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула

Сообщение IfoR »

По поводу самого алгоритма, тот сложного ничего нет.
Есть две битовые матрицы размером x,y.
В первой матрице находится расположение населения.
Во вторую мы заносим результат при вычислении а за тем копируем вторую в первую и выводим.

Алгоритм такой:
1. Обходим первую матрицу и проверяем, если эта точка мертва(пуста), то если рядом с ней есть 3 живых(заполненых) точки, то эта точка оживает.
Если же точка уже жива, то если рядом с ней находится иное значение чем 2 или 3 живых точек, то эта точка умирает. Результат заносится во вторую матрицу в такую же точку.
2. Копируем 2 матрицу в первую.
Либо
2. Делаем 2 матрицу активной, а 1 результатирующей(буферной).

Вот пример кода с перемеными активными матрицами

Код: Выделить всё

#define Xm 10 //Коричество клеток по X
#define Ym 10  //Коричество клеток по Y
char pole[Xm][Ym][2], activ=0;

void raschot()
{
 int kol,Dx,Dy; //Количество живых поблизости клеток, кореектирующие переменные 

 for(int y=0;y<Ym;y++)
 for(int x=0;x<Ym;x++)
 { 
  kol=0; Dx=0; Dy=0;
  if (x==0) Dx=Xm; //Если проверка у левого края
  if (x==Xm-1) Dx=-Xm; //Если проверка у правого края
  if (y==0) Dy=Ym; //Если проверка у левого края
  if (y==Ym) Dy=-Ym; //Если проверка у левого края
  
  if (pole[Xm+x-1][y][activ]) kol++; //Слева
  if (pole[Xm+x+1][y][activ]) kol++; //Справа
  if (pole[x][Ym+y-1][activ]) kol++; //Сверху
  if (pole[x][Ym+y+1][activ]) kol++; //Снизу

  if (pole[Xm+x-1][Ym+y-1][activ]) kol++; //Слева-сверху
  if (pole[Xm+x-1][Ym+y+1][activ]) kol++; //Слева-снизу
  if (pole[Xm+x+1][Ym+y-1][activ]) kol++; //Справа-сверху
  if (pole[Xm+x+1][Ym+y+1][activ]) kol++; //Справа-снизу
  
  //Судим клетку
  if (pole[x][y][activ]) //Если клетка жива
  {
   if (kol==2||kol==3) pole[x][y][1-activ]=1; else //Милуем её
   pole[x][y][1-activ]=0; //Убиваем
  } else
  { //Если клетка мертва
   if (kol==3) pole[x][y][1-activ]=1; else //Оживляем
   pole[x][y][1-activ]=0; //Оставляем мёртвой
  }
 }
 activ=1-activ; //Меняем активную матрицу на противоположную.
}
Вот, эта функция будет вычислять поколения. Поле при этом замкнутое. Активная матрица указана в переменой activ.
Контактная информация:
Реклама
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»