Игра "Жизнь"

pavel96
Offline
Зарегистрирован: 10.04.2018

Доброго времени суток, уважаемые форумчане. Назрел такой вопрос: пытаюсь реализовать игру жизнь (клеточный автомат) на esp8266 в среде Arduino IDE. Сейчас пока вывожу данные в серийный порт (не знаю как правильно сказать) с помощью Serial.print, но в дальнейшем планирую реализовать вывод на дисплей, который уже заказан. В общем, выводит не то, что хотелось бы увидеть. Чую, что проблема кроется в неправильной передаче данных функции, но решить её не могу. Код был переписан на С с рабочего проекта на Паскале. Ниже привожу листинг программы, объясните, что не так, пожалуйста, о великие умы форума)

const int n=20;
int pole1[n][n];
int pole2[n][n];
int tk; int t;
int i; int j; int s;

void setup() {
  for (i = 1; i<=n; i++) {
    for (j = 1; j<=n; j++) {
      pole1[i][j] = 0;
    }
  }
  for (i = 1; i<=n; i++) {
    for (j = 1; j<=n; j++) {
      pole2[i][j] = pole1[i][j];
    }
  }
  tk = 25;
  pole1[12][10] = 1;
  pole1[13][11] = 1;
  pole1[14][9] = 1; pole1[14][10] = 1; pole1[14][11] = 1;
  Serial.begin(9600);
}

int sosedi(int i, int j, int (&pole1)[n][n]){
  int im = i - 1;
  int ip = i + 1;
  int jm = j - 1;
  int jp = j + 1;
  if (im = 0) im = n;
  if (ip > n) ip = 1;
  if (jm = 0) jm = n;
  if (jp > n) jp = 1;
  int a = pole1[im][jm] + pole1[im][j] + pole1[im][jp] + pole1[i][jm] + 0 + pole1[i][jp] + pole1[ip][jm] + pole1[ip][j] + pole1[ip][jp];
  return a;
}

void PrintPole(int (&pole1)[n][n]){
  for (i = 1; i<=n; i++){
    for (j = 1; j<=n; j++){
      if (pole1[i][j] == 1) Serial.print('*');
        else Serial.print(' ');
    }
      Serial.println();
  }
}

void GameOfLife(){
    for (t = 0; t<=tk; t++){
      for (i = 1; i<=n; i++){
        for (j = 1; j<=n; j++){
          s = sosedi(i, j, pole1);
          if (pole1[i][j] = 0) 
            if (s == 3) pole2[i][j] = 1;
          if (pole1[i][j] == 1) { 
            if ((s == 2) or (s == 3)) pole2[i][j] = 1; 
              else pole2[i][j] = 0;
          }
        }
       }
     }        
    for (i = 1; i<=n; i++) {
    for (j = 1; j<=n; j++) {
      pole1[i][j] = pole2[i][j];
    }
  }
    delay(500);
}

void loop() {
  GameOfLife;
  PrintPole(pole1);
}

И в качестве исходника код на паскале:

uses
  crt;

const
  n = 30;

type
  pole = array[1..n, 1..n] of 0..1;

var
  a, b: pole;
  tk: integer;

function sosedi(i, j: integer): 0..8;
begin
  var im := i - 1;
  var ip := i + 1;
  var jm := j - 1;
  var jp := j + 1;
  if (im = 0) then im := n;
  if (ip > n) then ip := 1;
  if (jm = 0) then jm := n;
  if (jp > n) then jp := 1;
  Result := a[im, jm] + a[im, j] + a[im, jp] +
  a[i, jm] + 0 + a[i, jp] +
  a[ip, jm] + a[ip, j] + a[ip, jp]
end;

procedure PrintPole(x: pole);
begin
  for var i := 1 to n do
  begin
    for var j := 1 to n do
      if x[i, j] = 1 then Write('*')
      else Write(' ');
    Writeln
  end;
end;

procedure init;
begin
  for var i := 1 to n do
    for var j := 1 to n do
      a[i, j] := 0;
  b := a;
  tk := 25;
  a[12, 10] := 1;
  a[13, 11] := 1;
  a[14, 9] := 1;a[14, 10] := 1;a[14, 11] := 1;
end;

procedure GameOfLife;
var s:integer;
begin
  for var t := 0 to tk do
  begin
    for var i := 1 to n do
      for var j := 1 to n do
      begin
        s := sosedi(i, j);
        if a[i, j] = 0 then
          if (s = 3) then b[i, j] := 1;
        if a[i, j] = 1 then
          if (s = 2) or (s = 3) then b[i, j] := 1 else b[i, j] := 0;
      end;
    a := b;
    Sleep(500);
    ClrScr;
    PrintPole(a);
  end;
end;

begin
  init;
  PrintPole(a);
  GameOfLife;
end.

 

pavel96
Offline
Зарегистрирован: 10.04.2018

Возможностей форуму явно не хватает, не вижу кнопки редактировния. В 68 строке кода ардуино не хватает вызова процедуры PrintPole

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015
1. Строки 8-17 не нужны от слова "нафиг". Я уж не говорю про ошибки в них, их надо просто выбросить.
 
2. В функцях sosedi, PrintPole и вообще везде, Вы тупо переписали код с Паскаля не учитывая того, что если массив объявлен как pole1[20], то в Паскале его индексы 1-20, а в С - 0-19. Из-за этого Вы везде залазите за границы массивов.
 
Дальнешее смотреть не имеет смысла, пока не исправлен пункт №2.
pavel96
Offline
Зарегистрирован: 10.04.2018

Спасибо за подсказку, заменить индексы секундное дело, действительно забыл о различиях языка. Но проблемы это не решит, в монитор порта постоянно выводится одна и та же конфигурация, как будто не изменяется массив.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Пока это не исправите, другое смотреть нет смысла. Это слишком на многое влияет.

И кстати, как исправите, не забудьте выложить что там у Вас выводится.

sadman41
Offline
Зарегистрирован: 19.10.2016

А чем int (&pole1)[n][n] отличается от int* pole1

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sadman41 пишет:

А чем int (&pole1)[n][n] отличается от int* pole1

А зачем вообще передавать глобальный объект параметром Вы не хотите спросить?

pavel96
Offline
Зарегистрирован: 10.04.2018

Язык знаю на уровне примата, поэтому такие ошибки. Попробую сейчас тсправить и загрузить скетч

vk007
Offline
Зарегистрирован: 16.06.2015

У вас в if'ах то "=", то "==". Определитесь уже )

sadman41
Offline
Зарегистрирован: 19.10.2016

ЕвгенийП пишет:

sadman41 пишет:

А чем int (&pole1)[n][n] отличается от int* pole1

А зачем вообще передавать глобальный объект параметром Вы не хотите спросить?

Пока нет. Был поражен конструктивизмом параметра.

pavel96
Offline
Зарегистрирован: 10.04.2018

Повторюсь, это первый опыт работы с языком и платформой в целом. Поэтому прошу не пинать очень сильно и указать что нужно почитать и в каком направлении двигаться, чтобы решить этот вопрос. Из комментариев выше понял, что объект глобальный и нет смысла его передавать, что и было в изначальной версии кода, но думал, что неверное направление.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

pavel96 пишет:

 прошу не пинать очень сильно 

Да, ладно, а кого ж пинать-то? Терпите уж.

pavel96 пишет:

понял, что объект глобальный и нет смысла его передавать, что и было в изначальной версии кода, но думал, что неверное направление.

Да, нет - неверное направление, - это такая куча неопрадданно-глобальных объяктов. Но, если уж они глобальны, так передавать их действительно не нужно.