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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.93
temperus
1 / 1 / 0
Регистрация: 02.03.2011
Сообщений: 42
#1

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

20.11.2011, 07:53. Просмотров 1839. Ответов 11
Метки нет (Все метки)

содержимое 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) и как оптимизировать код? вроде можно использовать наследование... и хотелось бы, но нет идей что нужно наследовать.
нужна помощь.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.11.2011, 07:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос игра жизнь (C++):

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
20.11.2011, 08:41 #2
Цитата Сообщение от Wikipedia
пустая (мёртвая) клетка, рядом с которой ровно три живые клетки, оживает;
если у живой клетки есть две или три живые соседки, то эта клетка продолжает жить; в противном случае (если соседей меньше двух или больше трёх) клетка умирает (от «одиночества» или от «перенаселённости»).
Гляньте на свой Generate.
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,597
Записей в блоге: 12
20.11.2011, 11:14 #3
Цитата Сообщение от soon Посмотреть сообщение
Гляньте на свой Generate.
да что за бегин эн введите константы
Цитата Сообщение от temperus Посмотреть сообщение
2) как это можно графицировать? лучше использовать opengl, но как его использовать тут?
в консоле system("cls") и перерисовка
soon
2540 / 1305 / 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
2540 / 1305 / 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
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
21.11.2011, 12:14 #8
Фигура из 4-х клеток подряд только на третий ход станет стабильной.
Изображения
   
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
21.11.2011, 12:17 #9
Ну, это если считать первую картинку первым ходом
Касательно книги: я делал по Марку Саммерфилду "Qt 4. Программирование gui на c++". Там есть замечательный пример с ImgEditor
Mayonez
380 / 272 / 21
Регистрация: 26.12.2009
Сообщений: 875
21.11.2011, 12:26 #10
вот реализация на opengl
посмотри, может что-то будет полезным
Mayonez
380 / 272 / 21
Регистрация: 26.12.2009
Сообщений: 875
21.11.2011, 12:28 #11
Life.rar
а прикрепить файл забыл
Mayonez
380 / 272 / 21
Регистрация: 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};
и, как следствие больше ненужного кода и "некрасивое" заполнение фигур
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.11.2011, 12:32
Привет! Вот еще темы с ответами:

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

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

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

Игра "Жизнь" - C++
#include &quot;stdafx.h&quot; #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;windows.h&gt; #include &lt;WinCon.h&gt; #include &lt;conio.h&gt; #include...


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

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

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