Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
1 / 1 / 0
Регистрация: 02.03.2011
Сообщений: 42
1

игра жизнь

20.11.2011, 07:53. Просмотров 2367. Ответов 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) и как оптимизировать код? вроде можно использовать наследование... и хотелось бы, но нет идей что нужно наследовать.
нужна помощь.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.11.2011, 07:53
Ответы с готовыми решениями:

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

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

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

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

11
2551 / 1316 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
20.11.2011, 08:41 2
Цитата Сообщение от Wikipedia
пустая (мёртвая) клетка, рядом с которой ровно три живые клетки, оживает;
если у живой клетки есть две или три живые соседки, то эта клетка продолжает жить; в противном случае (если соседей меньше двух или больше трёх) клетка умирает (от «одиночества» или от «перенаселённости»).
Гляньте на свой Generate.
1
214 / 193 / 23
Регистрация: 03.08.2011
Сообщений: 2,824
Записей в блоге: 12
20.11.2011, 11:14 3
Цитата Сообщение от soon Посмотреть сообщение
Гляньте на свой Generate.
да что за бегин эн введите константы
Цитата Сообщение от temperus Посмотреть сообщение
2) как это можно графицировать? лучше использовать opengl, но как его использовать тут?
в консоле system("cls") и перерисовка
0
2551 / 1316 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
20.11.2011, 11:20 4
Цитата Сообщение от Van111 Посмотреть сообщение
в консоле system("cls") и перерисовка
Сам так пробовал - мельтишить будет. Хотя, если только для отладки алгоритма, то пойдет
0
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();
}
что еще тут не так ?
0
2551 / 1316 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
20.11.2011, 18:29 6
Цитата Сообщение от temperus Посмотреть сообщение
нужна графика на постоянной основе, а не для того, чтобы отладить.
На qt можно за недельку реализовать, без особых знаний и не 24/7.
Цитата Сообщение от temperus Посмотреть сообщение
что еще тут не так ?
Попробуйте в дебаггере отловить.

Добавлено через 4 минуты
Кстати, у вас фируга из 4-х клеток будет стабильной только после 3-го хода. Так, между словом.
1
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 - стабильна.
ты про эту говорил ?
хотя она должна меняться.
0
2551 / 1316 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
21.11.2011, 12:14 8
Фигура из 4-х клеток подряд только на третий ход станет стабильной.
0
Изображения
   
2551 / 1316 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
21.11.2011, 12:17 9
Ну, это если считать первую картинку первым ходом
Касательно книги: я делал по Марку Саммерфилду "Qt 4. Программирование gui на c++". Там есть замечательный пример с ImgEditor
1
388 / 280 / 53
Регистрация: 26.12.2009
Сообщений: 875
21.11.2011, 12:26 10
вот реализация на opengl
посмотри, может что-то будет полезным
0
388 / 280 / 53
Регистрация: 26.12.2009
Сообщений: 875
21.11.2011, 12:28 11
Life.rar
а прикрепить файл забыл
1
388 / 280 / 53
Регистрация: 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};
и, как следствие больше ненужного кода и "некрасивое" заполнение фигур
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.11.2011, 12:32

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

Игра "жизнь" - глайдер ведет себя не так, как надо
Добрый вечер. Нужно написать игру &quot;жизнь&quot;. Реализовал,однако глайдер ведет себя не так,как надо....

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


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

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