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

Жизнь (нужна поддержка) - C++

Восстановить пароль Регистрация
 
vortexx1
 Аватар для vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
29.09.2011, 01:09     Жизнь (нужна поддержка) #1
Здравствуйте.

Начал писать игру "Жизнь". Недавно начал изучать классы, поэтому, буду использовать их.

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

Всем, кто будет откликаться — заранее огромное спасибо, с меня +++ к репутации.

Итак, вопрос первый:

Написал пока несколько функций (конструктор, считалку клеток вокруг и вывод массива). Есть некоторые проблемы с конструктором:

такой код кушает хорошо (без конструктора)
Код
C++
1
2
3
4
5
6
7
8
9
10
class Life
{
public:
    int around ( int, int );
    void print ();
private:
    bool array [ 3 ][ 3 ] = { { 0, 0, 0 },
                              { 0, 0, 1 },
                              { 0, 1, 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
#include <iostream>
#include "life.h"
using namespace std;
 
int Life::around ( int y, int x )
{
    int around = 0;
    
    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++;
       
    if ( array [ y - 1 ][ x ] == 1 )
       around++;
       
    if ( array [ y - 1 ][ x + 1 ] == 1 )
       around++;
 
    return around;
}
       
void Life::print ()
{   
    for ( int i = 0; i < 3; i++ )
    {
        for ( int k = 0; k < 3; k++ )
            cout << array [ i ][ k ];
            
        cout << endl;
    }
}


а вот на такое:
Код
C++
1
2
3
4
5
6
7
8
9
class Life
{
public:
    Life ();
    int around ( int, int );
    void print ();
private:
    bool array [ 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
#include <iostream>
#include "life.h"
using namespace std;
 
Life::Life ()
{
    array [ 3 ][ 3 ] = { { 0, 0, 0 },
                         { 0, 0, 1 },
                         { 0, 1, 1 } };
}
 
int Life::around ( int y, int x )
{
    int around = 0;
    
    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++;
       
    if ( array [ y - 1 ][ x ] == 1 )
       around++;
       
    if ( array [ y - 1 ][ x + 1 ] == 1 )
       around++;
 
    return around;
}
       
void Life::print ()
{   
    for ( int i = 0; i < 3; i++ )
    {
        for ( int k = 0; k < 3; k++ )
            cout << array [ i ][ k ];
            
        cout << endl;
    }
}


говорит
In constructor `Life::Life()':
expected primary-expression before '{' token
expected `;' before '{' token
На мой взгляд, обе конструкции одинаковые, но компилятору что-то не нравится (пишу в wxDev-C++).

Что не так?
Спасибо.


UPDATE: перекомпилировал, выдаёт туеву хучу ошибок (
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.09.2011, 01:09     Жизнь (нужна поддержка)
Посмотрите здесь:

Поддержка скинов в приложении C++
Игра Жизнь C++
игра жизнь C++
Программа Жизнь C++
Стандарт C++ поддержка Concepts и Reflection C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
29.09.2011, 01:22     Жизнь (нужна поддержка) #2
C++
1
2
3
array [ 3 ][ 3 ] = { { 0, 0, 0 },
 { 0, 0, 1 },
 { 0, 1, 1 } };
Таким образом вы элементу 3ей строки и 3его столбца присваиваете не правильные данные.
Конструкция
C++
1
2
3
= { { 0, 0, 0 },
 { 0, 0, 1 },
 { 0, 1, 1 } }
работает только при инициализации двумерного массива.
vortexx1
 Аватар для vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
29.09.2011, 01:24  [ТС]     Жизнь (нужна поддержка) #3
И вправду. А как сделать грамотно?
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
29.09.2011, 01:27     Жизнь (нужна поддержка) #4
1-й код не должен компилироваться вообще ибо инициализация не статических константных(static const) полей внутри класса запрещена
2-й код тоже неправилен
Цитата Сообщение от vortexx1 Посмотреть сообщение
array [ 3 ][ 3 ] = { { 0, 0, 0 }, { 0, 0, 1 }, { 0, 1, 1 } };
array [ 3 ][ 3 ] - это обращение к элементу, да и еще и за пределами массива
{ { 0, 0, 0 }, { 0, 0, 1 }, { 0, 1, 1 } } - это список инициализации и применять его к массивам можно только при создании массива

Добавлено через 40 секунд
Цитата Сообщение от vortexx1 Посмотреть сообщение
А как сделать грамотно?
предлагаю вот такой конструктор, хедер файл естественно 2-й
C++
1
2
3
4
5
6
7
8
9
10
Life::Life ()
{
    for (int i = 0; i < 3; ++i)
    {
        for (int j = 0; j < 3 - i; ++j)
            array[i][j] = false;
        for (int k = 3 - i; k < 3; ++k)
            array[i][k] = true;
    }
}
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
29.09.2011, 01:27     Жизнь (нужна поддержка) #5
Цитата Сообщение от vortexx1 Посмотреть сообщение
И вправду. А как сделать грамотно?
Каждый элемент массива обработать.
Выше уже написали как.
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
29.09.2011, 01:29     Жизнь (нужна поддержка) #6
а я такой
C++
1
2
3
4
5
6
7
8
Life::Life ()
{
    Life::array = {
        { 0, 0, 0 },
        { 0, 0, 1 },
        { 0, 1, 1 }
    };
}
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
29.09.2011, 01:32     Жизнь (нужна поддержка) #7
Цитата Сообщение от alkagolik Посмотреть сообщение
а я такой
C++
1
2
3
4
5
6
7
8
Life::Life ()
{
    Life::array = {
        { 0, 0, 0 },
        { 0, 0, 1 },
        { 0, 1, 1 }
    };
}
А что тут происходит? Не очень понятно.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
29.09.2011, 01:34     Жизнь (нужна поддержка) #8
Цитата Сообщение от alkagolik Посмотреть сообщение
а я такой
вариант не работает
vortexx1
 Аватар для vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
29.09.2011, 01:54  [ТС]     Жизнь (нужна поддержка) #9
Пока сделал так:
C++
1
2
3
4
5
6
7
8
9
Life::Life ()
{
    for ( int i = 0; i < 3; i++ )
        for ( int k = 0; k < 3; k++ )
            array [ i ][ k ] = 0;
            
    array [ 1 ][ 2 ] = 1;
    array [ 2 ][ 1 ] = array [ 2 ][ 2 ] = 1;
}
Добавлено через 17 минут
Первые победы на фронте. Теперь, по крайней мере, всё компилируется и даже (!) работает. Количество клеток вокруг заданной считает исправно.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#ifndef LIFE_H
#define LIFE_H
 
class Life
{
public:
    Life ();                        // конструктор
    int around ( int, int );        // считает, сколько клеток вокруг
    void printArray ();             // печатает массив
    
private:
    int array [ 3 ][ 3 ];
};
 
#endif
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
#include <iostream>
#include "life.h"
using namespace std;
 
Life::Life ()
{
    for ( int i = 0; i < 3; i++ )
        for ( int k = 0; k < 3; k++ )
            array [ i ][ k ] = 0;
            
    array [ 1 ][ 2 ] = 1;
    array [ 2 ][ 1 ] = array [ 2 ][ 2 ] = 1;
}
 
int Life::around ( int y, int x )
{
    int around = 0;
    
    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++;
       
    if ( array [ y - 1 ][ x ] == 1 )
       around++;
       
    if ( array [ y - 1 ][ x + 1 ] == 1 )
       around++;
 
    return around;
}
 
void Life::printArray ()
{
    for ( int i = 0; i < 3; i++ )
    {
        for ( int k = 0; k < 3; k++ )
            cout << array [ i ][ k ];
            
        cout << endl;
    }
}
vortexx1
 Аватар для vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
01.10.2011, 14:56  [ТС]     Жизнь (нужна поддержка) #10
Вроде как всё закончил, но при попытке запуска возникает проблема: любая комбинация клеток остаётся на месте первые два хода, а потом просто исчезает.

Взгляните, пожалуйста, свежим незамыленным взглядом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#ifndef LIFE_H
#define LIFE_H
 
class Life
{
public:
    Life ();                        // конструктор
    int around ( int, int );        // считает, сколько клеток вокруг
    void deadOrAlive ( int, int );  // изменяет клетку в зависимости от условий
    void throughArray ();           // прочесывает массив и проверяет каждую его клетку
    void copyArrays ();             // копирует запасной массив в основной
    void clean_Array ();            // очищает запасной массив
    void printArray ();             // печатает массив
    
    int alive ();                   // считает, сколько живых клеток осталось
        
private:
    char array [ 24 ][ 79 ];        // основной массив
    char _array [ 24 ][ 79 ];       // запасной массив
};
 
#endif
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
#include <iostream>
#include "life.h"
using namespace std;
 
Life::Life ()
{   
    // заполняем первый массив
    for ( int a = 0; a < 24; a++ )
        for ( int b = 0; b < 79; b++ )
            array [ a ][ b ] = 0;
    
    array [ 0 ][ 0 ] = 201;
    array [ 0 ][ 78 ] = 187;
    array [ 23 ][ 0 ] = 200;
    array [ 23 ][ 78 ] = 188;
    
    for ( int y = 1; y < 23; y++ )
        array [ y ][ 0 ] = 186;
        
    for ( int _y = 1; _y < 23; _y++ )
        array [ _y ][ 78 ] = 186;
        
    for ( int x = 1; x < 78; x++ )
        array [ 0 ][ x ] = 205;
        
    for ( int _x = 1; _x < 78; _x++ )
        array [ 23 ][ _x ] = 205;
        
    // рисуем глайдер для тестирования        
    array [ 4 ][ 4 ] = 253;
    array [ 5 ][ 5 ] = 253;
    array [ 6 ][ 5 ] = 253;
    array [ 6 ][ 4 ] = 253;
    array [ 6 ][ 3 ] = 253;
 
    
    // копируем первый массив во второй
    for ( int f = 0; f < 24; f++ )
        for ( int j = 0; j < 79; j++ )
            _array [ f ][ j ] = array [ f ][ j ];
}
 
// считает, сколько клеток вокруг
int Life::around ( int y, int x )
{
    int around = 0;
    
    if ( array [ y ][ x + 1 ] == 253 )
       around++;
       
    if ( array [ y + 1 ][ x + 1 ] == 253 )
       around++;
       
    if ( array [ y + 1 ][ x ] == 253 )
       around++;
    
    if ( array [ y + 1 ][ x - 1 ] == 253 )
       around++;
       
    if ( array [ y ][ x - 1 ] == 253 )
       around++;
       
    if ( array [ y - 1 ][ x - 1 ] == 253 )
       around++;
       
    if ( array [ y - 1 ][ x ] == 253 )
       around++;
       
    if ( array [ y - 1 ][ x + 1 ] == 253 )
       around++;
 
    return around;
}
 
// изменяет клетку в зависимости от условий
void Life::deadOrAlive ( int y, int x )
{
    if ( array [ y ][ x ] == 0 )            // если клетка мертвая
        if ( around ( y, x ) == 3 )         // и вокруг 3 живых,
            _array [ y ][ x ] = 253;          // то клетка оживает
            
    if ( array [ y ][ x ] == 1 )
        if ( around ( y, x ) < 2 || around ( y, x ) > 3 )
            _array [ y ][ x ] = 0;
}
 
// прочесывает массив и проверяет каждую его клетку
void Life::throughArray ()
{
    for ( int y = 0; y < 24; y++ )
        for ( int x = 0; x < 79; x++ )
            deadOrAlive ( y, x );
}
 
// копирует запасной массив в основной
void Life::copyArrays ()
{
    for ( int y = 1; y < 23; y++ )
        for ( int x = 1; x < 78; x++ )
            array [ y ][ x ] = _array [ y ][ x ];
}
 
// очищает запасной массив
void Life::clean_Array ()
{
    for ( int y = 0; y < 24; y++ )
        for ( int x = 0; x < 79; x++ )
            _array [ y ][ x ] = 0;
}
 
// печатает массив
void Life::printArray ()
{
    for ( int i = 0; i < 24; i++ )
    {
        for ( int k = 0; k < 79; k++ )
            cout << array [ i ][ k ];
            
        cout << endl;
    }
}
 
// считает, сколько живых клеток осталось
int Life::alive ()
{
    int alive = 0;
    
    for ( int y = 1; y < 23; y++ )
        for ( int x = 1; x < 78; x++ )
            if ( array [ y ][ x ] != 0 )
                alive++;
                
    return alive;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <windows.h>
#include "life.h"
#include "life.cpp"
 
 
int main ()
{
    Life life;
    
    while ( life.alive () != 0 )
    {
        life.throughArray ();
        life.printArray ();
        life.copyArrays ();
        life.clean_Array();
        
        Sleep ( 450 );
        system ( "cls" );
    }
    
    system ( "pause" );
    return 0;
}
Спасибо.

Добавлено через 10 минут
Уважаемые, кто поможет довести до ума, с меня небольшая печенька - 5 WMZ.
rrrFer
Заблокирован
01.10.2011, 16:22     Жизнь (нужна поддержка) #11
C++
1
#include "life.cpp"
это плохо

Добавлено через 2 минуты
странный класс Life, собственно, не понятно почему решили такой класс сделать, ИМХО неудобно, да и ваще..

Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
    for ( int a = 0; a < 24; a++ )
        for ( int b = 0; b < 79; b++ )
            array [ a ][ b ] = 0;
    
    array [ 0 ][ 0 ] = 201;
    array [ 0 ][ 78 ] = 187;
    array [ 23 ][ 0 ] = 200;
    array [ 23 ][ 78 ] = 188;
куча констант - это плохо, если будете изменять размеры поля - замучаетесь

Добавлено через 4 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
if ( array [ y ][ x + 1 ] == 253 )
       around++;
       
    if ( array [ y + 1 ][ x + 1 ] == 253 )
       around++;
       
    if ( array [ y + 1 ][ x ] == 253 )
       around++;
    
    if ( array [ y + 1 ][ x - 1 ] == 253 )
       around++;
       
    if ( array [ y ][ x - 1 ] == 253 )
       around++;
       
    if ( array [ y - 1 ][ x - 1 ] == 253 )
       around++;
       
    if ( array [ y - 1 ][ x ] == 253 )
       around++;
       
    if ( array [ y - 1 ][ x + 1 ] == 253 )
       around++;
элегантно заменяется на:
C++
1
2
3
for( i = -1; i < 2; i ++ )
        for( j = -1; j < 2; j ++ )
            around += 253 == array[ y + i ][ x + j ];
Добавлено через 1 минуту
C++
1
  if ( around ( y, x ) < 2 || around ( y, x ) > 3 )
а тут функция around вызывается 2 раза с одними параметрами, негоже так делать
vortexx1
 Аватар для vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
01.10.2011, 16:30  [ТС]     Жизнь (нужна поддержка) #12
Спасибо, сейчас пошаманю и сообщу о результатах.

Добавлено через 5 минут
rrrFer, по поводу последнего пункта: как это иначе записать? Не вижу другого способа.
rrrFer
Заблокирован
01.10.2011, 16:34     Жизнь (нужна поддержка) #13
скорее всего, ошибка была тут:
C++
1
2
 if ( array [ y ][ x ] == 1 )
        if ( around ( y, x ) < 2 || around ( y, x ) > 3 )
в первой строке сравниваем с единицей, а почему с единицей? у живой клетки в массиве записано 253:
C++
1
_array [ y ][ x ] = 253;          // то клетка оживает
Добавлено через 1 минуту
rrrFer, по поводу последнего пункта: как это иначе записать? Не вижу другого способа.
C++
1
2
int i = around ( y, x );
if ( i < 2 || i > 3 )
vortexx1
 Аватар для vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
01.10.2011, 16:38  [ТС]     Жизнь (нужна поддержка) #14
Сделал всё как сказали. Всё осталось по прежнему
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
01.10.2011, 17:03     Жизнь (нужна поддержка) #15
А почему бы не сделать 2 массива bool, и добавить пару строчек в printArray? Имхо так будет понятнее, чем
Цитата Сообщение от vortexx1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
if ( array [ y ][ x + 1 ] == 253 )
       around++;
       
    if ( array [ y + 1 ][ x + 1 ] == 253 )
       around++;
       
    if ( array [ y + 1 ][ x ] == 253 )
       around++;
    
    if ( array [ y + 1 ][ x - 1 ] == 253 )
       around++;
       
    if ( array [ y ][ x - 1 ] == 253 )
       around++;
       
    if ( array [ y - 1 ][ x - 1 ] == 253 )
       around++;
       
    if ( array [ y - 1 ][ x ] == 253 )
       around++;
       
    if ( array [ y - 1 ][ x + 1 ] == 253 )
       around++
ну и прочее в этом роде.
vortexx1
 Аватар для vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
01.10.2011, 17:07  [ТС]     Жизнь (нужна поддержка) #16
Задача решена, всем спасибо.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.10.2011, 17:11     Жизнь (нужна поддержка)
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
rrrFer
Заблокирован
01.10.2011, 17:11     Жизнь (нужна поддержка) #17
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#ifndef LIFE_H
#define LIFE_H
 
class Life
{
public:
    Life ();                        // конструктор
    int around ( int, int );        // считает, сколько клеток вокруг
    void deadOrAlive ( int, int );  // изменяет клетку в зависимости от условий
    void throughArray ();           // прочесывает массив и проверяет каждую его клетку
    void copyArrays ();             // копирует запасной массив в основной
    void clean_Array ();            // очищает запасной массив
    void printArray ();             // печатает массив
    
    int alive ();                   // считает, сколько живых клеток осталось
        
private:
    unsigned char array [ 24 ][ 79 ];        // основной массив
    unsigned char _array [ 24 ][ 79 ];       // запасной массив
};
 
#endif
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <windows.h>
#include "life.h"
 
int main ()
{
    Life life;
    int i;
    
    while ( ( i = life.alive () ) )
    {
        life.printArray ();
        life.throughArray (); 
        life.copyArrays ();
        //life.clean_Array();
        
        Sleep ( 450 );
        system ( "cls" );
    }
    
    system ( "pause" );
    return 0;
}
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
#include <iostream>
#include "life.h"
using namespace std;
 
Life::Life ()
{   
    // заполняем первый массив
    for ( int a = 0; a < 24; a++ )
        for ( int b = 0; b < 79; b++ )
            array [ a ][ b ] = 0;
    
    array [ 0 ][ 0 ] = 201;
    array [ 0 ][ 78 ] = 187;
    array [ 23 ][ 0 ] = 200;
    array [ 23 ][ 78 ] = 188;
    
    for ( int y = 1; y < 23; y++ )
        array [ y ][ 0 ] = 186;
        
    for ( int _y = 1; _y < 23; _y++ )
        array [ _y ][ 78 ] = 186;
        
    for ( int x = 1; x < 78; x++ )
        array [ 0 ][ x ] = 205;
        
    for ( int _x = 1; _x < 78; _x++ )
        array [ 23 ][ _x ] = 205;
        
    // рисуем глайдер для тестирования      
    array [ 4 ][ 4 ] = 253;
    array [ 5 ][ 5 ] = 253;
    array [ 6 ][ 5 ] = 253;
    array [ 6 ][ 4 ] = 253;
    array [ 6 ][ 3 ] = 253;
 
    
    // копируем первый массив во второй
    for ( int f = 0; f < 24; f++ )
        for ( int j = 0; j < 79; j++ )
            _array [ f ][ j ] = array [ f ][ j ];
}
 
// считает, сколько клеток вокруг
int Life::around ( int y, int x )
{
    int around, i, j;
 
    around = - ( 253 == array[ y ][ x ] ) ;
    for( i = -1; i < 2; i ++ )
        for( j = -1; j < 2; j ++ )
            around += ( 253 == array[ y + i ][ x + j ] );
 
    return around;
}
 
// изменяет клетку в зависимости от условий
void Life::deadOrAlive ( int y, int x )
{
    int i = around ( y, x );
 
    if ( 0 == array [ y ][ x ] ) {              // если клетка мертвая
        if ( 3 == i )                           // и вокруг 3 живых,
            _array [ y ][ x ] = 253;            // то клетка оживает
        return;
    }
    if ( i < 2 || i > 3 ) {
        _array [ y ][ x ] = 0;
        return;
    }
 
    _array [ y ][ x ] = array [ y ][ x ];
 
}
 
// прочесывает массив и проверяет каждую его клетку
void Life::throughArray ()
{
    for ( int y = 1; y < 23; y++ )
        for ( int x = 1; x < 78; x++ )
            deadOrAlive ( y, x );
}
 
// копирует запасной массив в основной
void Life::copyArrays ()
{
    for ( int y = 1; y < 23; y++ )
        for ( int x = 1; x < 78; x++ )
            array [ y ][ x ] = _array [ y ][ x ];
}
 
// очищает запасной массив
void Life::clean_Array ()
{
    for ( int y = 1; y < 23; y++ )
        for ( int x = 1; x < 78; x++ )
            _array [ y ][ x ] = 0;
}
 
// печатает массив
void Life::printArray ()
{
    for ( int i = 0; i < 24; i++ )
    {
        for ( int k = 0; k < 79; k++ )
            cout << array [ i ][ k ];
            
        cout << endl;
    }
}
 
// считает, сколько живых клеток осталось
int Life::alive ()
{
    int alive = 0;
    
    for ( int y = 1; y < 23; y++ )
        for ( int x = 1; x < 78; x++ )
            if ( array [ y ][ x ] != 0 )
                alive++;
                
    return alive;
}
Yandex
Объявления
01.10.2011, 17:11     Жизнь (нужна поддержка)
Ответ Создать тему
Опции темы

Текущее время: 11:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru