0 / 0 / 0
Регистрация: 22.01.2017
Сообщений: 55
1

Движение прямоугольника c применением функции

04.03.2017, 10:56. Показов 1821. Ответов 16
Метки нет (Все метки)

Доброе время суток, ребята подскажите в где проблема?

Реализовать перемещение прямоугольника внутри цветной рамки.
Каждая сторона рамки отрисовывается разным цветом.
Когда прямоугольник наезжает на одну из сторон рамки - прямоугольник становится такого цвета, как была рамка.
Рамка меняет цвет случайным образом

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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#include<iostream>
#include<windows.h>
#include<conio.h>
#include<time.h>
using namespace std;
enum Color { Black = 0, Blue, Green, Cyan, Red, Magenta, Brown, LightGray, 
    DarkGray, LightBlue, LightGreen, LightCyan, LightRed, LightMagenta, Yellow, White };
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);//НАДО
 
void setColor(Color text, Color background)
{
    SetConsoleTextAttribute(hStdOut, (WORD)((background << 4) | text));
}
void setCursor(int x, int y)
{
    COORD c = { x,y };//инициализируем объект координатами
    SetConsoleCursorPosition(hStdOut, c);
}
 
void show_field(int size, Color arr[])
{
    // левая граница
    Color color = Black;
    for (int i = 0; i <= size; i++)
    {
        setColor(arr[0], (Color)color);
        cout << (char)15 << '\n';
    }
    setCursor(1, 0);
    // верхняя граница
    for (int i = 0; i < size * 2; i++)
    {
        setColor(arr[1], (Color)color);
        cout << (char)15;
    }
    // правая граница
    for (int i = 0; i < size; i++)
    {
        setColor(arr[2], (Color)color);
        setCursor(size * 2, i);
        cout << (char)15 << '\n';
    }
    setCursor(1, size);
    // нижняя граница
    for (int i = 0; i < size * 2; i++)
    {
        setColor(arr[3], (Color)color);
        cout << (char)15;//196
    }
    cout << '\n';
    setColor(White, Black);
}
 
void show_rectangle(int size, int kx, int ky, int color)
{
    for (int i = 0; i < size - 1; i++)
    {
        setColor((Color)color, (Color)color);
        setCursor(kx, ky + i);
        for (int j = 0; j < size; j++)
        {
            cout << ' ';
        }
        cout << '\n';
    }
    setColor(White, Black);
}
void main()
{
    srand(time(NULL));
    int field_size = 10, figure_size = 3;
    Color colors[4], figure_color = Color(rand() % 15 + 1);
    for (int i = 0; i < 4; i++)
    {
        colors[i] = Color(rand() % 15 + 1);
    }
    const int LEFT_KEY = 75;
    const int RIGHT_KEY = 77;
    const int UP_KEY = 72;
    const int DOWN_KEY = 80;
    const int ESC_KEY = 27;
    int button, kx = 1, ky = 1;
    int color = rand() % 15 + 1;
 
    show_field(field_size, colors);
    show_rectangle(figure_size, kx, ky, figure_color);
 
    do {
        button = _getch();
        switch (button)
        {
        case LEFT_KEY:
            if (kx <= 1)
            {
                figure_color = colors[0];
                show_rectangle(figure_size, kx, ky, figure_color);
                break;
            }
            else
            {
                kx--;
            }
            system("cls");
            show_field(field_size, colors);
            show_rectangle(figure_size, kx, ky, figure_color);
            break;
        case RIGHT_KEY:
            if (kx >= field_size * 2 - figure_size + 1)
            {
                figure_color = colors[2];
                show_rectangle(figure_size, kx, ky, figure_color);
                break;
            }
            else
            {
                kx++;
            }
            system("cls");
            show_field(field_size, colors);
            show_rectangle(figure_size, kx, ky, figure_color);
            break;
        case UP_KEY:
            if (ky <= 1)
            {
                figure_color = colors[1];
                show_rectangle(figure_size, kx, ky, figure_color);
                break;
            }
            else
            {
                ky--;
            }
            system("cls");
            show_field(field_size, colors);
            show_rectangle(figure_size, kx, ky, figure_color);
            break;
        case DOWN_KEY:
            if (ky >= field_size - figure_size + 1)
            {
                figure_color = colors[3];
                show_rectangle(figure_size, kx, ky, figure_color);
                break;
            }
            else
            {
                ky++;
            }
            system("cls");
            show_field(field_size, colors);
            show_rectangle(figure_size, kx, ky, figure_color);
            break;
        default:
            break;
        }
    } while (button != ESC_KEY);
    system("pause");
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.03.2017, 10:56
Ответы с готовыми решениями:

движение прямоугольника
как уменьшить скорость движения? #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt;...

Движение прямоугольника
Здравствуйте! У меня проблема с этой работой. Программа идет. Но прямоугольник движется по...

Как построить с применением функции
Составить программу для нахождения суммы (1/2*3)+(1/3*4)+(1/4*5)+...+(n-1)/n(n+1) в виде...

Составить программу c применением функции С++
Помогите составить программу для вычисления значений функции вида: cos(x2)+cos2(x3)+cos3(y4)

16
132 / 158 / 87
Регистрация: 06.04.2016
Сообщений: 992
12.03.2017, 11:36 2
Добавлено через 2 часа 36 минут
Блин, не знаю, уже что делать. Когда рисует прямоугольное поле в функции show_field, тогда рисует все цвета нормально. Когда рисует сам этот бегающий прямоугольник никак не хочет цвета менять, только всегда стоит белое на черном.
Профессионалы, подскажите, пожалуйста, в чем проблема.
0
132 / 158 / 87
Регистрация: 06.04.2016
Сообщений: 992
12.03.2017, 11:38 3
Вот еще картинка Вам. Тут давлю влево и цвет не меняется.
Изображения
 
0
132 / 158 / 87
Регистрация: 06.04.2016
Сообщений: 992
12.03.2017, 11:39 4
Удалено.
0
0 / 0 / 0
Регистрация: 22.01.2017
Сообщений: 55
12.03.2017, 17:17  [ТС] 5
вот из-за этого вся проблема((((
0
132 / 158 / 87
Регистрация: 06.04.2016
Сообщений: 992
12.03.2017, 17:30 6
Ну а как тут проконтролируешь, то работает SetColor, то не работает. Или что-то секретное влияет?
Для справки:
Функция SetColor:
C++
1
2
3
4
void SetColor(Color text, Color background)
{
    SetConsoleTextAttribute(hStdOut, (WORD)((background << 4) | text));
}
0
0 / 0 / 0
Регистрация: 22.01.2017
Сообщений: 55
12.03.2017, 18:12  [ТС] 7
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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
вот так более менее, но не до работа но опять((
 
#include<iostream>
#include<windows.h>
#include<conio.h>
#include<time.h>
using namespace std;
enum Color {
    Black = 0, Blue, Green, Cyan, Red, Magenta, Brown, LightGray,
    DarkGray, LightBlue, LightGreen, LightCyan, LightRed, LightMagenta, Yellow, White
};
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);//НАДО
void Sleep(BYTE time)
{
    Sleep((DWORD)time * 5);
}
void setColor(Color text, Color background)
{
    SetConsoleTextAttribute(hStdOut, (WORD)((background << 4) | text));
}
void setCursor(int x, int y)
{
    COORD c = { x, y };//инициализируем объект координатами
    SetConsoleCursorPosition(hStdOut, c);
}
/*Реализовать перемещение прямоугольника  внутри цветной рамки.
Каждая сторона рамки отрисовывается разным цветом.
Когда прямоугольник наезжает на одну из сторон рамки - прямоугольник становится такого цвета, как была рамка.
Рамка меняет цвет случайным образом.*/
 
void show_field(int size, int arr[])
{
    // левая граница
    Color color = Black;
    for (int i = 0; i <= size; i++)
    {
        setColor(Color(arr[0]), (Color)color);
        cout << (char)15 << '\n';
    }
    setCursor(1, 0);
    // верхняя граница
    for (int i = 0; i < size * 2; i++)
    {
        setColor(Color(arr[1]), (Color)color);
        cout << (char)15;
    }
    // правая граница
    for (int i = 0; i < size; i++)
    {
        setColor(Color(arr[2]), (Color)color);
        setCursor(size * 2, i);
        cout << (char)15 << '\n';
    }
    setCursor(1, size);
    // нижняя граница
    for (int i = 0; i < size * 2; i++)
    {
        setColor(Color(arr[3]), (Color)color);
        cout << (char)15;
    }
    cout << '\n';
    setColor(White, Black);
}
 
void show_rectangle(int size, int kx, int ky, int color)
{
    for (int i = 0; i < size - 1; i++)
    {
        setColor((Color)color, (Color)color);
        setCursor(kx, ky + i);
        for (int j = 0; j < size; j++)
        {
            cout << ' ';
        }
        cout << '\n';
    }
    setColor(White, Black);
}
void main()
{
    srand(time(NULL));
    int field_size = 10, figure_size = 3;
    int colors[4], figure_color = Color(rand() % 15 + 1);
    for (int i = 0; i < 4; i++)
    {
        colors[i] = Color(rand() % 15 + 1);
    }
    const int LEFT_KEY = 75;
    const int RIGHT_KEY = 77;
    const int UP_KEY = 72;
    const int DOWN_KEY = 80;
    const int ESC_KEY = 27;
    int button, kx = 1, ky = 1;
    int color = rand() % 15 + 1;
 
    show_field(field_size, colors);
    show_rectangle(figure_size, kx, ky, figure_color);
 
    do {
        Sleep((BYTE)2);
        button = _getch();
        switch (button)
        {
        case LEFT_KEY:
            if (kx <= 0)
            {
                figure_color = colors[0];
                colors[0] = rand() % 15 + 1;
                show_rectangle(figure_size, kx, ky, figure_color);
                break;
            }
            else
            {
                kx--;
            }
            system("cls");
            show_field(field_size, colors);
            show_rectangle(figure_size, kx, ky, figure_color);
            break;
        case RIGHT_KEY:
            if (kx >= field_size * 2 - figure_size + 1)
            {
                figure_color = colors[2];
                colors[2] = rand() % 15 + 1;
                show_rectangle(figure_size, kx, ky, figure_color);
                break;
            }
            else
            {
                kx++;
            }
            system("cls");
            show_field(field_size, colors);
            show_rectangle(figure_size, kx, ky, figure_color);
            break;
        case UP_KEY:
            if (ky <= 0)
            {
                figure_color = colors[1];
                colors[1] = rand() % 15 + 1;
                show_rectangle(figure_size, kx, ky, figure_color);
                break;
            }
            else
            {
                ky--;
            }
            system("cls");
            show_field(field_size, colors);
            show_rectangle(figure_size, kx, ky, figure_color);
            break;
        case DOWN_KEY:
            if (ky >= field_size - 1)
            {
                figure_color = colors[3];
                colors[3] = rand() % 15 + 1;
                show_rectangle(figure_size, kx, ky, figure_color);
                break;
            }
            else
            {
                ky++;
            }
            system("cls");
            show_field(field_size, colors);
            show_rectangle(figure_size, kx, ky, figure_color);
            break;
        default:
            break;
        }
    } while (button != ESC_KEY);
    system("pause");
}
0
1269 / 1026 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
12.03.2017, 22:32 8
Sports, проблема решена? Если нет, то в чём проблема?
0
0 / 0 / 0
Регистрация: 22.01.2017
Сообщений: 55
12.03.2017, 23:35  [ТС] 9
Нет, не решена.
Условие задачи, не совпадают с ее решением(((
0
1269 / 1026 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
12.03.2017, 23:39 10
Цитата Сообщение от Sports Посмотреть сообщение
Условие задачи, не совпадают с ее решением
Что именно не совпадает? Цвет не меняется?
0
0 / 0 / 0
Регистрация: 22.01.2017
Сообщений: 55
12.03.2017, 23:45  [ТС] 11
Да
Прямоугольник например красный, рамка (единственная рабочая) зеленая!
Когда прямоугольник наезжает на одну из сторон рамки - прямоугольник становится такого цвета, как была рамка
0
1269 / 1026 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
12.03.2017, 23:53 12
Цитата Сообщение от Sports Посмотреть сообщение
Когда прямоугольник наезжает на одну из сторон рамки - прямоугольник становится такого цвета, как была рамка
А как должно быть?
0
132 / 158 / 87
Регистрация: 06.04.2016
Сообщений: 992
13.03.2017, 08:54 13
likehood, проблема в том что когда рисуется поле(4 грани цветного прямоугольника) оно рисуется по цветам нормально. А когда рисуется этот, задолбавший уже всех, прямоугольник, то цвет фона и шрифта никак не хочет изменяться. Цвета становятся по умолчанию: черный фон, белые буквы. Функция при этом используется одна и таже:
C++
1
2
3
4
void SetColor(Color text, Color background)
{
    SetConsoleTextAttribute(hStdOut, (WORD)((background << 4) | text));
}
Но как есть, так есть. Получается так, как я показал на картинке в моем сообщении №3. Может Вы знаете почему так происходит?
0
1269 / 1026 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
13.03.2017, 08:58 14
Цитата Сообщение от DemolitionMan Посмотреть сообщение
то цвет фона и шрифта никак не хочет изменяться. Цвета становятся по умолчанию: черный фон, белые буквы.
У меня меняется. Использую последнюю программу автора темы.
0
132 / 158 / 87
Регистрация: 06.04.2016
Сообщений: 992
13.03.2017, 09:16 15
У меня случайно все меняется в последней версии программы.
0
1269 / 1026 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
13.03.2017, 09:18 16
Цитата Сообщение от DemolitionMan Посмотреть сообщение
У меня случайно все меняется в последней версии программы
Насколько я понял, так и должно быть. Цвет границы меняется случайным образом, цвет прямоугольника - каким был раньше цвет границы.
0
132 / 158 / 87
Регистрация: 06.04.2016
Сообщений: 992
13.03.2017, 10:54 17
Да, но если сделать жесткое присвоение цветов, то опять ничего не работает.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.03.2017, 10:54
Помогаю со студенческими работами здесь

Многомодульная программа с применением функции
Всем привет. Помогите, пожалуйста, решить проблему, которая возникла при создании многомодульной...

Посчитать с применением рекурсивной функции
Здравствуйте, помогите пожалуйста с рекурсией. Нужно посчитать суму первого выражения Вот мой...

Класс с применением виртуальной функции
Нужна программа создания класса и применения виртуальной функции... Тут есть пример... но я вообще...

Написать функцию, которая вычисляет площадь прямоугольника. Параметрами функции должны быть длина и ширина прямоугольника
24) Написать функцию, которая вычисляет площадь прямоугольника. Параметрами функции должны быть...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru