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

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

Войти
Регистрация
Восстановить пароль
 
vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
#1

Моргание экрана (graphics.h) - C++

09.10.2011, 11:23. Просмотров 723. Ответов 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
#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:
    static const int y_size = 44;
    static const int x_size = 99;
    
    bool array [ y_size ][ x_size ];        // основной массив
    bool _array [ y_size ][ x_size ];       // запасной массив
};
 
#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
135
136
137
138
139
140
141
142
143
#include <graphics.h>
#include <ctime>
#include <cstdlib>
#include "life.h"
 
Life::Life ()
{   
        // случайное заполнение массива
        srand ( time ( 0 ) );
        
        bool random;
        
        for ( int i = 0; i < y_size - 10; i++ )
            for ( int k = 0; k < x_size - 10; k++ )
            {
                random = 0 + rand() % 2;
                
                if ( random == 0 )
                   array [ i ][ k ] = 0;
                else
                   array [ i ][ k ] = 253;
            }
               
        // копируем первый массив во второй
        for ( int f = 0; f < y_size; f++ )
            for ( int j = 0; j < x_size; j++ )
                _array [ f ][ j ] = array [ f ][ j ];
}
 
// считает, сколько клеток вокруг
int Life::around ( int y, int x )
{
        int around = 0;
 
        if ( array [ y ][ x + 1 ] == true )
           around++;
           
        if ( array [ y - 1 ][ x + 1 ] == true )
           around++;
           
        if ( array [ y - 1 ][ x ] == true )
           around++;
           
        if ( array [ y - 1 ][ x - 1 ] == true )
           around++;
           
        if ( array [ y ][ x - 1 ] == true )
           around++;
           
        if ( array [ y + 1 ][ x - 1 ] == true )
           around++;
           
        if ( array [ y + 1 ][ x ] == true )
           around++;
           
        if ( array [ y + 1 ][ x + 1 ] == true )
           around++;
 
        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 ] = 1;            // то клетка оживает
                
            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 < y_size - 1; y++ )
        for ( int x = 1; x < x_size - 1; x++ )
            deadOrAlive ( y, x );
}
 
// копирует запасной массив в основной
void Life::copyArrays ()
{
    for ( int y = 1; y < y_size - 1; y++ )
        for ( int x = 1; x < x_size - 1; x++ )
            array [ y ][ x ] = _array [ y ][ x ];
}
 
// рисует массив
void Life::printArray ()
{
    // масштаб клеток
    const int const_x = 6;         
    const int const_y = 6;
    
    int x = 0;
    int y = 0;
    
    // отрисовка клеток
    for ( int i = 0; i < y_size; i++ )
        for ( int k = 0; k < x_size; k++ )
        {
            if ( array [ i ][ k ] == true )
            {
                 rectangle ( x, y, x + const_x, y + const_y );
                 floodfill ( x + 1, y + 1, 15 );
            }
            
            x += const_x;
            
            if ( k == x_size - 1 )
            {
                 y += const_y;
                 x = 0;
            }
        }
}
 
// считает, сколько живых клеток осталось
int Life::alive ()
{
    int alive = 0;
        
    for ( int y = 10; y < y_size - 10; y++ )
        for ( int x = 10; x < x_size - 10; 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
24
25
26
#include <graphics.h>
#include "life.h"
#include "life.cpp"
 
int main()
{
    initwindow( 560, 230 );          // создаём графическое окно 1024:768
    setbkcolor ( 0 );                // ставим цвет фона ЧЕРНЫЙ
    cleardevice ();                  // обновляем экран
    setcolor ( WHITE );              // цвет вывода БЕЛЫЙ
    
    Life life;
 
    while ( life.alive () )
    {
        life.throughArray ();
        life.copyArrays ();
        life.printArray ();
        
        Sleep ( 300 );
        cleardevice ();
    }
    
    closegraph ();
    return 0;
}
При запуске (я приаттачил файл) всё работает, но неистово моргает и перерисовывает экран. Стоит заметить, что в консольной версии этого не было. Также уровень моргания снижается при уменьшении размеров графического окна.

Так как же сделать, чтобы всё работало красиво и без заморочек?

Спасибо.
Вложения
Тип файла: rar main2.rar (288.2 Кб, 13 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.10.2011, 11:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Моргание экрана (graphics.h) (C++):

Где скачать Borland С++ с поддержкой graphics.h. Уроки по библеотеке graphics.h - C++
Подскажите, нужен Borland С++ с поддержкой graphics.h. Я видел только 1 борланд и выглядело все там не так как мне нужно. Есть новый...

Написать игру. В верхней части экрана летят 3 «звездочки»(***). В нижнем правом углу экрана находиться буква «О» - C++
Написать игру. В верхней части экрана летят 3 «звездочки»(***). В нижнем правом углу экрана находиться буква «О». После нажатия любой...

Graphics - C++
Используя графический модуль Graphics изобразить на экране цветное кольцо в движении. P.S. Библиотека Graphics подключается, как обычно,...

<graphics.h> - C++
Всем привет. Допустим, у меня есть двумерный массив BOOL. Как мне графически отрисовать его при помощи graphics.h? То есть, если true...

Graphics - C++
Хочу научиться в c++, используя Graphics, делать анимацию. Подскажите, пожалуйста, как это сделать на примере вращающейся геометрической...

graphics.h - C++
В Visual Studio 2012 не могу подключить graphics.h и &lt;alloc.h&gt;. В программировании новичок, и не могу сам решить эту проблему ...ПОМОГИТЕ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
09.10.2011, 12:03  [ТС] #2
Ну же, хоть кто-нибудь.
С меня плюсики
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
09.10.2011, 12:40 #3
vortexx1, убрать мерцание можно лишь заменой cleardevice (); на собственный велосипед который будет зарисовывать нужные части, но "овчинка выделки не стоит"
vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
09.10.2011, 12:49  [ТС] #4
А нет где-нибудь готового общедоступного велосипеда?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.10.2011, 12:49
Привет! Вот еще темы с ответами:

установка graphics.h - C++
здравствуйте. объясните пожалуйста, как нужно настроить библиотеку graphics.h в code::blocks.

Не подключается <graphics.h> - C++
#include &lt;dos.h&gt; #include &lt;conio.h&gt; #include &lt;graphics.h&gt; main () { int n=...

Мануал по Graphics.h - C++
Где можно найти описание и примеры использование Graphics.h в VS???

BGI graphics.h - C++
#include &quot;graphics.h&quot; #include &lt;iostream&gt; #include &lt;math.h&gt; #include &lt;stdlib.h&gt; // Provides exit #include...


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

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

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