Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 24.09.2016
Сообщений: 63
1

Игра "жизнь" - глайдер ведет себя не так, как надо

06.04.2018, 02:53. Просмотров 561. Ответов 6
Метки нет (Все метки)

Добрый вечер. Нужно написать игру "жизнь". Реализовал,однако глайдер ведет себя не так,как надо. Уже который час бьюсь,но ошибку найти не могу. Помогите пожалуйста.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <iostream>
#define X 13      //размеры массива
#define Y 13
using namespace std;
 
 
 
int abs(int x){     //функция для защиты  массива от выхода за границы
    if (x<0)
        return 12;
    else if (x>12)
        return 0;
    else
        return x;
     }
 
 
void printf(int **mass){
    for(int i=0;i<X;i++){
        for(int j=0;j<Y;j++){
            cout<<mass[i][j]<<" ";
            }
        cout<<"\n";
        }
    }
int count_s(int **mass,int x,int y){   //подсчет живых соседей
    int count_live=0;
    for(int i=x-1;i<=x+1;i++){
        for(int j=y-1;j<=y+1;j++){
            if (mass[abs(i)][abs(j)]==1)
                count_live++;
                }
        }
    return count_live;
    }
 
void new_generation(int **mass,int **next_mass){   //новое поколение
 
    for(int i=0;i<X;i++){
        for(int j=0;j<Y;j++){
            int buff=mass[i][j];
            if ( buff== 0) {
                if (count_s(mass,i,j) == 3) {
                    next_mass[i][j] = 1;
                }
            }
           else {
                if (count_s(mass,i,j)<2 || count_s(mass,i,j) > 3) {
                    next_mass[i][j] = 0;
                }
 
            }
        }
    }
 
}
 
 
int main()
 
{
    int **next_mass=new int*[X];
    int **mass=new int*[X];
    for(int i=0;i<X;i++){
        next_mass[i]=new int[X];
        mass[i]=new int[X];
        }
 
 
 
    mass[0][1]=1;
    mass[1][2]=1;
    mass[2][0]=1;
    mass[2][1]=1;
    mass[2][2]=1;
 
    new_generation(mass,next_mass);
 
    printf(mass);
    cout<<endl;
    printf(next_mass);
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.04.2018, 02:53
Ответы с готовыми решениями:

"И" ведет себя как "ИЛИ"
Здраствуйте, помогите разобраться. Есть функция, кот. возвращает true, если клавиша удерживается....

Игра "Жизнь"; Нужно, чтобы первое поколение задавалось оператором (с клавиатуры)
Нужна помощь с решением задачи &quot;Жизнь&quot; на с++ Есть код программы, которая задает первое поколение...

Игра "Жизнь" с самым простым кодом
Здравствуйте, нужна помощь по написанию кода для игры &quot;Жизнь&quot; только на простом уровне, так как еще...

Игра "Жизнь": найти конфигурацию клеток, которая будет через k поколений от заданного
Игра «Жизнь» была придумана английским математиком Джоном Конвейем в 1970 году. Впервые описание...

6
Лемур
06.04.2018, 03:02
  #2

Не по теме:

я извиняюсь, а почему "жизнь"?)

0
0 / 0 / 0
Регистрация: 24.09.2016
Сообщений: 63
06.04.2018, 03:23  [ТС] 3
LemurDC, видимо потому что имитирует реальную смену популяции по неким формальным законам
0
Эксперт C
24908 / 15431 / 3265
Регистрация: 24.12.2010
Сообщений: 33,263
06.04.2018, 10:02 4
Цитата Сообщение от LemurDC Посмотреть сообщение
я извиняюсь, а почему "жизнь"?)
Так назвал ее изобретатель - Конвей. (Game of Life)
https://ru.wikipedia.org/wiki/... 1%8C%C2%BB
1
1118 / 931 / 429
Регистрация: 25.12.2016
Сообщений: 3,030
07.04.2018, 08:02 5
Цитата Сообщение от dextroza Посмотреть сообщение
глайдер ведет себя не так,как надо
Для такой небольшой матрицы можно рассчитать результат вручную, а затем сравнить с программой - в каких клетках есть расхождение. Ещё можно отдельно построить матрицу соседей, убедиться что программа её правильно находит.

И ещё, лучше не называть свои функции так же, как стандартные (printf, abs).
0
Модератор
Эксперт по электронике
8284 / 6142 / 823
Регистрация: 14.02.2011
Сообщений: 21,356
07.04.2018, 08:15 6
Цитата Сообщение от dextroza Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
int abs(int x){     //функция для защиты  массива от выхода за границы
    if (x<0)
        return 12;
    else if (x>12)
        return 0;
    else
        return x;
     }
а вот так не проще?
C++
1
2
3
int abs(int x){     //функция для защиты  массива от выхода за границы
        return x%13;
     }
а еще лучше
C++
1
2
3
unsigned int abs(unsigned int x){     //функция для защиты  массива от выхода за границы
        return x%13;
     }
поскольку индекс не может быть отрицательным
ну и к совету
Цитата Сообщение от likehood Посмотреть сообщение
не называть свои функции так же, как стандартные (printf, abs)
нужно прислушатся
0
Байт
07.04.2018, 08:21     Игра "жизнь" - глайдер ведет себя не так, как надо
  #7
0
07.04.2018, 08:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.04.2018, 08:21
Привет! Вот еще темы с ответами:

Игра "Борьба за жизнь". Цель игры – убрать с доски все шашки противника
Здравствуйте! Помогите пожалуйста написать программу на с++. Два игрока имеют по n шашек и...

Игра "Жизнь" и торообразный массив
Подскажите, как можно реализовать торообразный (круговой) массив для игры &quot;Жизнь&quot;. есть только...

Игра "Жизнь": найти ошибку
Писал клеточный автомат &quot;Жизнь&quot;(описание можно посмотреть на википедии, либо в комментариях к коду...

Игра "жизнь" - разобраться в коде
помогите разобраться в коде #define SIZE 20 int a,b; int chk(int x, int y) { int i=0;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.