Игра "Жизнь"
- Войдите на сайт для отправки комментариев
Втр, 10/04/2018 - 21:52
Доброго времени суток, уважаемые форумчане. Назрел такой вопрос: пытаюсь реализовать игру жизнь (клеточный автомат) на 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.
Возможностей форуму явно не хватает, не вижу кнопки редактировния. В 68 строке кода ардуино не хватает вызова процедуры PrintPole
Спасибо за подсказку, заменить индексы секундное дело, действительно забыл о различиях языка. Но проблемы это не решит, в монитор порта постоянно выводится одна и та же конфигурация, как будто не изменяется массив.
Пока это не исправите, другое смотреть нет смысла. Это слишком на многое влияет.
И кстати, как исправите, не забудьте выложить что там у Вас выводится.
А чем int (&pole1)[n][n] отличается от int* pole1?
А чем int (&pole1)[n][n] отличается от int* pole1?
А зачем вообще передавать глобальный объект параметром Вы не хотите спросить?
Язык знаю на уровне примата, поэтому такие ошибки. Попробую сейчас тсправить и загрузить скетч
У вас в if'ах то "=", то "==". Определитесь уже )
А чем int (&pole1)[n][n] отличается от int* pole1?
А зачем вообще передавать глобальный объект параметром Вы не хотите спросить?
Пока нет. Был поражен конструктивизмом параметра.
Повторюсь, это первый опыт работы с языком и платформой в целом. Поэтому прошу не пинать очень сильно и указать что нужно почитать и в каком направлении двигаться, чтобы решить этот вопрос. Из комментариев выше понял, что объект глобальный и нет смысла его передавать, что и было в изначальной версии кода, но думал, что неверное направление.
прошу не пинать очень сильно
Да, ладно, а кого ж пинать-то? Терпите уж.
понял, что объект глобальный и нет смысла его передавать, что и было в изначальной версии кода, но думал, что неверное направление.
Да, нет - неверное направление, - это такая куча неопрадданно-глобальных объяктов. Но, если уж они глобальны, так передавать их действительно не нужно.