Метод принимающий матрицу и возрващающий новую (кусочек игры "жизнь") - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Добрый день, подскажите пожалуйста, где может быть ошибка: 1. если у элемента больше 3х соседей или меньше двух, то он элемент погибает = ' ' 2. элемент будет рожден если у него = 3 соседа, т.е = 'x' 3. организм с двумя или тремя соседями будет сохранен.....вот это что-то сложно мне понять(( я передаю матрицу в новую функцию, копирую ее организмы новую матрицу и делаю пустой считаю соседей и делаю условия жизни в итоге нужно выдать матрицу... при распечатке сплошные пробелы т.е все умерли, хотя так не должно быть
        while(1){
                print(array, h, w);
                usleep(200000);
                next(array, h, w);
        }
        return 0;
}

void print(char array[][10], int h, int w){
        //char *ptr = array;
        int i, j;
        for (i=0; i<h; ++i) {
                for (j=0; j<w; ++j)
                        //printf("%c", *(ptr+i*w+j));
                        printf("%c" , array[i][j]);
                putchar('\n');
        }
}
 
char next(char array[][10], int h, int w){
        int a, b;
        int count = 0;
        char *ptr2 = array;
        char array2[a][b];
        int i, j;
        for(i=0; i<h; i++){
                for(j=0; j<w; j++){
                        array2[a][b]=array[i][j];
                        array[i][j] = ' ';
                }
        }
 
        for(a=0; a<h; a++){
                for(b=0; b<w; b++){
                        if(array2[(a-1+h)%h][b] == 'x')
                                count++;
                        else if(array2[a][(b-1+w)%w] == 'x')
                                count++;
                        else if(array2[(a-1+h)%h][(b-1+w)%w] == 'x')
                                count++;
                        else if(array2[(a+1+h)%h][b] == 'x')
                                count++;
                        else if(array2[a][(b+1+w)%w] == 'x')
                                count++;
                        else if(array2[(a+1+h)%h][(b+1+w)%w] == 'x')
                                count++;
                        else if(array2[(a+1+h)%h][(b-1+w)%w] == 'x')
                                count++;
                        else if (array2[(a-1+h)%h][(b+1+w)%w] == 'x')
                                count++;
                        else if(count < 2 || count > 3)
                                array[a][b] = ' ';
                        else if(count == 3)
                                array[a][b] = 'x';
                        else if(count == 2 || count == 3)
                                array[a][b] = 'x';
                }
        }
        return(array[a][b]);
 
}
спасибо! буду рада любому совету

Решение задачи: «Метод принимающий матрицу и возрващающий новую (кусочек игры "жизнь")»

textual
Листинг программы
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <time.h>
#include <unistd.h>
#define LIVE 'X'
#define DEAD ' '
 
void print(char *array, int h, int w);
int next(char *array, int h, int w);
 
int main(int argc, char *argv[])
{
  int h;
  int w;
  int i, j;
  int number, posh, posw;
 
  if (argc == 3 && atoi(argv[1]) && atoi(argv[2])) {
    h = atoi(argv[1]);
    w = atoi(argv[2]);
  }
  else if (argc == 1) {
    h = 10;
    w = 10;
  }
  else
    return 1;
 
  srand( time(NULL));
  char array[h][w];
    
  for (i=0; i<h; ++i)
    for (j=0; j<w; ++j)
      array[i][j] = DEAD;
 
  number = (h * w) / 10;
  ((h * w) % 10) > 5? ++number: number;
  while (number) {
    posh = rand()%(h+1);
    posw = rand()%(w+1);
    if ( array[posh][posw] == DEAD) {
      array[posh][posw] = LIVE;
      --number;
    }
  }
  i = 1;  
  while (i) {
    system("clear");
    print(&array[0][0], h, w);
    usleep(400000);
    i = next(&array[0][0], h, w);
  }
 
  return 0;
}
 
void print(char *array, int h, int w)
{
  char *ptr = array;
  int i, j;
  for (i=0; i<h; ++i) {
    for (j=0; j<w; ++j)
      printf("%c", *(ptr+i*w+j));
    putchar('\n');
  } 
}
 
int next(char *array, int h, int w)
{
  char array1[h][w];
  char array2[h][w];
  int counter;
  int i, j;
  int altered = 0;
// copy array
  for (i=0; i<h; ++i)
    for (j=0; j<w; ++j)
      array1[i][j] = *(array + i*w +j);
// build altered array
  for (i=0; i<h; ++i) {
    for (j=0; j<w; ++j) {
      counter = 0;
      array2[i][j] = array1[i][j];
      if (array1[(i-1+h)%h][(j-1+w)%w] == LIVE && i>0 && j>1) 
        ++counter;
      if (array1[(i-1+h)%h][j] == LIVE && i>0)
        ++counter;
      if (array1[(i-1+h)%h][(j+1+w)%w] == LIVE && i>0 && j<(w-1))
        ++counter;
      if (array1[i][(j-1+w)%w] == LIVE && j>1)
        ++counter;
      if (array1[i][(j+1+w)%w] == LIVE && j<(w-1))
        ++counter;
      if (array1[(i+1+h)%h][(j-1+w)%w] == LIVE && i<(h-1) && j>1)
        ++counter;
      if (array1[(i+1+h)%h][j] == LIVE && i<(h-1))
        ++counter;
      if (array1[(i+1+h)%h][(j+1+w)%w] == LIVE && i<(h-1) && j<(w-1))
        ++counter;
      if (array1[i][j] == DEAD && counter == 3) {
        array2[i][j] = LIVE;
        ++altered;
      }
      if (array1[i][j] == LIVE && counter!=2 && counter!=3) {
        array2[i][j] = DEAD;
        ++altered;
      }
    }
  }
// copy array
  for (i=0; i<h; ++i)
    for (j=0; j<w; ++j)
      *(array + i*w +j) = array2[i][j];
 
  return altered;
}

Объяснение кода листинга программы

  1. Объединение функций print и next в одном файле.
  2. Объявление переменных h, w, i, j, number, posh, posw и их инициализация.
  3. Проверка аргументов командной строки и инициализация значений h и w.
  4. Инициализация матрицы array значением DEAD.
  5. Генерация случайного числа для определения количества живых клеток, которые нужно добавить в игру.
  6. Попытка выбрать случайную позицию для живой клетки.
  7. Увеличение счетчика живых клеток, если выбрана позиция, соответствующая условиям игры Жизнь.
  8. Ввод-вывод данных о состоянии игры Жизнь с помощью функции print.
  9. Сон в течение 400000 микросекунд (4 секунды) перед переходом к следующей итерации игры.
  10. Уменьшение значения i на единицу, чтобы перейти к следующей итерации игры.
  11. Возвращение значения, указывающего, была ли игра Жизнь изменена в результате последней итерации.
  12. Функция next принимает матрицу array, h и w в качестве аргументов.
  13. Создание двух копий матрицы array для использования в процессе обновления матрицы.
  14. Обход матрицы array1 для подсчета количества живых клеток в окрестностях каждой клетки матрицы array2.
  15. Обновление значений в матрице array2 в соответствии с правилами игры Жизнь.
  16. Обновление значений в матрице array с помощью значений из матрицы array2.
  17. Возвращение значения, указывающего количество измененных ячеек в матрице array.

Оцени полезность:

8   голосов , оценка 4.25 из 5
Похожие ответы