Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/75: Рейтинг темы: голосов - 75, средняя оценка - 4.64
 Аватар для vortexx1
6 / 6 / 3
Регистрация: 06.03.2011
Сообщений: 269

Игра "Жизнь"

02.09.2011, 15:30. Показов 16361. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Взялся за написание "Жизни", столкнулся с непонятными багами.

Вот мой код (сначала хочу проверить алгоритм на небольших массивах):
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
#include <iostream>
using namespace std;
 
void printArray ( char [][ 5 ] );
short around ( char [][ 5 ], short, short );
void deadOrAlive ( char [][ 5 ], char [][ 5 ], short, short );
void copyArrays ( char [][ 5 ], char [][ 5 ] );
void clearArray2 ( char [][ 5 ] );
 
int main ()
{
    char array [ 3 ][ 5 ] = { { 0, 0, 0, 0, 0 },
                              { 0, 1, 1, 1, 0 },
                              { 0, 0, 0, 0, 0 } };
                              
    char array2 [ 3 ][ 5 ] = { 0 };
 
    deadOrAlive ( array, array2, 1, 1 );
    deadOrAlive ( array, array2, 2, 1 );
    deadOrAlive ( array, array2, 3, 1 );
    copyArrays ( array, array2 );
    clearArray2 ( array2 );
    printArray ( array );
    
    system ( "pause" );
    return 0;
}
 
void printArray ( char array [][ 5 ] )
{
    for ( int i = 0; i < 3; i++ )
    {
        for ( int j = 0; j < 5; j++ )
            cout << array [ i ][ j ];
            
        cout << endl;
    }
}
 
short around ( char array [][ 5 ], short x, short y )
{
    short around = 0;
    
    if ( array [ y - 1 ][ x ] == 1 )
       around++;
       
    if ( array [ y - 1 ][ x - 1 ] == 1 )
       around++;
       
    if ( array [ y ][ x - 1 ] == 1 )
       around++;
       
    if ( array [ y + 1 ][ x - 1 ] == 1 )
       around++;
       
    if ( array [ y + 1 ][ x ] == 1 )
       around++;
       
    if ( array [ y + 1 ][ x + 1 ] == 1 )
       around++;
       
    if ( array [ y ][ x + 1 ] == 1 )
       around++;
       
    if ( array [ y - 1 ][ x + 1 ] == 1 )
       around++;
       
    return around;
}
 
void deadOrAlive ( char array [][ 5 ], char array2 [][ 5 ], short x, short y )
{
    if ( array [ y ][ x ] == 1 )
    {
       if ( around ( array, x, y ) != 2 )
          if ( around ( array, x, y ) != 3 )
             array2 [ y ][ x ] = 0;
    }
    else
       array2 [ x ][ y ] = array [ x ][ y ];
             
    if ( array [ y ][ x ] == 0 )
    {
       if ( around ( array, x, y ) == 3 )
          array2 [ y ][ x ] = 1;
    }       
    else
       array2 [ x ][ y ] = array [ x ][ y ]; 
}
 
void copyArrays ( char array [][ 5 ], char array2 [][ 5 ] )
{
    for ( int i = 0; i < 3; i++ )
        for ( int j = 0; j < 5; j++ )
            array [ i ][ j ] = array2 [ i ][ j ];          
}
 
void clearArray2 ( char array2 [][ 5 ] )
{
     for ( int i = 0; i < 3; i++ )
        for ( int j = 0; j < 5; j++ )
            array2 [ i ][ j ] = 0;
}
Где здесь могла затаиться ошибка?

Ну и, кто писал "Жизнь" на С++, пожалуйста, покажите код. Также буду рад услышать любые советы и рекомендации.

Спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.09.2011, 15:30
Ответы с готовыми решениями:

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

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

Игра жизнь
Нужно написать игру &quot;Жизнь&quot; простым кодом. Только начал изучать c++

