Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 01.11.2014
Сообщений: 8

Как сравнить цвет, который выбран пользователем с тем, который был задан ранее случайным образом?

09.11.2014, 13:51. Показов 2087. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Прошу подсказать, помочь
Задача в том, чтобы на экране появлялись шарики разных цветов, через некоторое время они все закрашивались в белый цвет. А затем пользователь должен по ним щелкать и искать цвет,который был рандомно задан.
Вопрос: можно ли без помощи таймера, сделать так , чтобы шарики горели пять секунд, а затем закрашивались в белый
и самое главное, как сделать так , чтобы нажимая на кнопку "проверить" появлялось сообщение об угаданных шариках( то есть как сравнить те цвета ,которые были, с теми которые выбрал пользователь)
Спасибо!

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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 
 
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::FormPaint(TObject *Sender)
{
TColor OColor[3] =
{
 
  clBlue,
  clRed,
  clYellow
};
 
 
if (Tag == 0)
  {
    randomize();
    for (int i = 0; i < 5; i++)
    {
      Canvas->Brush->Color = OColor[random(3)];
      Canvas->Ellipse(25+i*100, 25, 125+i*100, 125);
    }
    Tag = 1;
  }
 
 
 
 
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
   Canvas->Brush->Color=clWhite;
    for (int i = 0; i < 5; i++)
    {
      Canvas->Ellipse(25+i*100, 25, 125+i*100, 125);
    }
 
/*Canvas->Ellipse(25,25,125,125);
Canvas->Ellipse(125, 25, 225, 125);
Canvas->Ellipse(225, 25, 325, 125);
Canvas->Ellipse(325, 25, 425, 125);
Canvas->Ellipse(425, 25, 525, 125); */
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
 
{
 
TColor OColor[4] =
{
  clWhite,
  clBlue,
  clRed,
  clYellow
};
 
if (Button == mbLeft)  // если кликнули левой кнопкой мыши
    for (int i = 0; i < 4; i++)
      if (Canvas->Pixels[X][Y] == OColor[i])
      {
        Canvas->Brush->Color = OColor[(i+1)%4];
        Canvas->FloodFill(X, Y, OColor[i], fsSurface);
        break;
      }
}
//---------------------------------------------------------------------------
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.11.2014, 13:51
Ответы с готовыми решениями:

Проверка, совпадает ли ранее скаченный файл с тем, который на сервере
Здравствуйте. Использую объект TFTPSend из пакета synapse. Как лучше всего сделать проверку совпадает ли ранее скаченный файл с тем который...

Не получается удалить файл, который ранее был загружен в PictureBox
Доброго времени суток. Помогите разрешить вот такой вопрос. Сначала я загружаю файл в PictureBox: public String PhotoPath; ...

Сделать так, что бы в таблицу автоматом напротив операции вносилось имя пользователя, который был выбран
Нужна помощь. Есть БД, например, расходные и приходные материалы. При открытии базы данных - нужно выбрать пользователя в форме, затем...

12
0 / 0 / 0
Регистрация: 01.11.2014
Сообщений: 8
09.11.2014, 19:35  [ТС]
Здравствуйте.
Есть разноцветные элементы, которые "горят" 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
void __fastcall TForm1::FormPaint(TObject *Sender)
{
TColor OColor[3] =
{
 
  clBlue,
  clRed,
  clYellow
};
 
 
if (Tag == 0)
  {
    randomize();
    for (int i = 0; i < 5; i++)
    {
      Canvas->Brush->Color = OColor[random(3)];
      Canvas->Ellipse(25+i*100, 25, 125+i*100, 125);
    }
    Tag = 1;
  }
 
        Sleep(2000);
        Canvas->Brush->Color=clWhite;
    for (int i = 0; i < 5; i++)
    {
      Canvas->Ellipse(25+i*100, 25, 125+i*100, 125);
    }
 
 
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
 
{
 
TColor OColor1[4] =
{
  clWhite,
  clBlue,
  clRed,
  clYellow
};
 
if (Button == mbLeft)  
    for (int i = 0; i < 4; i++)
      if (Canvas->Pixels[X][Y] == OColor1[i])
      {
        Canvas->Brush->Color = OColor1[(i+1)%4];
        Canvas->FloodFill(X, Y, OColor1[i], fsSurface);
        break;
      }
}
//---------------------------------------------------------------------------
0
place status here
 Аватар для gunslinger
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,013
09.11.2014, 23:57
Изначально сохраняешь значения цветов. После того, как они "побелели", предлагаешь пользователю при клике на "элемент" выбрать (допустим, из ComboBox) некоторое значение цвета. Сравниваешь на совпадение с ранее сохраненным[и] значением[ями] (после всех тестов [по нажатию кнопки] или после каждого) и делаешь вывод "молодец, держи пирожок" или "сегодня на компьютере играть не будешь".

Не пойму, чем таймер не устраивает. Или ты не умеешь его готовить?
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
10.11.2014, 14:25
Цитата Сообщение от gunslinger Посмотреть сообщение
(допустим, из ComboBox)
TColorBox
Или ColorDialog приспособить.
0
0 / 0 / 0
Регистрация: 01.11.2014
Сообщений: 8
10.11.2014, 18:51  [ТС]
Спасибо огромное! Только я новичок и не совсем понимаю как можно сохранить эти изначальные цвета.
А также сравнивать эти значения нужно в кнопке проверки?

Добавлено через 21 минуту
Подскажите пожалуйста, а как именно этот компонент(ColorDialog) применить именно к моим элементам, а то везде в примерах приводится как применить его для цвета самой формы.
Спасибо
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
10.11.2014, 21:01
Лучший ответ Сообщение было отмечено ler как решение

Решение

Ну, общий смысл такой: в начале файла .cpp (можно и в .h) объявляете переменные типа TColor (общие, т.е. "глобальные"), потом присваиваете этим переменным значения цвета ваших кружков, затем меняете их цвет на белый, затем сравниваете с эталоном (по индексам, если применить комбобокс, как в следующем примере)__
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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
    TColor cwet[2];
    TColor ColCombo[] = {
      clRed,clBlue,clYellow,clBlack,clGreen,clGray,clLime
    };
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    cwet[0] = Shape1->Brush->Color ;
    cwet[1] = Shape2->Brush->Color ;
    Button1->Enabled = false ;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    Shape1->Brush->Color = clWhite;
    Shape2->Brush->Color = clWhite;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
    if (cwet[0]==ColCombo[ComboBox1->ItemIndex]) Label1->Caption = "Âåðíî!";
    else   Label1->Caption = "Íåïðàâèëüíî.";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBox2Change(TObject *Sender)
{
    if (cwet[1]==ColCombo[ComboBox2->ItemIndex]) Label2->Caption = "Âåðíî!";
    else   Label2->Caption = "Íåïðàâèëüíî.";
}
//---------------------------------------------------------------------------
Миниатюры
Как сравнить цвет, который выбран пользователем с тем, который был задан ранее случайным образом?   Как сравнить цвет, который выбран пользователем с тем, который был задан ранее случайным образом?  
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
10.11.2014, 21:04
значение списка комбобоксов соответственно:
красный
синий
жёлтый
чёрный
зелёный
серый
салатовый
(последовательность цветов переменной ColCombo[])
0
0 / 0 / 0
Регистрация: 01.11.2014
Сообщений: 8
10.11.2014, 23:47  [ТС]
Просто эти кружки, это не шейпы, они просто каждый раз заново рисуются на канве. Вот в этом проблема

Добавлено через 1 час 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
#include <vcl.h>
#include<windows.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 
Form1->Caption = "Âñïîìíè öâåò";
 
}
//---------------------------------------------------------------------------
      TColor cwet[3];
    TColor ColCombo[] = {
      clRed,clBlue,clYellow,clBlack,clGreen,clGray,clLime
    };
    //---------------------------------------------------------------------------
 
void __fastcall TForm1::FormPaint(TObject *Sender)
{
TColor OColor[4] =
{
 
  clBlue,
  clRed,
  clGreen,
  clYellow
};
 
 
 
if (Tag == 0)
  {
    randomize();
  
      Shape1->Brush->Color = OColor[random(4)];
      Shape2->Brush->Color = OColor[random(4)];
      Shape3->Brush->Color = OColor[random(4)];
      
 
   
    Tag = 1;
  }
 
 
 
     
 
 
}
//---------------------------------------------------------------------------
 
 
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 
 
 
   
 
    cwet[0] = Shape1->Brush->Color ;
    cwet[1] = Shape2->Brush->Color ;
    cwet[2] = Shape2->Brush->Color ;
    Button1->Enabled = false ;
 
    
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    Shape1->Brush->Color = clWhite;
    Shape2->Brush->Color = clWhite;
    Shape3->Brush->Color = clWhite;
}
//---------------------------------------------------------------------------
 
 
void __fastcall TForm1::Shape1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
       TColor OColor1[4] =
{
  clWhite,
  clBlue,
  clRed,
  clYellow
};
 
if (Button == mbLeft)  // åñëè êëèêíóëè ëåâîé êíîïêîé ìûøè
    for (int i = 0; i < 4; i++)
      if (Canvas->Pixels[X][Y] == OColor1[i])
      {
        Shape1->Brush->Color = OColor1[(i+1)%4];
       
 
        Canvas->FloodFill(X, Y, OColor1[i], fsSurface);
        break;
      }
}
//---------------------------------------------------------------------------
 
 
void __fastcall TForm1::Shape2MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
  TColor OColor1[4] =
{
  clWhite,
  clBlue,
  clRed,
  clYellow
};
 
if (Button == mbLeft)  // åñëè êëèêíóëè ëåâîé êíîïêîé ìûøè
    for (int i = 0; i < 4; i++)
      if (Canvas->Pixels[X][Y] == OColor1[i])
      {
      
        Shape2->Brush->Color = OColor1[(i+1)%4];
 
        Canvas->FloodFill(X, Y, OColor1[i], fsSurface);
        break;
      }
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Shape3MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
     TColor OColor1[4] =
{
  clWhite,
  clBlue,
  clRed,
  clYellow
};
 
if (Button == mbLeft)  // åñëè êëèêíóëè ëåâîé êíîïêîé ìûøè
    for (int i = 0; i < 4; i++)
      if (Canvas->Pixels[X][Y] == OColor1[i])
      {
       
        Shape3->Brush->Color = OColor1[(i+1)%4];
 
        Canvas->FloodFill(X, Y, OColor1[i], fsSurface);
        break;
      }
}
//---------------------------------------------------------------------------
0
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
11.11.2014, 00:25
А если кругов 50, ты 50 Shape_MouseDown(...) напишешь?
0
0 / 0 / 0
Регистрация: 01.11.2014
Сообщений: 8
11.11.2014, 09:11  [ТС]
подскажите, а как тогда можно сократить запись
0
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
11.11.2014, 09:16
Всем шейпам назначаешь один обработчик ShapeMouseDown(...). А в обработчике в параметре Sender приходит адрес шейпа который вызвал обработчик. Т.е. TShape* Shape=(TShape*) Sender;
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33378 / 21502 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 11
11.11.2014, 10:49
Лучший ответ Сообщение было отмечено ler как решение

Решение

Проще уже сделать вот такой перехватчик:
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
// В *.H-файле, прямо перед классом формы
namespace Colored_Shape
{
    class TShape : public Extctrls::TShape
    {
    protected:
        DYNAMIC void __fastcall MouseDown(TMouseButton Button,
            TShiftState Shift, int X, int Y)
        {
            TColor OColor1[4] =
            {clWhite, clBlue, clRed, clYellow};
 
            if (Button == mbLeft) // если кликнули левой кнопкой мыши
                for (int i = 0; i < 4; i++)
                    if (Brush->Color == OColor1[i])
                    {
                        Brush->Color = OColor1[(i + 1) % 4];
                        break;
                    }
            Repaint();
        }
 
    public:
        __fastcall virtual TShape(Classes::TComponent* AOwner)
            : Extctrls::TShape(AOwner)
        {
        }
    };
}
#define TShape Colored_Shape::TShape
 
// А тут уже продолжается, как и было, без изменений...
class TForm1 : public TForm
, и забыть вообще об обработчиках OnMouseDown, как только бросаешь новый шейп на форму - он уже умеет делать все, что нужно при нажатии на него...
2
0 / 0 / 0
Регистрация: 01.11.2014
Сообщений: 8
12.11.2014, 00:40  [ТС]
Спасибо. но почему-то не работает,даже если обойтись без этого "перехватчика" , а просто в каждый обработчик OnMouseDown вставить этот код, то цвета вообще не меняются.А если оставить тот код, что был до этого, то меняется цвет только одного shape, а остальные остаются неизменными. Вы не могли бы подсказать в чем может быть дело?
C++
1
2
3
4
5
6
7
8
if (Button == mbLeft) // если кликнули левой кнопкой мыши
                for (int i = 0; i < 4; i++)
                    if (Brush->Color == OColor1[i])
                    {
                        Brush->Color = OColor1[(i + 1) % 4];
                        break;
                    }
            Repaint();
Добавлено через 19 минут
Спасибо всем огромное! все получилось
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.11.2014, 00:40
Помогаю со студенческими работами здесь

Метод, который выбирает случайным образом одно число из массива
Необходимо написать метод который: - принимает параметром массив целых чисел; - выбирает случайным образом одно число из массива; - находит...

Запомнить, какой из RadioButton был выбран ранее
Привет! Есть несколько RadioButton в одном групбоксе. При клике на одном из них нужно вызвать свой метод, который должен знать...

Игровой автомат, который подбирает случайным образом картинки в трех окошках
Сама задача вот такая: Написать программу игровой автомат, которая по нажатию кнопки (аналог рычага) подбирает случайным образом картинки...

Найти индекс в массиве книги с указанным инв. номером, который задается случайным образом
Решить, используя массив+for+random Дан массив Num из 20 элементов - инвентарные номера книг в библиотеке. Элементы упорядочены по...

Найти моду в массиве размером m, который заполнен случайным образом, где m - натуральное число
Добрый вечер! Не могу понять как это делать, помогите пожалуйста. Найти моду в массиве размером m, который заполнен случайным ...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru