Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.91/22: Рейтинг темы: голосов - 22, средняя оценка - 4.91
3 / 3 / 11
Регистрация: 17.01.2013
Сообщений: 354

Игровой автомат, как лучше хранить картинки для последующего вывода в PictureBox

29.06.2014, 13:16. Показов 4374. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!

Задача такая: сделать некое подобие игрового автомата.
3 элемента picturebox, при нажатии на кнопку изображение должно сменяться на всех трёх случайным образом, всего 3 возможных варианта изображений. При некоторых вариантах совпадения картинок на picturebox'ах (2 или 3) должны начисляться очки.

Я не могу понять как мне изображения в массив что ли засунуть, чтобы потом их через random выводить в picturebox'ы...
Подскажите, пожалуйста.
Заранее спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.06.2014, 13:16
Ответы с готовыми решениями:

[Теоритическая часть] Как лучше хранить картинки
Есть интернет-магазин, нужно как-то хранить картинки к товарам. Их будет много, и они будут каждый день обновляться. Есть два варианта ...

Объясните, как лучше хранить картинки на сайте?
Всем привет. Начну с того что нас с другом попросили написать сайт, вроде хранилища изображения для пользователей и у нас возник вопрос,...

Как правильно упаковать модуль для последующего вывода в материалы
Не могу никак упаковать модуль что бы потом его вывести в материал. Скажите что не так в файлах Если вывожу в материалы он просто...

23
 Аватар для tarasalk
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
29.06.2014, 16:45
используй switch. Если зарандомилось число 1, то картинка такая, если 2 то другая картинка итд...
1
3 / 3 / 11
Регистрация: 17.01.2013
Сообщений: 354
29.06.2014, 17:47  [ТС]
Благодарю, я вот так уже сделал:
C#
1
2
3
4
5
6
7
8
            Random rnd = new Random();
            string[] filepath = { @"pic\помидор.jpg", @"pic\огурец.jpg", @"pic\seven.jpg" };
            int pic1 = rnd.Next(0, 3);
            int pic2 = rnd.Next(0, 3);
            int pic3 = rnd.Next(0, 3);
            pictureBox1.ImageLocation = @filepath[pic1];
            pictureBox2.ImageLocation = @filepath[pic2];
            pictureBox3.ImageLocation = @filepath[pic3];
Только
C#
1
int pic1 = rnd.Next(0, 3);
как то странно работает, у меня же 3 элемента, а если написать (0,2), тогда последний элемент не попадает в интервал. Это почему, не подскажите ?
Ведь получается элементы 0, 1, 2.
Но всё равно попробую сделать и по вашему.
0
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
29.06.2014, 17:54
Цитата Сообщение от berkut_174 Посмотреть сообщение
как то странно работает, у меня же 3 элемента, а если написать (0,2), тогда последний элемент не попадает в интервал. Это почему, не подскажите ?
Потому что интервал от 0 до 2,
то есть 2 уже не считается.
Цитата Сообщение от MSDN
C#
1
2
3
4
public virtual int Next(
    int minValue,
    int maxValue
)
Параметры
minValue
Тип: System.Int32
Включенной нижний предел возвращаемого случайного числа.
maxValue
Тип: System.Int32
Исключенный верхний предел возвращаемого случайного числа. Значение свойства maxValue должно быть больше или равно значению свойства minValue.
1
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
29.06.2014, 19:24
berkut_174, вот мой вариант реализации вашего задания, накидал по быстрому.
Вместо картинок цвета, три вида. Это можете сами изменить
Класс Gamer
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
using System.Drawing;
using System.IO;
using System.Resources;
using System.Threading;
using System.Threading.Tasks;
 
namespace GameBot
{
    public class Gamer
    {
        public event EventHandler<GamerEventArgs> imageOneEvent;
        public event EventHandler<GamerEventArgs> imageTwoEvent;
        public event EventHandler<GamerEventArgs> imageThreeEvent;
        public event EventHandler checkGameResult;
        Random r;
 
        public Gamer()
        {
            r = new Random();
        }
 
        public void StartChangingImages()
        {
            Parallel.Invoke(() =>
                {
                    Task.Factory.StartNew(() =>
                        {
                            GetImageOne();
                        });
                },
                () =>
                {
                    Task.Factory.StartNew(() =>
                        {
                            GetImageTwo();
                        });
                },
                () =>
                {
                    Task.Factory.StartNew(() =>
                        {
                            GetImageThree();
                        });
                }
                );
        }
        private void GetImageOne()
        {
            r = new Random();
            for (int i = 0; i < 10; i++)
            {
                int imageIndex = r.Next(1, 4);
                Bitmap image = null;
                switch (imageIndex)
                {
                    case 1:
                        image = Resource1.red;
                        break;
                    case 2:
                        image = Resource1.green;
                        break;
                    case 3:
                        image = Resource1.yellow;
                        break;
                }
                using (MemoryStream stream = new MemoryStream())
                {
                    image.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
                    if (imageOneEvent != null)
                    {
                        imageOneEvent(this, new GamerEventArgs(stream));
                        Result1 = imageIndex;
                    }
                }
                Thread.Sleep(500);
            }
 
            if (checkGameResult != null)
            {
                checkGameResult(this, EventArgs.Empty);
            }
        }
        private void GetImageTwo()
        {
            r = new Random();
            for (int i = 0; i < 10; i++)
            {
                int imageIndex = r.Next(1, 4);
                Bitmap image = null;
                switch (imageIndex)
                {
                    case 1:
                        image = Resource1.red;
                        break;
                    case 2:
                        image = Resource1.green;
                        break;
                    case 3:
                        image = Resource1.yellow;
                        break;
                }
                using (MemoryStream stream = new MemoryStream())
                {
                    image.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
                    if (imageTwoEvent != null)
                    {
                        imageTwoEvent(this, new GamerEventArgs(stream));
                        Result2 = imageIndex;
                    }
                }
                Thread.Sleep(500);
            }
        }
        private void GetImageThree()
        {
            r = new Random();
            for (int i = 0; i < 10; i++)
            {
                int imageIndex = r.Next(1, 4);
                Bitmap image = null;
                switch (imageIndex)
                {
                    case 1:
                        image = Resource1.red;
                        break;
                    case 2:
                        image = Resource1.green;
                        break;
                    case 3:
                        image = Resource1.yellow;
                        break;
                }
                using (MemoryStream stream = new MemoryStream())
                {
                    image.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
                    if (imageThreeEvent != null)
                    {
                        imageThreeEvent(this, new GamerEventArgs(stream));
                        Result3 = imageIndex;
                    }
                }
                Thread.Sleep(500);
            }
        }
        public int Result1 { get; private set; }
        public int Result2 { get; private set; }
        public int Result3 { get; private set; }
    }
    public class GamerEventArgs : EventArgs
    {
        public readonly MemoryStream ImageStream;
        public GamerEventArgs(MemoryStream image)
        {
            ImageStream = image;
        }
    }
}
Собственно форма
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace GameBot
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.Load += delegate { LoadApplication(); };
            btnStartGame.Click += delegate { StartGame(); };
        }
        private void LoadApplication()
        {
           
        }
        private void StartGame()
        {
            Gamer gamer = new Gamer();
            gamer.imageOneEvent += (s, e) =>
            {
                this.Invoke((Action)delegate { pbImage1.Image = Image.FromStream(e.ImageStream); });
            };
            gamer.imageTwoEvent += (s, e) =>
                {
                    this.Invoke((Action)delegate { pbImage2.Image = Image.FromStream(e.ImageStream); });
                };
            gamer.imageThreeEvent += (s, e) =>
                {
                    this.Invoke((Action)delegate { pbImage3.Image = Image.FromStream(e.ImageStream); });
                };
            gamer.checkGameResult += (s, e) =>
                {
                    this.Invoke((Action)delegate { btnStartGame.Enabled = true; });
 
                    Gamer g = ((Gamer)s);
                    if ((g.Result1 == g.Result2) && (g.Result1 == g.Result3))
                    {
                        MessageBox.Show("Вы выиграли!", "Результат");
                    }
                    else
                    {
                        MessageBox.Show("Вы проиграли!", "Результат");
                    }
                };
            gamer.StartChangingImages();
            btnStartGame.Enabled = false;
        }
    }
}
И архив с проектом, если что непонятно.
Вложения
Тип файла: rar GameBot.rar (83.4 Кб, 53 просмотров)
4
3 / 3 / 11
Регистрация: 17.01.2013
Сообщений: 354
29.06.2014, 19:55  [ТС]
Цитата Сообщение от insite2012 Посмотреть сообщение
вот мой вариант реализации вашего задания, накидал по быстрому.
О, класс! Но надо разбираться, я половины в коде не понял

Заметил очень понравившуюся мне реализацию в вашем варианте, смена картинок после того, как нажимается старт, так намного интересней получается.
Пробую у себя также сделать, поглядывая в ваш код:
C#
1
2
3
4
5
6
7
8
9
10
for (int i = 0; i < 2; i++)
{
         pic1 = rnd.Next(0, 3);
         pic2 = rnd.Next(0, 3);
         pic3 = rnd.Next(0, 3);
         pictureBox1.ImageLocation = @filepath[pic1];
         pictureBox2.ImageLocation = @filepath[pic2];
         pictureBox3.ImageLocation = @filepath[pic3];
         Thread.Sleep(1000);
 }
Но у меня картинки не меняются, только последняя появляется сразу. Почему так ?
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
29.06.2014, 19:58
berkut_174, в моем коде реализована многопоточность, с параллельным выполнением. Три потока запускаются одновременно и работают независимо от формы. Поэтому форма и не тормозит. А у вас она тормозит во время выполнения, и отображает все после завершения цикла.
1
3 / 3 / 11
Регистрация: 17.01.2013
Сообщений: 354
29.06.2014, 20:00  [ТС]
Цитата Сообщение от insite2012 Посмотреть сообщение
А у вас она тормозит во время выполнения, и отображает все после завершения цикла.
Так и думал.
Посмотрю, попробую, может у меня тоже получится.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
29.06.2014, 20:01
berkut_174, пробуйте.
Пример у вас есть.
0
3 / 3 / 11
Регистрация: 17.01.2013
Сообщений: 354
30.06.2014, 19:30  [ТС]
Чёрт, интересно даже стало, но не выходит, решил попроще задачу поставить: 3 label, 1 button, 1 form.
Form1.cs
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Threading.Tasks;
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        public string[] line = { "one", "two", "three", "four", "five"};
 
        private void button1_Click(object sender, EventArgs e)
        {
            StartChangingImages();            
        }
 
        public void StartChangingImages()
        {
            Parallel.Invoke(() =>
            {
                Task.Factory.StartNew(() =>
                {
                    One();
                });
            },
                () =>
                {
                    Task.Factory.StartNew(() =>
                    {
                        Two();
                    });
                },
                () =>
                {
                    Task.Factory.StartNew(() =>
                    {
                        Three();
                    });
                }
                );
        }
 
        private void One()
        {
            Random r = new Random();
            for (int i = 0; i < 10; i++)
            {
                int index = r.Next(1, 6);
                label1.Text = line[index];
                Thread.Sleep(1000);
            }
        }
 
        private void Two()
        {
            Random r = new Random();
            for (int i = 0; i < 10; i++)
            {
                int index = r.Next(1, 6);
                label2.Text = line[index];
                Thread.Sleep(1000);
            }
        }
 
        private void Three()
        {
            Random r = new Random();
            for (int i = 0; i < 10; i++)
            {
                int index = r.Next(1, 6);
                label3.Text = line[index];
                Thread.Sleep(1000);
            }
        }
    }
}
Выдаёт ошибку:
Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 'label1' не из того потока, в котором он был создан.
В строке 60.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
30.06.2014, 19:43
berkut_174, а как вы думаете, зачем вот эта строка нужна?
Цитата Сообщение от insite2012 Посмотреть сообщение
this.Invoke((Action)delegate { pbImage1.Image = Image.FromStream(e.ImageStream); });
Или мне нечего делать было и я так столько кода нагородил, чтобы просто вывести изображение в пикчер?)))
0
3 / 3 / 11
Регистрация: 17.01.2013
Сообщений: 354
30.06.2014, 20:14  [ТС]
Цитата Сообщение от insite2012 Посмотреть сообщение
а как вы думаете, зачем вот эта строка нужна?
Понятия не имею, увы...

Ладно, надо пример про многопоточность попроще, наверно, поищу ещё
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
30.06.2014, 20:34
berkut_174, почитайте про многопоточность и обновление интерфейса в WinForm. Обратиться напрямую к контролам формы можно только из того потока, в котором они созданы. Вот для того, чтобы обновить контролы из других потоков, и применяется Invoke.

Добавлено через 7 минут
Сделайте так:
C#
1
this.Invoke((Action)delegate { label1.Text=//Тут ваш текст; });
1
3 / 3 / 11
Регистрация: 17.01.2013
Сообщений: 354
30.06.2014, 21:35  [ТС]
Так работает Спасибо.
Я попробовал вот так сделать:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
private void One()
        {
            Random r = new Random();
            for (int i = 0; i < 5; i++)
            {
                int index = r.Next(0, 3);
                label1.Invoke(new Action(() =>
                    {
                        label1.Text = line[index];
                    }));
                Thread.Sleep(1000);
            }
        }
Первый раз всё нормально отрабатывает, а на последующие нажатия всегда выпадают одинаковые элементы на всех трёх.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
30.06.2014, 22:25
Цитата Сообщение от berkut_174 Посмотреть сообщение
Random r = new Random();
Это видите? Сделайте один общий Random на весь класс (в вашем случае форма). Вы практически одномоментно создаете три Random-а, и естественно, поскольку они псевдо-случайны, то вызывая их в один момент вы и получаете три одинаковых результата.
1
3 / 3 / 11
Регистрация: 17.01.2013
Сообщений: 354
02.07.2014, 19:31  [ТС]
Не заметил...
Теперь в другом проблема, у вас в коде не могу понять как вы сравниваете результаты.
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Threading.Tasks;
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        public string[] line = { "one", "two", "three" };
        Random r = new Random();
        int Result1, Result2, Result3;
        
        private void button1_Click(object sender, EventArgs e)
        {            
            StartChangingImages();
        }
 
        public void StartChangingImages()
        {
            Parallel.Invoke(() =>
            {
                Task.Factory.StartNew(() =>
                {
                        One();
                });
            },
                () =>
                {
                    Task.Factory.StartNew(() =>
                    {
                        Two();
                    });
                },
                () =>
                {
                    Task.Factory.StartNew(() =>
                    {
                        Three();
                    });
                }
                );
        }
 
        private void One()
        {
            for (int i = 0; i < 5; i++)
            {
                int index = r.Next(0, 3);
                this.Invoke(new Action(() => label1.Text = line[index] ));
                Thread.Sleep(1000);
                if (i == 4)
                {
                    Result1 = index;
                }
            }
        }
 
        private void Two()
        {
            for (int i = 0; i < 5; i++)
            {
                int index = r.Next(0, 3);
                this.Invoke(new Action(() => label2.Text = line[index] ));
                Thread.Sleep(1000);
                if (i == 4)
                {
                    Result2 = index;
                }
            }
        }
 
        private void Three()
        {
            for (int i = 0; i < 5; i++)
            {
                int index = r.Next(0, 3);
                this.Invoke(new Action(() => label3.Text = line[index] ));
                Thread.Sleep(1000);
                if (i == 4)
                {
                    Result3 = index;
                }
            }
        }
    }
}
То есть у меня мысль поставить задержку в 1000*5 в событие button_click и потом как обычно.
Полагаю, есть более красивое решение...

Добавлено через 20 часов 31 минуту
Может есть какой-то пример с описанием ? А то я догадываюсь где в коде это описано, но не пойму как под свои реалии переделать и не гуглится ничего...
Напомню, мне нужно теперь после выполнения всех потоков, сравнить результаты на pictureBox'ах. Выше писал, что мол задержку выставить 5*1000, но так не работает. Нужно как-то "выждать" пока все потоки выполнятся...

Добавлено через 10 часов 7 минут
Ну вот что-то нашёл http://www.bafoed.net/post/7624/, но тоже мельком всё... понятно что на Event нужно смотреть...
Про консольные приложения такие примитивные примеры, которых полно, а для Forms не могу найти самого примитивного, чтоб пара потоков и выхлоп как получить, да ещё и с объяснениями бы... Неужели нет таких простых ("школьных") примеров ? Поделитесь ссылкой, пожалуйста.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
02.07.2014, 19:41
berkut_174, обратите внимание, в моем коде, метод для вывода изображения номер один. В конце метода, когда цикл заканчивается, срабатывает событие, говорящее о том, что перебор окончен. А на форме мы обрабатываем это событие и сравниваем переменные в классе, по результатам сравнения и делается вывод о том, выигрыш или проигрыш.
1
3 / 3 / 11
Регистрация: 17.01.2013
Сообщений: 354
02.07.2014, 20:24  [ТС]
Цитата Сообщение от insite2012 Посмотреть сообщение
обратите внимание, в моем коде, метод для вывода изображения номер один.
Да вижу я, а толку...
Вот вроде пашет с горем пополам, только понимание не пришло...
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
using System.Threading;
using System.Threading.Tasks;
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        public event EventHandler checkGameResult;
 
        string[] line = { "one", "two", "three" };
        Random r = new Random();
        int Result1, Result2, Result3;  
 
        public void StartChangingImages()
        {
            Parallel.Invoke(() =>
            {
                Task.Factory.StartNew(() =>
                {
                        One();
                });
            },
                () =>
                {
                    Task.Factory.StartNew(() =>
                    {
                        Two();
                    });
                },
                () =>
                {
                    Task.Factory.StartNew(() =>
                    {
                        Three();
                    });
                }
                );
        }
 
        private void One()
        {
            for (int i = 0; i < 5; i++)
            {
                int index = r.Next(0, 3);
                this.Invoke(new Action(() => label1.Text = line[index] ));
                Thread.Sleep(1000);
                if (i == 4)
                {
                    Result1 = index;                 
                }
            }
            if (checkGameResult != null)
            {
                checkGameResult(this, EventArgs.Empty);
            }
        }
 
        private void Two()
        {
            for (int i = 0; i < 5; i++)
            {
                int index = r.Next(0, 3);
                this.Invoke(new Action(() => label2.Text = line[index]));
                Thread.Sleep(1000);
                if (i == 4)
                {
                    Result2 = index;
                }
            }
        }
 
        private void Three()
        {
            for (int i = 0; i < 5; i++)
            {
                int index = r.Next(0, 3);
                this.Invoke(new Action(() => label3.Text = line[index]));
                Thread.Sleep(1000);
                if (i == 4)
                {
                    Result3 = index;
                }
            }
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            checkGameResult = (a,q) =>
            {
                if ((Result1 == Result2) && (Result1 == Result3))
                {
                    MessageBox.Show("Вы выиграли!", "Результат");
                }
                else
                {
                    MessageBox.Show("Вы проиграли!", "Результат");
                }
            };
            StartChangingImages();
        }
    }
}
И всё же интересно, что мы делает в строках 66-69 ?
Также строка 102, убрал + перед равно, иначе Message с каждым последующем клацаньем по кнопке, вылазил по несколько раз (первый клик - 1, второй - 2, третий - 3 и т.д.), это почему ? И тут же, что это за параметры такие, в скобках, я произвольные вообще ввёл (a,q) ?
Спасибо!
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
02.07.2014, 20:47
Цитата Сообщение от berkut_174 Посмотреть сообщение
И всё же интересно, что мы делает в строках 66-69 ?
berkut_174, в этих строках мы проверяем, есть ли подписчик на наше событие, и если есть (то есть событие не равно null), генерируем это событие.

Добавлено через 2 минуты
Цитата Сообщение от berkut_174 Посмотреть сообщение
Также строка 102,
А это уже подключение обработчика события и сразу же обработчик там же. Параметры-это использование LINQ, чтобы не писать полностью.
Вам бы побольше про делегаты, события почитать не мешает. Иначе трудновато во всем этом разобраться...
1
3 / 3 / 11
Регистрация: 17.01.2013
Сообщений: 354
03.07.2014, 09:19  [ТС]
Цитата Сообщение от insite2012 Посмотреть сообщение
Вам бы побольше про делегаты, события почитать не мешает. Иначе трудновато во всем этом разобраться...
Понемногу изучаю...
Спасибо.
Но рано я обрадовался, если использовать label'ы, то резалты назначаются согласно отображенной строки (но очень редко промахи всё же случаются), а вот с pictureBox'ами беда, то есть у меня на картинке показывается одно, а в резалте номер предыдущей картинки, которая сменилась уже следующей. Получается потоки неравномерно завершаются, первый иногда быстрей остальных, из-за этого путаница с вычислениями результатов получается. Как быть, тоже условие в остальные добавить что ли ?

Добавлено через 11 часов 46 минут
В общем решил бросить эту затею... сделаю без многопоточности, просто при нажатии картинка будет сразу же меняться единожды, как и было у меня.
Всем спасибо, отдельная благодарность insite2012! Возможно вернусь к решению поставленной задачи в будущем...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.07.2014, 09:19
Помогаю со студенческими работами здесь

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

Задержка после вывода картинки в pictureBox
Я нажимаю на один picturebox, в него загружается картинка, потом на другой и в зависимости от того одинаковые ли там картинки или нет они...

Как лучше хранить данные в таблице для блога?
Здравствуйте. Подскажите пожалуйста как лучше поступить: Есть таблица для хранения новостей блога. Вопрос заключается в том, как...

Как лучше хранить конфигурационные файлы для проекта
Пишется некоторый проект, у которого есть конфигурационные файлы (не *.py, а *.ini/xml/json/etc). В стадии разработки не хотелось бы каждый...

Как лучше всего хранить данные для приложения?
Допустим есть статический массив интов,или булов.Как его сохранять(onDestroy()) и подгружать(onCreate), наиболее минимальным кол-вом строк...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru