Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
[O]Clic[K]
1 / 1 / 0
Регистрация: 28.03.2012
Сообщений: 55
#1

Программа Жизнь - C++

29.04.2013, 21:32. Просмотров 383. Ответов 4
Метки нет (Все метки)

Вообщем... Что-то не могу сообразить с программой...
Реализовать алгоритм игры «жизнь». Дано двумерное поле клеток, каждая из которых либо содержит организм (1), либо пуста (0). Каждая клетка проверяет состояние своих соседей (их 8) и изменяет своё по правилам:
Живая клетка, вокруг которой < 2 живых клеток, умирает от одиночества.
Живая клетка, вокруг которой есть 2 или 3 живых клеток, выживает.
Живая клетка, вокруг которой > 3 живых клеток, умирает от перенаселения.
Пустая клетка, рядом с которой равно 3 живых соседа, оживает.
Особенно не могу понять как сделать искомую матрицу квази бесконечной.
Мой код
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include <iostream>
#include <ctime>
 
using namespace std;
 
int main()
{
    const int Width(30);
    const char live('#'), dead('.');
    const int gen=5;
 
    bool mas[Width*Width]={false};
    bool mas2[Width*Width]={false};
 
    srand((unsigned)time(NULL));
 
    for (int i=0; i<Width; i++)
    {
        for (int k=0; k<Width; k++)
        {
            if (mas[i+k*Width])
            {
                cout<<live;
            }
            else
            {
                cout<<dead;
            }
        }
        cout<<'\n';
    }
 
    cout<<'\n';
 
    for (int i=0; i<Width; i++)
    {
        for (int k=0; k<Width; k++)
        {
            mas[i+k*Width]=rand()%2;
 
            if (mas[i+k*Width])
            {
                cout<<live;
            }
            else
            {
                cout<<dead;
            }
        }
        cout<<'\n';
    }
    
    for (int g=0; g<gen; g++)
    {
        for (int i=0; i<Width; i++)
        {
        for (int k=0, count=0; k<Width; k++)
            {
                if ( ((i-1)>=0) && ((k-1)>=0) )
                {
                    if (mas[(i-1)+(k-1)*Width]) count++;
                }
                if ((i-1)>=0)
                {
                    if (mas[(i-1)+(k-1)*Width]) count++;
                }
                if ( ((k+1)<=Width) && ((i-1)>=0) )
                {
                    if (mas[(i+1)+(k-1)*Width]) count++;
                }
                if ( (i-1)>=0)
                {
                    if (mas[(i-1)+k*Width]) count++;
                }
                if ( (i+1)<=Width-1)
                {
                    if (mas[(i+1)+k*Width]) count++;
                }   
                if ( ((i-1)>=0) && ((k+1)<=Width-1) )
                {
                    if (mas[(i-1)+(k+1)*Width]) count++;
                }
                if ( (k+1)<=Width-1 )
                {
                    if (mas[i+(k+1)*Width]) count++;
                }
                if ( ((i+1)<=Width-1) && ((k+1)<=Width-1) )
                {
                    if (mas[(i+1)+(k+1)*Width]) count++;
                }
                
                if ((count<2) || (count>3))
                {
                mas2[i+k*Width]=false;
                cout<<dead;
                }
                else
                {
                    if ((!mas2[i+k*Width]) && (count !=3))
                    {
                mas2[i+k*Width]=false;
                cout<<dead;
                    }
                    else
                    {
                mas2[i+k*Width]=true;
                cout<<live;
                    }
                }
                count=0;
                
            }
        cout<<'\n';
        }
        cout<<'\n';
        
        for (int i=0; i<(Width*Width); i++)
        {
            mas[i]=mas2[i];
        }
    
    }
return 0;
}
0
Миниатюры
Программа Жизнь  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.04.2013, 21:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Программа Жизнь (C++):

игра жизнь - C++
содержимое life.cpp// Life.cpp: определяет точку входа для консольного приложения. // #include &lt;iostream&gt; #include &quot;stdafx.h&quot; ...

Игра Жизнь - C++
Ну, правила игры таковы: - если клетка пустая но имеет ровно 3 соседа (вообще их 8), там появляется жизнь. - если клетка полная, но там...

Игра Жизнь - C++
Написал вот такую реализацию: #include &quot;stdafx.h&quot; #include &quot;iostream&quot; #include &quot;clocale&quot; using namespace std; int...

Жизнь (нужна поддержка) - C++
Здравствуйте. Начал писать игру &quot;Жизнь&quot;. Недавно начал изучать классы, поэтому, буду использовать их. В общем, чувствую, что...

Игра жизнь (бесконечное пространство) - C++
Надо сделать бесконечное пространство для игры &quot;жизнь&quot;, примерно понимаю как это сделать, но что то не получается,надо в подпрограмму rules...

Жизнь после Праты: посоветуйте книгу для прокачки навыка - C++
Дочитал книгу С. Прата &quot;Язык программирования C++. Лекции и упражнения&quot; 6-е издание. Теперь думаю какую следующую читать. От думаю Скотта...

4
metaluga145
29.04.2013, 21:39
  #2

Не по теме:

Что значит "квази бесконечная матрица"?

0
DiffEreD
1430 / 767 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
29.04.2013, 22:18 #3
Когда то пробовал писать, но до ума так и не довел. Вот нарыл со своего архива, может что пригодится:
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
84
85
86
87
88
89
#include <iostream>
#include <thread>
#include <chrono>
#include <algorithm>
#include <ctime>
#include <random>
#include <functional>
 
const unsigned R = 40;
const unsigned C = 40;
 
void init(bool**& matr)
{
    matr = new bool*[R];
    matr[0] = new bool[R*C];
    for (unsigned i = 1; i<R; ++i)
        matr[i] = matr[i-1]+C;
}
 
void fill(bool**& matr)
{
    std::srand(unsigned(time(nullptr)));
    for (unsigned i = 0; i<R; ++i)
    {
        for (unsigned j = 0; j<C; ++j)
            matr[i][j] = !(std::rand()%6);
    }
}
 
void show(bool** matr)
{
    std::cout<<"\n\n\n";
    for (unsigned i = 1; i<R-1; ++i)
    {
        for (unsigned j = 1; j<C-1; ++j)
            std::cout<< (matr[i][j] ? "O" : " " );
        std::cout<<"\n";
    }
}
 
void calc(bool**& matr)
{
    bool temp[R][C];
    for (unsigned i = 0; i<R; ++i)
    {
        for (unsigned j = 0; j<C; ++j)
            temp[i][j] = matr[i][j];
    }
    unsigned microbs = 0;
    for (unsigned i = 1; i<R-1; ++i)
    {
        for (unsigned j = 1; j<C-1; ++j)
        {
            if (temp[i-1][j-1]) microbs++;
            if (temp[i-1][j])   microbs++;
            if (temp[i-1][j+1]) microbs++;
            if (temp[i][j-1])   microbs++;
            if (temp[i][j+1])   microbs++;
            if (temp[i+1][j-1]) microbs++;
            if (temp[i+1][j])   microbs++;
            if (temp[i+1][j+1]) microbs++;
 
            if (microbs == 3)   matr[i][j] = true;
            if (microbs<2 || microbs>3)     matr[i][j] = false;
            microbs = 0;
        }
    }
}
 
int main()
{
    bool** space;
 
    init(space);
    fill(space);
    
    do 
    {
        show(space);
        
        std::this_thread::sleep_for(std::chrono::milliseconds(500));
        calc(space);
        
        system("cls");
    } while (true);
    
    system("pause");
    return 0;
}
Да, и в консоли эту игру особо не потестируеш.
0
[O]Clic[K]
1 / 1 / 0
Регистрация: 28.03.2012
Сообщений: 55
30.04.2013, 00:02  [ТС] #4
yuron_477, спасибо большое... Но только вопрос по
Цитата Сообщение от yuron_477 Посмотреть сообщение
std::this_thread::sleep_for(std::chrono::milliseconds(500));
Как ее можно заменить, ибо в 2008 VS библиотеки chrono нет
0
Wayden
0 / 0 / 0
Регистрация: 28.04.2013
Сообщений: 3
30.04.2013, 00:11 #5
Вот, написал по-быстрому игру:

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
#include <iostream>
#include <ctime>
#include "conscr.h"
 
using namespace std;
 
int editMatr(char matrix[][40], int x, int y);
 
int main()
{
    initconscreen(Black);
    conscol(White, Black);
    srand(time(NULL));
    char matrix[80][40];
    for(int y = 0; y < 40; y++)
        for(int x = 0; x < 80; x++)
        {
            if(rand()%8 == 0) matrix[x][y] = '#';
            else matrix[x][y] = '.';
        }
    for(int y = 0; y < 40; y++)
        for(int x = 0; x < 80; x++)
        {
            gotoxy(x, y);
            cout << matrix[x][y];
        }
        for(;;)
        {
            for(int y = 0; y < 40; y++)
                for(int x = 0; x < 80; x++)
                {
                    editMatr(matrix, x, y);
                    Sleep(2);
                }
        }
    return 0;
}
 
int editMatr(char matrix[][40], int x, int y)
{
    int numb = 0;
        for(int i = y - 1; i <= y + 1; i++)
            for(int u = x - 1; u <= x + 1; u++)
            {
                if(i != y && u != x && i >= 0 && u >= 0)
                {
                    if(matrix[u][i] == '#') numb++;
                }
            }
    if(matrix[x][y] == '#')
    {
        if(numb < 2)
        {
            matrix[x][y] = '.';
            gotoxy(x, y);
            cout << '.';
            return 0;
        }
        else if(numb > 3)
        {
            matrix[x][y] = '.';
            gotoxy(x, y);
            cout << '.';
            return 0;
        }
    }
    if(matrix[x][y] == '.' && numb == 3)
    {
        matrix[x][y] = '#';
        gotoxy(x, y);
        cout << '#';
        return 0;
    }
}
Прикрепляю два файла для работы с консолью. Их нужно обязательно подключить к проекту.
И еще - по таким законам система изменяется крайне малое количество раз.
0
Вложения
Тип файла: zip conscr.zip (1.2 Кб, 3 просмотров)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.04.2013, 00:11
Привет! Вот еще темы с ответами:

Что использовать вместо таймера для множества точек, жизнь которых - 5 секунд - C++
Привет, народ, подскажите пожалуйста, как принято поступать в следующем случае: Имеется много разных объектов, они умеют делать много...

Игра ( Жизнь Конвея) - C++
Написал код - но во время запуска игра вылетает! Вот исходники, подскажите, что не так?

Реализовать игру "Жизнь" (Conway's Game of Life) с помощью иерархии классов - C++
У нас есть такие правила: Правила Место действия этой игры — «вселенная» — это размеченная на клетки поверхность или плоскость —...

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


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

Или воспользуйтесь поиском по форуму:
5
Yandex
Объявления
30.04.2013, 00:11
Ответ Создать тему
Опции темы

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