14
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
02.09.2011, 15:34
vortexx1, Паскаль знаете?
0
 Аватар для vortexx1
6 / 6 / 3
Регистрация: 06.03.2011
Сообщений: 269
02.09.2011, 16:11  [ТС]
Знаю Delphi
0
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
02.09.2011, 16:17
Посомтрите в примерах Pascal ABC, там есть готовая игра с графикой.
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
03.09.2011, 08:08
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
//headers/world.h
#include <iostream> 
#include <stdio.h>
                                                                                ////////////////////////////////////
#define LEFT_DOWN   table[line + 1][column - 1]                                 //[-1 L_U -1] [-1 U 0] [-1 R_U +1]//
#define DOWN        table[line + 1][column]                                     //[0   L  -1] [0^__^0] [0   R  +1]//
#define RIGHT_DOWN  table[line + 1][column + 1]                                 //[+1 L_D -1] [+1 D 0] [+1 R_D +1]//
#define RIGHT       table[line][column + 1]                                     ////////////////////////////////////
#define RIGHT_UP    table[line - 1][column + 1]
#define UP          table[line - 1][column]
#define LEFT_UP     table[line - 1][column - 1]
#define LEFT        table[line][column - 1]
 
const int LINES = 24, COLUMNS = 80;
const char amoeba = '*';
 
class World
{
    private:
        bool table[LINES][COLUMNS];
        bool auxiliaryTable[LINES][COLUMNS];                                    //why? hz...
    public:
        void randomizeTable();
        void step();
        void showTable();
};
 
void World::randomizeTable()
{
    srand(time(NULL));
    for(int line = 0; line < LINES; ++line)
        for(int column = 0; column < COLUMNS; ++column)
            /*auxiliaryTable[line][column] = (*/table[line][column] = rand() % 2/*)*/;
}
 
void World::step()                                                              //Caution!
{                                                                               //Probably bad code ='(
    for(int line = 0; line < LINES; ++line)
        for(int column = 0; column < COLUMNS; ++column)
        {
            int neighbors = 0;
            if((line == 0) && (column == 0))                                    //left up
                neighbors += DOWN + RIGHT_DOWN + RIGHT;
            else if((line == 0) && (column == (COLUMNS - 1)))                   //right up
                neighbors += LEFT + LEFT_DOWN + DOWN;
            else if((line == (LINES - 1)) && (column == (COLUMNS - 1)))         //right down
                neighbors += UP + LEFT_UP + LEFT;
            else if((line == (LINES - 1)) && (column == 0))                     //left down
                neighbors += RIGHT + RIGHT_UP + UP;
            else if(column == 0)                                                //left
                neighbors += DOWN + RIGHT_DOWN + RIGHT + RIGHT_UP + UP;
            else if(line == 0)                                                  //up
                neighbors += LEFT + LEFT_DOWN + DOWN + RIGHT_DOWN + RIGHT;
            else if(column == (COLUMNS - 1))                                    //right
                neighbors += UP + LEFT_UP + LEFT + LEFT_DOWN + DOWN;
            else if(line == (LINES - 1))                                        //down
                neighbors += RIGHT + RIGHT_UP + UP + LEFT_UP + LEFT;
            else
                neighbors += LEFT_DOWN + DOWN + RIGHT_DOWN + RIGHT + RIGHT_UP + UP + LEFT_UP + LEFT;
            if(table[line][column])
                ((neighbors > 3) || (neighbors < 2)) ? auxiliaryTable[line][column] = 0 : auxiliaryTable[line][column] = 1;
            else
                (neighbors == 3) ? auxiliaryTable[line][column] = 1 : auxiliaryTable[line][column] = 0;
        }
    for(int line = 0; line < LINES; ++line)
        for(int column = 0; column < COLUMNS; ++column)
            table[line][column] = auxiliaryTable[line][column];
}
 
void World::showTable()
{
    for(int line = 0; line < LINES; ++line)
        for(int column = 0; column < COLUMNS; ++column)
            (table[line][column]) ? std::cout << amoeba : std::cout << ' ';
            //printf((table[line][column]) ? ("%X", amoeba) : (" "));
            //(table[line][column]) ? printf("•") : printf(" ");
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//main.cpp
#include <iostream>
#include <windows.h>
#include "headers/world.h"
 
int main()
{
    /*char c_game; //y/n
    std::cout << "Start game? (y/n):\n";
    std::cin >> c_game;
    if(c_game != 'y')
        return 0;*/
    World w1;
    w1.randomizeTable();
    while(TRUE)
    {
        w1.step();
        system("cls");
        w1.showTable();
        //Sleep(300);
    }
    return 0;
}
Вот мой. консолька, окно на 24*80.
На супер гениальный и оптимизированный код не претендует (даже на википедии есть способ побыстрее), просто написал рабочий алгоритм, чтобы затем реализовать это на GUI.
В алгоритме есть одна фича (ну ладно, ладно, косяк).
Поскольку поле как-бы бесконечно, то планер должен выходить за пределы карты 24*80, а у меня просто отсеиваются все клетки, которые больше заданного промежутка, и оставшаяся половина планера продолжает жить в свое удовольствие, перемещаясь в другую сторону.

Добавлено через 4 минуты
А касательно кода ТС
Там возможен выход за границы массива? Вот тут
Цитата Сообщение от vortexx1 Посмотреть сообщение
short around ( char array [][ 5 ], short x, short y )
?

Не по теме:

В код не вчитывался, ибо голова еще не проснулась... =(

0
Бродяга
 Аватар для dihlofos
315 / 269 / 56
Регистрация: 27.08.2010
Сообщений: 553
03.09.2011, 08:54
Решил вот тоже выложить свой быдлокод, может поржёте хоть. XD
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#include <iostream>
#include <cstdlib>
#include <fstream>
///////////////////////////////////////////////
class Life
{
public:
    void printField() const; // печать поля
    void loadFromFile(const char * filename); // загрузка поля из файла
    void step(); // очередной шаг игры
private:
    static const int rows = 20, cols = 20; // размеры поля
    int field[rows][cols]; // основной массив (игровое поле)
    int temp[rows][cols]; // массив-буфер
};
///////////////////////////////////////////////
void Life::printField() const
{
    int i, j;
 
    system( "cls" );
 
    // верхняя граница
    std::cout.put(201);
    for (i = 0; i < rows; ++i)
        std::cout.put(205);
    std::cout.put(187);
    std::cout << '\n';
 
    for (i = 0; i < rows; ++i)
    {
        // левая граница
        std::cout.put(186);
 
        // внутреннее поле
        for (j = 0; j < cols; ++j)
        {
            if (field[i][j] == 0)
                std::cout.put(' ');
            else
                std::cout.put('*');
        }
 
        // правая граница
        std::cout.put(186);
        std::cout << '\n';
    }
 
    // нижняя граница
    std::cout.put(200);
    for ( i = 0; i < rows; ++i )
        std::cout.put(205);
    std::cout.put(188);
    std::cout << '\n';
}
///////////////////////////////////////////////
void Life::loadFromFile(const char * filename)
{
    int i, j;
    std::ifstream infile;
    infile.open(filename);
 
    if(!infile)
    {
        std::cerr << "Cannot open file!\n";
        system ("pause");
        exit(0);
    }
 
    // читаем из файла
    for (i = 0; i < rows; ++i)
    {
        for (j = 0; j < cols; ++j)
        {
            infile >> field[i][j];
        }
    }
 
    infile.close();
}
///////////////////////////////////////////////
void Life::step()
{
    int temp[rows][cols];
    int left, right, up, down;
    int i, j, counter;
 
    for (i = 0; i < rows; ++i)
    {
        for (j = 0; j < cols; ++j)
        {
            counter = 0;
 
            // поиск соседей с проверкой выхода за пределы
            left  = ( j == 0 ? cols - 1 : j - 1 );
            right = ( j == cols - 1 ? 0 : j + 1 );
            up    = ( i == 0 ? rows - 1 : i - 1 );
            down  = ( i == rows - 1 ? 0 : i + 1 );
 
            // подсчёт живых соседей
            if ( field[up][left]    ) ++counter;
            if ( field[i][left]     ) ++counter;
            if ( field[down][left]  ) ++counter;
            if ( field[up][j]       ) ++counter;
            if ( field[down][j]     ) ++counter;
            if ( field[up][right]   ) ++counter;
            if ( field[i][right]    ) ++counter;
            if ( field[down][right] ) ++counter;
 
            // решение для мёртвой клетки
            if(field[i][j] == 0)
            {
                if ( counter == 3)
                    temp[i][j] = 1;
                else
                    temp[i][j] = 0;
            }
            // решение для живой клетки
            else
            {
                if (counter != 2 && counter != 3)
                    temp[i][j] = 0;
                else
                    temp[i][j] = 1;
            }
        }
    }
 
    // копирование из буфера в основной массив
    for ( i = 0; i < rows; ++i )
    {
        for ( j = 0; j < cols; ++j )
        {
            field[i][j] = temp[i][j];
        }
    }
}
///////////////////////////////////////////////
int main()
{
 
    Life myLife;
    char signal;
 
    myLife.loadFromFile("map2.txt");
 
    // просто нажимаем enter для нового шага
    // завершаем игру вводом 'n'
    do
    {
        myLife.printField();
        myLife.step();
        
        signal = std::cin.get();
    }
    while ( signal != 'n' );
    
    return 0;
}
Писал давно уже, сейчас даже не вчитывался особо, может и ошибки какие есть... Самый главный недостаток, что поле фиксированного размера, просто для удобства чтения из файла делал (чтобы потестить некоторые фигуры). Ну, переделать не проблема, лень просто Да, в файле фигура задаётся с помощью единичек в матрице из нолей. Пример приложил.
Вложения
Тип файла: rar maps.rar (215 байт, 102 просмотров)
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
03.09.2011, 09:22
2dihlofos
А что будет, если задать клетки по углам поля?
0
Бродяга
 Аватар для dihlofos
315 / 269 / 56
Регистрация: 27.08.2010
Сообщений: 553
03.09.2011, 10:29
soon, дык, если по всем углам по одной клетке, то получится статичный квадратик. Или я что-то проглядел, раз вы спрашиваете?
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
03.09.2011, 10:39
Ага, получится. А разве они не должны умереть от одиночества?
0
Бродяга
 Аватар для dihlofos
315 / 269 / 56
Регистрация: 27.08.2010
Сообщений: 553
03.09.2011, 10:43
Цитата Сообщение от soon Посмотреть сообщение
А разве они не должны умереть от одиночества?
А что так? Вроде же у каждой клетки по три соседа? Или тут как-то не так считаться будет? хм...
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
03.09.2011, 10:50
Извиняюсь. Невнимательно читал статью на wiki. В первых же строчках указано про использование тора. Блин...
1
1 / 1 / 0
Регистрация: 26.10.2016
Сообщений: 75
31.10.2016, 20:56
Вот и мой вариант
добавлена мышка

при нажатии 1 жизнь при нажатии 2 стоп )) рисуем нажмаем 1 и смотрим

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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
#include <windows.h>
#include <ctime>
#include <iostream>
#include <time.h>
#include <stdlib.h>
 
 
#include <GL/glut.h>
#include <vector>
#include <cstdlib>
#include <cmath>
using namespace std;
 
//int iWidth = 0.99*GetSystemMetrics(SM_CXSCREEN);
//int iHeight =0.90*GetSystemMetrics(SM_CYSCREEN);
 
 
 
 
      int   x;                // для мышки координат
      int   y;                // для мышки координат
     bool   down = false;
 
      int   stop = 1;         //жизнь продолжается
      int   counter;          //счетчик клеток
      int   kletka;           //содержит номер ячеки проверяемой клетки
      int   diam=15;          //диаметр клетки
 
const int   X=50;            // сколько клеток в ряду
const int   Y=40;            // сколько рядов
 
int w =  X*diam;              //ширина окна
int h =  Y*diam;              //высота окна
 
struct P
{
    int life;
    int next;
    int r;
    int g;
    int b;
} p [X*Y];
 
void display()
{
    glClear(GL_COLOR_BUFFER_BIT);
    for (int i = 0; i<X; ++i)
    {
        for (int j = 0; j<Y; ++j)
        {
            kletka = i+j*X;
            if (p[kletka].life == 1)
            {
 
                  glColor3ub(p[kletka].r,p[kletka].g,p[kletka].b);  // рисуется шарих
                  glBegin(GL_LINE_LOOP);
 
                  for (int a = 0; a < 36; ++a)
                  {
                     float x = diam/2 * cos(a * M_PI / 18);
                     float y = diam/2 * sin(a * M_PI / 18);
                     glVertex2f(diam/2+i*diam+x, diam/2+j*diam + y);
                  }
                  glEnd();
            }
         }
    }
    glutSwapBuffers();
}
 
 
 
// поиск соседей
 
void poisks()
{
      for (int i = 0; i < X; ++i)
      {
            for (int j = 0; j < Y; ++j)
            {
 
             counter = 0;
             kletka = i+j*X;
             if   (kletka > X && kletka < (X*Y)-X)
             {
                  if (p[kletka+1].life==1) ++counter;
                  if (p[kletka-1].life==1) ++counter;
 
                  if (p[kletka+X].life==1) ++counter;
                  if (p[kletka-X].life==1) ++counter;
 
                  if (p[kletka+X-1].life==1) ++counter;
                  if (p[kletka-X-1].life==1) ++counter;
 
                  if (p[kletka+X+1].life==1) ++counter;
                  if (p[kletka-X+1].life==1) ++counter;
            }
 
                  // решение для мёртвой клетки
                  if (p[kletka].life==0)
                  {
                     if ( counter == 3)
                              p[kletka].next = 1;
                        else
                              p[kletka].next = 0;
                  }
                   // решение для живой клетки
 
                    if (p[kletka].life==1)
                        {
                            if (counter != 2 && counter != 3)
                                p[kletka].next = 0;
                            else
                                p[kletka].next = 1;
                        }
 
            }
      }
 
}
 
void next ()
{
     for (int i = 0; i < X*Y; i++)
       {
           p[i].life  = p[i].next;
     }
}
 
void timer(int = 0)
{
 
    if(GetAsyncKeyState('1'))  stop =1;
    if(GetAsyncKeyState('2'))  stop =2;
 
    if (down)
    {
      kletka = x/diam+y/diam*X;
      p[kletka].life = 1;
    }
 
    if (stop ==1){
    poisks ();
    next ();
    }
 
    display();
    glutTimerFunc(1, timer, 0);
}
 
void mouse (int button, int state, int ax, int ay)
{
    x=ax;
    y=ay;
    down = state == GLUT_DOWN;
 
}
 
void motion (int ax, int ay)
{
    x=ax;
    y=ay;
}
 
 
int main(int argc, char **argv)
{
    for (int i = 0; i < X*Y; i++)
       {
 
            p[i].life  = rand() % 2;
            p[i].next  = 0;
            p[i].r  = rand() % 255;
            p[i].g  = rand() % 255;
            p[i].b  = rand() % 255;
 
      }
      glutInit(&argc, argv);
      glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
      glutInitWindowSize(w, h);
      glutInitWindowPosition(-10, -10);
      glutCreateWindow("Brownian motion");
      glClearColor(0, 0, 0, 1.0);
      glMatrixMode(GL_PROJECTION);
      glLoadIdentity();
      glOrtho (0, w, h, 0, -1, 1);
      glutDisplayFunc(display);
      timer();
      glutMouseFunc(mouse);
      glutMotionFunc(motion);
 
      glutMainLoop();
}
0
08.04.2020, 16:38

Не по теме:

А то, что там ввод переменных с файлов можно было сразу предупредить?

0
1 / 1 / 0
Регистрация: 26.10.2016
Сообщений: 75
10.04.2020, 06:40
Все видео содержат исходники LIFE
1. Game Life (C++ OpenGL (GLUT))

2.C++ / OpenGL] Game Life + source (ver2)

3.[C++ / OpenGL] Game Life + source (ver3)

4.[C++ / OpenGL] Game Life + source (ver4)
0
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,260
10.04.2020, 08:29
Цитата Сообщение от vortexx1 Посмотреть сообщение
Ну и, кто писал "Жизнь" на С++, пожалуйста, покажите код. Также буду рад услышать любые советы и рекомендации.
Там сама логика из нескольких строчек состоит, остальное вывод на экран и всякие кнопки. А, ну и я не делал отражение от краёв поля, дойдя до краев жизнь тихо умирает:

C++ (Qt)
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
    #define VERT 70
    #define HORZ 110
 
    bool bufer_01[VERT][HORZ];
    bool bufer_02[VERT][HORZ];
 
// возвращает количество соседей у клетки
int Widget::test_unit(int i, int j)
{
    int x, y;
    int rez = 0;
 
    for (int k = -1; k < 2; k++)
        for (int m = -1; m < 2; m++)
        {
            if((!k) && (!m)) continue;
 
            x = i + k;
            y = j + m;
 
            if((x < 0) || (x == VERT)) continue;
            if((y < 0) || (y == HORZ)) continue;
 
            if(bufer_01[x][y]) rez++;
        }
    
    return rez;
}
 
 
 
    int x;
 
    for(int i = 0; i < VERT; i++)
        for(int j = 0; j < HORZ; j++)
        {
            x = test_unit(i, j);
            bufer_02[i][j] = 0;
 
            if(!bufer_01[i][j] && x == 3) bufer_02[i][j] = 1;
            if( bufer_01[i][j] && x == 2) bufer_02[i][j] = 1;
            if( bufer_01[i][j] && x == 3) bufer_02[i][j] = 1;
 
            //if( bufer_01[i][j] && x == 4) bufer_02[i][j] = 1;
            //if( bufer_01[i][j] && x == 5) bufer_02[i][j] = 1;
            //if( bufer_01[i][j] && x == 6) bufer_02[i][j] = 1;
        }
 
 
    for(int i = 0; i < VERT; i++)
        for(int j = 0; j < HORZ; j++)
        {
            // рисование таблицы на экране
            if(bufer_02[i][j]) ui->tableWidget->item(i, j)->setBackground(Qt::black);
            else               ui->tableWidget->item(i, j)->setBackground(Qt::white);
 
            // копирование массивов
            bufer_01[i][j] = bufer_02[i][j];
        }
Миниатюры
Игра "Жизнь"  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.04.2020, 08:29
Помогаю со студенческими работами здесь

Игра жизнь
Помогите пожалуйста с решением. Код нужен на С++ «Жизнь» – компьютерная игра, придуманная английским математиком Джоном Конвеем (John...

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

Игра в жизнь Конвей
Чего то я намудрил помогите разобраться пожалуйста #include&lt;math.h&gt; #include &lt;time.h&gt; #include &lt;stdio.h&gt; #include...

Игра «Жизнь» Конвея(обратная)
Помогите реализовать игру &quot;Жизнь&quot;, но не прямую, а обратную, то-есть что бы из текущего поля получалось предшествующее ему. Я знаю что...

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru