Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 10.02.2019
Сообщений: 14

Как реализовать,чтобы запускалось событие form_KeyUp в разных потоках

01.06.2020, 17:13. Показов 1269. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здесь представлен код тетриса на 2 игрока.В случае,когда 2 игрока нажимают на клавиатуру в один момент времени, событие form_KeyUp происходит только для 1 игрока.Я так полагаю,что нужна многопоточность, но как это реализовать не знаю, нужна помощь.

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
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
namespace Tetris
{
    public partial class Form1 : Form
    {
        private Map map1 = new Map();
        private Map map2 = new Map();
        Shape shape;
        Shape shape1;
        int size = 25;
        int score;
        int linesRemoved;
        int bias = 50;
        int bias1 = 500;
        int score1;
        int linesRemoved1;
 
        public Form1()
        {
            InitializeComponent();
            Init();
            Init1();
        }
 
        public void Init()
        {
            score = 0;
            linesRemoved = 0;
            label1.Text = "Score: " + score;
            label2.Text = "Lines: " + linesRemoved;
            shape = new Shape(4, 0);
            timer1.Tick += new EventHandler(update);
            timer1.Start();
            Invalidate();
        }   
        public void Init1()
        {
            score1 = 0;
            linesRemoved1 = 0;
            label4.Text = "Score: " + score1;
            label5.Text = "Lines: " + linesRemoved1;
            shape1 = new Shape(4, 0);
            timer2.Tick += new EventHandler(update1);
            timer2.Start();
            Invalidate();
        }
 
 
        public void update(object sender, EventArgs e)
        {
            map1.ResetArea(shape);
            if (!map1.Collide(shape))
            {
                shape.MoveDown();
            }
            else
            {
                map1.Synhronization(shape);
                map1.SliceMap(this, 1);
                timer1.Interval = 500;
                shape.ResetShape(4, 0);
                if (map1.Collide(shape))
                {
 
                    map1.ClearMap();
                    timer1.Tick -= new EventHandler(update);
                    timer1.Stop();
                    Init();
                    timer1.Start();
                }
            }
            map1.Synhronization(shape);
            Invalidate();
        }
        public void update1(object sender, EventArgs e)
        {
            map2.ResetArea(shape1);
            if (!map2.Collide(shape1))
            {
                shape1.MoveDown();
            }
            else
            {
                map2.Synhronization(shape1);
                map2.SliceMap(this, 1);
                timer2.Interval = 500;
                shape1.ResetShape(4, 0);
                if (map2.Collide(shape1))
                {
 
                    map2.ClearMap();
                    timer2.Tick -= new EventHandler(update1);
                    timer2.Stop();
                    Init1();
                    timer2.Start();
                }
            }
            map2.Synhronization(shape1);
            Invalidate();
        }
        public void DrawGrid(Graphics g)
        {
            g.FillRectangle(new SolidBrush(Color.FromArgb(0, 45, 45)), 50, 50, 250, 500);
            for (int i = 0; i <= 20; i++)
            {
                g.DrawLine(Pens.Black, new Point(50, 50 + i * 25), new Point(50 + 10 * 25, 50 + i * 25));
            }
            for (int i = 0; i <= 10; i++)
            {
                g.DrawLine(Pens.Black, new Point(50 + i * 25, 50), new Point(50 + i * 25, 50 + 20 * 25));
            }
            g.FillRectangle(new SolidBrush(Color.FromArgb(0, 45, 45)), 500, 50, 250, 500);
            for (int i = 0; i <= 20; i++)
            {
                g.DrawLine(Pens.Black, new Point(500, 50 + i * 25), new Point(500 + 10 * 25, 50 + i * 25));
            }
            for (int i = 0; i <= 10; i++)
            {
                g.DrawLine(Pens.Black, new Point(500 + i * 25, 50), new Point(500 + i * 25, 50 + 20 * 25));
            }
        }
 
        public void DrawNextGrid(Graphics g)
        {
            for (int i = 0; i <= 4; i++)
            {
                g.DrawLine(Pens.Black, new Point(330, 50 + i * 25), new Point(355 + 4 * 25, 50 + i * 25));
            }
            for (int i = 0; i <= 5; i++)
            {
                g.DrawLine(Pens.Black, new Point(330 + i * 25, 50), new Point(330 + i * 25, 50 + 4 * 25));
            }
            for (int i = 0; i <= 4; i++)
            {
                g.DrawLine(Pens.Black, new Point(780, 50 + i * 25), new Point(805 + 4 * 25, 50 + i * 25));
            }
            for (int i = 0; i <= 5; i++)
            {
                g.DrawLine(Pens.Black, new Point(780 + i * 25, 50), new Point(780 + i * 25, 50 + 4 * 25));
            }
        }
 
        public void ShowNextShape(Graphics e)
        {
            for (int i = 0; i < shape.sizeNextMatrix; i++)
            {
                for (int j = 0; j < shape.sizeNextMatrix; j++)
                {
                    if (shape.nextMatrix[i, j] == 1)
                    {
                        e.FillRectangle(Brushes.Red, new Rectangle(bias + 305 + j * (size) + 1, 50 + i * (size) + 1, size - 1, size - 1));
                    }
                    if (shape.nextMatrix[i, j] == 2)
                    {
                        e.FillRectangle(Brushes.Gold, new Rectangle(bias + 305 + j * (size) + 1, 50 + i * (size) + 1, size - 1, size - 1));
                    }
                    if (shape.nextMatrix[i, j] == 3)
                    {
                        e.FillRectangle(Brushes.Green, new Rectangle(bias + 305 + j * (size) + 1, 50 + i * (size) + 1, size - 1, size - 1));
                    }
                    if (shape.nextMatrix[i, j] == 4)
                    {
                        e.FillRectangle(Brushes.Blue, new Rectangle(bias + 305 + j * (size) + 1, 50 + i * (size) + 1, size - 1, size - 1));
                    }
                    if (shape.nextMatrix[i, j] == 5)
                    {
                        e.FillRectangle(Brushes.Purple, new Rectangle(bias + 305 + j * (size) + 1, 50 + i * (size) + 1, size - 1, size - 1));
                    }
                }
            }
        }
 
        public void ShowNextShape1(Graphics e)
        {
            for (int i = 0; i < shape1.sizeNextMatrix; i++)
            {
                for (int j = 0; j < shape1.sizeNextMatrix; j++)
                {
                    if (shape1.nextMatrix[i, j] == 1)
                    {
                        e.FillRectangle(Brushes.Red, new Rectangle(bias1 + 305 + j * (size) + 1, 50 + i * (size) + 1, size - 1, size - 1));
                    }
                    if (shape1.nextMatrix[i, j] == 2)
                    {
                        e.FillRectangle(Brushes.Gold, new Rectangle(bias1 + 305 + j * (size) + 1, 50 + i * (size) + 1, size - 1, size - 1));
                    }
                    if (shape1.nextMatrix[i, j] == 3)
                    {
                        e.FillRectangle(Brushes.Green, new Rectangle(bias1 + 305 + j * (size) + 1, 50 + i * (size) + 1, size - 1, size - 1));
                    }
                    if (shape1.nextMatrix[i, j] == 4)
                    {
                        e.FillRectangle(Brushes.Blue, new Rectangle(bias1 + 305 + j * (size) + 1, 50 + i * (size) + 1, size - 1, size - 1));
                    }
                    if (shape1.nextMatrix[i, j] == 5)
                    {
                        e.FillRectangle(Brushes.Purple, new Rectangle(bias1 + 305 + j * (size) + 1, 50 + i * (size) + 1, size - 1, size - 1));
                    }
                }
            }
        }
        private void OnPaint(object sender, PaintEventArgs e)
        {
            DrawGrid(e.Graphics);
            DrawNextGrid(e.Graphics);
            map1.DrawMap(e.Graphics, size,50);
            map2.DrawMap(e.Graphics, size, 500);
            ShowNextShape(e.Graphics);
            ShowNextShape1(e.Graphics);
        }
        public void SetLabelText(string text1, string text2, int a)
        {
            if (a == 1)
            {
                label1.Text = "Score: " + text1;
                label2.Text = "Lines: " + text2;
            }
            else if (a == 2)
            {
                label4.Text = "Score: " + text1;
                label5.Text = "Lines: " + text2;
            }
            else if (a == 3)
            {
                label3.Text = "Первый игрок: " + text1;
                label6.Text = "Второй игрок: " + text2;
            }
 
        }
 
        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
           Form form = Application.OpenForms[0];
           form.Show();
        }
 
 
        public int Score
        {
            get { return score; }
            set { score = value; }
        }
        public int LinesRemoved
        {
            get { return linesRemoved; }
            set { linesRemoved = value; }
        }
        public int Score1
        {
            get { return score1; }
            set { score = value; }
        }
        public int LinesRemoved1
        {
            get { return linesRemoved1; }
            set { linesRemoved1 = value; }
        }
 
        private void Form1_KeyUp(object sender, KeyEventArgs e)
        {
            switch (e.KeyCode)
            {
                case Keys.W:
                    if (!map1.IsIntersects(shape))
                    {
                        map1.ResetArea(shape);
                        shape.RotateShape();
                        map1.Synhronization(shape);
                        Invalidate();
                    }
                    break;
                case Keys.S:
                    timer1.Interval = 120;
                    break;
                case Keys.D:
                    if (!map1.CollideHor(1, shape))
                    {
                        map1.ResetArea(shape);
                        shape.MoveRight();
                        map1.Synhronization(shape);
                        Invalidate();
                    }
                    break;
                case Keys.A:
                    if (!map1.CollideHor(-1, shape))
                    {
                        map1.ResetArea(shape);
                        shape.MoveLeft();
                        map1.Synhronization(shape);
                        Invalidate();
                    }
                    break;
                case Keys.Space:
                    if (timer1.Enabled == true && timer2.Enabled == true)
                    {
                        timer1.Enabled = false;
                        timer2.Enabled = false;
                    }
                    else
                    {
                        timer1.Enabled = true;
                        timer2.Enabled = true;
                    }
                    break;
            }
            switch (e.KeyValue)
            {
                case 38:
                    if (!map2.IsIntersects(shape1))
                    {
                        map2.ResetArea(shape1);
                        shape1.RotateShape();
                        map2.Synhronization(shape1);
                        Invalidate();
                    }
                    break;
                case 40:
                    timer2.Interval = 120;
                    break;
                case 39:
                    if (!map2.CollideHor(1, shape1))
                    {
                        map2.ResetArea(shape1);
                        shape1.MoveRight();
                        map2.Synhronization(shape1);
                        Invalidate();
                    }
                    break;
                case 37:
                    if (!map2.CollideHor(-1, shape1))
                    {
                        map2.ResetArea(shape1);
                        shape1.MoveLeft();
                        map2.Synhronization(shape1);
                        Invalidate();
                    }
                    break;
            }
        }
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.06.2020, 17:13
Ответы с готовыми решениями:

Как сделать чтобы приложение запускалось до загрузки Windows`a?
Как сделать чтобы приложение запускалось до загрузки Windows`a? Thank you!

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

Как компилировать приложение, чтобы оно запускалось на другом компьютере?
в билдере снимаю галочку link with dynamyc RTL и включаю галочку use all packages(что то такое) и программа запускается у преподавателя на...

23
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
05.06.2020, 00:58
Студворк — интернет-сервис помощи студентам
D_gdk, При разработке интерфейсов нужно придерживаться хотя бы двух основных правил:
1) Данные должны быть отделены от контролов.
2) Для решения каждой задачи нужно создавать отдельный контрол.

Если вы придерживались этих правил, создать интерфейс второго игрока - не сложно. Достаточно просто создать еще один экземпляр контрола интерфейса и привязать его к другим данным.
Если же у вас все в куче, то нужно переделывать. У вас же в коде цикл для сдвигов synhronization вроде называется, один на двух игроков. Создайте два класса, где 1 класс это игрок 1, а 2 класс это игрок 2
0
0 / 0 / 0
Регистрация: 10.02.2019
Сообщений: 14
05.06.2020, 07:25  [ТС]
Нет,сдвиг происходит при использовании методов класса shape, мне кажется что проблема в том что я рисую обе карты на форме(т.е в 1 контроле), а может быть надо в picturebox-ах
0
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
05.06.2020, 11:02
Цитата Сообщение от D_gdk Посмотреть сообщение
а может быть надо в picturebox-ах
будет даже правильнее, так как разные контролы и разные данные будут.
0
0 / 0 / 0
Регистрация: 10.02.2019
Сообщений: 14
05.06.2020, 16:32  [ТС]
Вот,сделал чтобы карты и фигуры рисовались в picturebox-ах, но сделать чтобы фигуры двигались в одно время не получается,прошу помочь
Вложения
Тип файла: rar Курсовой.rar (2.65 Мб, 1 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.06.2020, 16:32

Как сделать так, чтобы консольное приложение запускалось на любом пк?
Добрый вечер! Мне нужна помощь. Как сделать так, чтобы консольное приложение на с++ можно было открыть на любом пк? F5 не помогает, так...

Как сделать так, чтобы консольное приложение запускалось на любом пк?
Добрый вечер! Мне нужна помощь. Как сделать так, чтобы консольное приложение на с++ можно было открыть на любом пк? F5 не помогает, так...

Как собрать проект JavaFX, чтобы запускалось на всех платформах и компах
Доброго времени суток всем. Совсем недавно залез в JavaFX и все бы ничего, но вот возникла проблема - не получается собрать проект так,...

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

Как реализовать наследование в C#? Чтобы было несколько разных объетов, в виде структуры
//Написать программу, в которой описан класс «Микроорганизмы». Реализовать методы ввода с клавиатуры, вывода на экран и один для работы с...


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

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru