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

игра жизнь - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.93
temperus
1 / 1 / 0
Регистрация: 02.03.2011
Сообщений: 42
20.11.2011, 07:53     игра жизнь #1
содержимое life.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Life.cpp: определяет точку входа для консольного приложения.
//
 
#include <iostream>
#include "stdafx.h"
#include "Life.h"
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    Life test;
    while(1)
    {
        test.Generate();
        test.Print();
    }
    return 0;
}
содержимое life.h
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
class Life
{
    int cur[100][100], next[100][100];
    int gen;
public:
    Life();
    void Generate();
    int Check(int x, int y);
    void Print();
};
 
Life::Life()
{
    gen=0;
    for(int i=0; i<100; i++)
        for(int j=0; j<100; j++)
           cur[i][j]=next[i][j]=0;
    /* for(int i=0; i<100; i++)
        for(int j=0; j<100; j++)
            {   srand(time(NULL));
                cur[i][j]=rand()%2; } */
        cur[5][5]=1;
        cur[5][4]=1;
        cur[5][6]=1;
 
                
}
 
int Life::Check(int x, int y)
{
    int alive=0;
    int i=x, j=y;
    if (cur[i--][j--]) alive++;
    if (cur[i][j++]) alive++;
    if (cur[i][j++]) alive++;
    if (cur[i++][j]) alive++;
    if (cur[i][j-2]) alive++;
    if (cur[i++][j]) alive++;
    if (cur[i][j++]) alive++;
    if (cur[i][j++]) alive++;
    return alive;
}
 
void Life::Generate()
{
    int alive=0;
    gen++;
    for(int i=BEGIN; i<END; i++)
        for(int j=BEGIN; j<END; j++)
            if (!cur[i][j] && (((alive=Check(i,j))==2))) next[i][j]=1;
            else if ((cur[i][j] && (((alive=Check(i,j))>2)) || (cur[i][j] && (((alive=Check(i,j))<2))))) next[i][j]=0;
    for(int i=BEGIN; i<END; i++)
        for(int j=BEGIN; j<END; j++)
            cur[i][j]=next[i][j];
}
 
void Life::Print()
{
     HDC DC = GetDC(0);
    //printf("\nGeneration %d\n",gen);
    for(int i=BEGIN; i<END; i++)
         for(int j=BEGIN; j<END; j++)
            //   if (cur[i][j]) Rectangle(DC,i,j, 10+i,10+j);
                printf("cur[%d][%d]=%d\n",i,j,cur[i][j]);
    getch();
}
вопросы:
1) фигура из трех последовательных живых клеток должна быть стабильной и превращаться в вертикальную, а потом опять в горизонтальную. в качестве оси - центральная клетка.
не работает. отсюда вопрос - тут правильная математика сделана ?

2) как это можно графицировать? лучше использовать opengl, но как его использовать тут?

3) и как оптимизировать код? вроде можно использовать наследование... и хотелось бы, но нет идей что нужно наследовать.
нужна помощь.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
20.11.2011, 08:41     игра жизнь #2
Цитата Сообщение от Wikipedia
пустая (мёртвая) клетка, рядом с которой ровно три живые клетки, оживает;
если у живой клетки есть две или три живые соседки, то эта клетка продолжает жить; в противном случае (если соседей меньше двух или больше трёх) клетка умирает (от «одиночества» или от «перенаселённости»).
Гляньте на свой Generate.
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,585
Записей в блоге: 12
20.11.2011, 11:14     игра жизнь #3
Цитата Сообщение от soon Посмотреть сообщение
Гляньте на свой Generate.
да что за бегин эн введите константы
Цитата Сообщение от temperus Посмотреть сообщение
2) как это можно графицировать? лучше использовать opengl, но как его использовать тут?
в консоле system("cls") и перерисовка
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
20.11.2011, 11:20     игра жизнь #4
Цитата Сообщение от Van111 Посмотреть сообщение
в консоле system("cls") и перерисовка
Сам так пробовал - мельтишить будет. Хотя, если только для отладки алгоритма, то пойдет
temperus
1 / 1 / 0
Регистрация: 02.03.2011
Сообщений: 42
20.11.2011, 18:18  [ТС]     игра жизнь #5
константы begin = 1
end = 10

нужна графика на постоянной основе, а не для того, чтобы отладить.

Добавлено через 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
class Life
{
    int cur[100][100], next[100][100];
    int gen;
public:
    Life();
    void Generate();
    int Check(int x, int y);
    void Print();
};
 
Life::Life()
{
    gen=0;
    for(int i=0; i<100; i++)
        for(int j=0; j<100; j++)
           cur[i][j]=next[i][j]=0;
    /* for(int i=0; i<100; i++)
        for(int j=0; j<100; j++)
            {   srand(time(NULL));
                cur[i][j]=rand()%2; } */
        cur[5][5]=1;
        cur[5][4]=1;
        cur[5][6]=1;
        cur[5][7]=1;
 
                
}
 
int Life::Check(int x, int y)
{
    int alive=0;
    int i=x, j=y;
    if (cur[i--][j--]) alive++;
    if (cur[i][j++]) alive++;
    if (cur[i][j++]) alive++;
    if (cur[i++][j]) alive++;
    if (cur[i][j-2]) alive++;
    if (cur[i++][j]) alive++;
    if (cur[i][j++]) alive++;
    if (cur[i][j++]) alive++;
    return alive;
}
 
void Life::Generate()
{
    int alive=0;
    gen++;
    for(int i=BEGIN; i<END; i++)
        for(int j=BEGIN; j<END; j++)
            if (!cur[i][j] && (((alive=Check(i,j))==3))) next[i][j]=1;
            else if ((cur[i][j] && (((alive=Check(i,j))>3)) || (cur[i][j] && (((alive=Check(i,j))<2))))) next[i][j]=0;
    for(int i=BEGIN; i<END; i++)
        for(int j=BEGIN; j<END; j++)
            cur[i][j]=next[i][j];
}
 
void Life::Print()
{
     HDC DC = GetDC(0);
    //printf("\nGeneration %d\n",gen);
    for(int i=BEGIN; i<END; i++)
         for(int j=BEGIN; j<END; j++)
            //   if (cur[i][j]) Rectangle(DC,i,j, 10+i,10+j);
                printf("cur[%d][%d]=%d\n",i,j,cur[i][j]);
    getch();
}
что еще тут не так ?
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
20.11.2011, 18:29     игра жизнь #6
Цитата Сообщение от temperus Посмотреть сообщение
нужна графика на постоянной основе, а не для того, чтобы отладить.
На qt можно за недельку реализовать, без особых знаний и не 24/7.
Цитата Сообщение от temperus Посмотреть сообщение
что еще тут не так ?
Попробуйте в дебаггере отловить.

Добавлено через 4 минуты
Кстати, у вас фируга из 4-х клеток будет стабильной только после 3-го хода. Так, между словом.
temperus
1 / 1 / 0
Регистрация: 02.03.2011
Сообщений: 42
20.11.2011, 21:14  [ТС]     игра жизнь #7
Цитата Сообщение от soon Посмотреть сообщение
На qt можно за недельку реализовать, без особых знаний и не 24/7.

Попробуйте в дебаггере отловить.

Добавлено через 4 минуты
Кстати, у вас фируга из 4-х клеток будет стабильной только после 3-го хода. Так, между словом.
что порекомендуешь по Qt почитать? связанное с графикой

Добавлено через 1 час 50 минут
фигура с коодинатами 6,5 и 6,6 - стабильна.
ты про эту говорил ?
хотя она должна меняться.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
21.11.2011, 12:14     игра жизнь #8
Фигура из 4-х клеток подряд только на третий ход станет стабильной.
Изображения
   
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
21.11.2011, 12:17     игра жизнь #9
Ну, это если считать первую картинку первым ходом
Касательно книги: я делал по Марку Саммерфилду "Qt 4. Программирование gui на c++". Там есть замечательный пример с ImgEditor
Mayonez
 Аватар для Mayonez
379 / 271 / 20
Регистрация: 26.12.2009
Сообщений: 875
21.11.2011, 12:26     игра жизнь #10
вот реализация на opengl
посмотри, может что-то будет полезным
Mayonez
 Аватар для Mayonez
379 / 271 / 20
Регистрация: 26.12.2009
Сообщений: 875
21.11.2011, 12:28     игра жизнь #11
Life.rar
а прикрепить файл забыл
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.11.2011, 12:32     игра жизнь
Еще ссылки по теме:

C++ Игра "Жизнь"; Нужно, чтобы первое поколение задавалось оператором (с клавиатуры)
C++ Игра Жизнь
Игра "Жизнь" с самым простым кодом C++

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

Или воспользуйтесь поиском по форуму:
Mayonez
 Аватар для Mayonez
379 / 271 / 20
Регистрация: 26.12.2009
Сообщений: 875
21.11.2011, 12:32     игра жизнь #12
неудачно сделано только вот это:
C++
1
2
3
4
std::vector<Object> stillLifes;
std::vector<Object> oscillators;
std::vector<Object> spaceShips;
std::vector<Object> gun;
надо в двумерный массив и стучаться по этому:
C++
1
enum CATEGORY {STILL_LIFES, OSCILLATORS, SPACESHIPS, GUN};
и, как следствие больше ненужного кода и "некрасивое" заполнение фигур
Yandex
Объявления
21.11.2011, 12:32     игра жизнь
Ответ Создать тему
Опции темы

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