Форум программистов, компьютерный форум, киберфорум
C#: API, боты
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.82/50: Рейтинг темы: голосов - 50, средняя оценка - 4.82
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647

Быстрая эмуляция нажатия клавиш в боте для браузерки

14.02.2013, 19:20. Показов 10122. Ответов 42
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу бота для браузерных танчиков.Прицеливание работает по принципу:через BitBlt копируется нужное окно в память, там ищутся группы пикселей определенного цвета(цвет имени врага), и если таковые найдены, нужно жать определенную кнопку(z или x) до тех пор, пока разница по абсциссе между центром имени противника и центром своих жизней(по ним определяется направление пушки), не станет меньше определенного числа(25 пикселей в данном случае). Эмуляцию нажатия клавиш реализую через PostMessage, ибо работать должно в неактивном окне. Все вроде пашет, но загвоздка в том, что пушка нередко "проезжает" цель, и начинается вертеться перед ней туда-сюда, то бишь PostMessage об отпускании клавиши не доходит вовремя. Сам алгоритм определения, когда надо остановиться, в ряд ли может быть неверным, ибо 100 раз проверен и в целом работает(то есть останавливается вовремя в тех случаях, когда пушка вертится медленнее обычного, либо просто удачно повернулась). Сообщения, которые я посылаю, полностью соответствуют аналогичным при реальном нажатии клавиш(через Spy++ проверялось). Кроме того при попытке эмулировать через keybd_event получилось ровно то же самое. Чего только не пробовал-и задержки разные, и сообщения, все то же самое. Скачал виртуальную клавиатуру-при попытке управлять с нее все работает нормально, то есть теоретически такая эмуляция возможна. Сразу скажу, что производительность при обработке изображения тут не причем, FPS достаточный, чтобы несколько кадров попало в положение, когда надо остановиться. На данный момент прога работает с гугл хромом, там проще однозначно достать хэндл нужного окна. Часть кода прилагается, желающим могу скинуть заготовку проги в личку. Жду ваших предположений, как это устранить, я пока что в тупике( но выход ищу. Заранее благодарен. Рабочие способы реализовать такое на других языках и по другим принципам тоже буду рассматривать, ибо делаю чисто ради развлечения и саморазвития, никуда не спешу. Эти куски кода миллион раз переписывались, на мелкие несуразности можете не обращать внимание, главное-указанный выше вопрос.
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
        [DllImport("USER32.DLL", EntryPoint = "PostMessageW", SetLastError = true,
                     CharSet = CharSet.Unicode, ExactSpelling = true,
                     CallingConvention = CallingConvention.StdCall)]
        public static extern bool PostMessage(int hwnd, int Msg, int wParam, int lParam);
 
        public static bool e5 = false;
        public static bool e6 = false;
        public static bool e4 = false;
        public static bool in5 = true;
        public static bool in6 = true;
        public static bool in4 = true;
        public static System.Timers.Timer t4 = new System.Timers.Timer(60);
        public static System.Timers.Timer t5 = new System.Timers.Timer(60);
        public static System.Timers.Timer t6 = new System.Timers.Timer(60);
 public static  void t4_Tick(object source, ElapsedEventArgs e)
{
   try
        {
    if (e4)
    {
            if (!in4)
            {
                int virtual_code = MapVirtualKey(0x11, 1);
                int lp = 0x11 << 16 | 1;
                PostMessage((int)win3, WM_KEYDOWN, virtual_code, lp);
                in4 = true;
            }
            else
            {
                int virtual_code = MapVirtualKey(0x11, 1);
                int lp = 0x11 << 16 | 1 << 30 | 1;
                PostMessage((int)win3, WM_KEYDOWN, virtual_code, lp);
            }
 
 
    }
    else
    {
        if (in4)
        {
            int virtual_code = MapVirtualKey(0x11, 1);
            int lp = 1 << 31 | 1 << 30 | 0x11 << 16 | 1;
            PostMessage((int)win3, WM_KEYUP, virtual_code, lp);
            in4 = false;
        }
    }
        }
             catch { }
}
 
public static void t5_Tick(object source, ElapsedEventArgs e)
{        try
        {
    if (e5)
    {
 
            if (!in5)
            {
                int virtual_code = MapVirtualKey(0x2D, 1);
                int lp = 0x2D << 16 | 1;
                PostMessage((int)win3, WM_KEYDOWN, virtual_code, lp);
                in5 = true;
            }
            else
            {
                int virtual_code = MapVirtualKey(0x2D, 1);
                int lp = 0x2D << 16 | 1 << 30 | 1;
                PostMessage((int)win3, WM_KEYDOWN, virtual_code, lp);
            }
        }
    else
    {
        if (in5)
        {
            int virtual_code = MapVirtualKey(0x2D, 1);
            int lp = 1 << 31 | 1 << 30 | 0x2D << 16 | 1;
            PostMessage((int)win3, WM_KEYUP, virtual_code, lp);
            in5 = false;
        }
    }
        }
catch { }
}
 
public static void t6_Tick(object source, ElapsedEventArgs e)
{        try
        {
    if (e6)
    {
 
            if (!in6)
            {
                int virtual_code = MapVirtualKey(0x2C, 1);
                int lp = 0x2C << 16 | 1;
                PostMessage((int)win3, WM_KEYDOWN, virtual_code, lp);
                in6 = true;
            }
            else
            {
                int virtual_code = MapVirtualKey(0x2C, 1);
                int lp = 0x2C << 16 | 1 << 30 | 1;
                PostMessage((int)win3, WM_KEYDOWN, virtual_code, lp);
            }
        }
    else
    {
        if (in6)
        {
            int virtual_code = MapVirtualKey(0x2C, 1);
            int lp = 1 << 31 | 1 << 30 | 0x2C << 16 | 1;
            PostMessage((int)win3, WM_KEYUP, virtual_code, lp);
            in6 = false;
        }
    }
        }
catch { }
}
 
 
   private void threader() {
            t4.Elapsed += new ElapsedEventHandler(t4_Tick);
            t5.Elapsed += new ElapsedEventHandler(t5_Tick);
            t6.Elapsed += new ElapsedEventHandler(t6_Tick);
            t4.Interval = 100;
            t5.Interval = 100;
            t6.Interval = 100;
            t4.Enabled = true;
            t5.Enabled = true;
            t6.Enabled = true;
        while (true)
        {
            try
            {
                mozgi();
            }
            catch { }
        }
        }
 
        private void mozgi()
        {
//тут делается снимок окна и находится minraznica.X = модуль разницы абсциссы между 
//центром имени врага и центром своей пушки. Корректно, проверено. А так же
//переменная pravo, определяющая сторону, с которой находится враг.
//enemynamesectorREAL это массив точек цвета имени врага.
                        if (enemynamesectorREAL.Count > 0 && e4)
                        {
                            e4 = false;
                        }
 
                        if (enemynamesectorREAL.Count > 0 && minraznica.X > 25 && (!(e5 || e6)))
                        {
                            if (pravo)
                            {
                                e5 = true;
                            }
 
                            else
                            {
                                e6 = true;
                            }
                        }
 
                        if ((pravo && e5) || (!pravo && e6) || enemynamesectorREAL.Count == 0 || minraznica.X <= 25)
                        {
                            bull = false;
                        }
                        else { bull = true; }
 
                        if ((minraznica.X <= 25 || bull) && (e5 || e6) && enemynamesectorREAL.Count != 0)
                        {
                            if (e5)
                            {
                                e5 = false;
                                int virtual_code = MapVirtualKey(0x2D, 1);
                                int lp = 1 << 31 | 0 << 30 | 0x2D << 16 | 1;
                                PostMessage((int)win3, WM_KEYUP, virtual_code, lp);
                                {
                                    notbuisy = false;
                                }
                            }
                            if (e6)
                            {
                                e6 = false;
                                int virtual_code = MapVirtualKey(0x2C, 1);
                                int lp = 1 << 31 | 1 << 30 | 0x2C << 16 | 1;
                                PostMessage((int)win3, WM_KEYUP, virtual_code, lp);
                                {
                                    notbuisy = false;
                                }
                            }
                        }
                    }
                    else { }
 
                        if ((enemynamesectorREAL.Count == 0 && !notbuisy) || (mls == 0 && !notbuisy))
                        {
                            if (e5 || e6)
                            {
                                notbuisy = true;
                            }
                            else
                            {
                                Random rand = new Random();
                                switch (rand.Next(1))
                                {
                                    case 0: 
                                        e5 = true;
                                        notbuisy = true;
                                        break;
                                    case 1: 
                                        e6 = true;
                                        notbuisy = true;
                                        break;
                                }
                            }
                        }
                        if ((enemynamesectorREAL.Count == 0 && !e4) || (mls == 0 && !e4))
                        {
                            e4 = true;
                        }
 
//тут можно вывести обрабатываемый битмап на экран с пометками, что удобно при отладке.
 
                    mem.Dispose();
                    
        }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.02.2013, 19:20
Ответы с готовыми решениями:

Эмуляция нажатия клавиш для SDL
Столкнулся с такой проблемой что на эмуляцию нажатия клавиш, SDL не реагирует. Точнее DOSBox. Пробовал 2 метода (WINAPI), оба не подходят....

Эмуляция нажатия клавиш для неактивного/свёрнутого приложения.
Есть большое желание написать что-то наподобии программы-макроса, которая будет отправлять или эмулировать нажатие клавиш для нужного...

Эмуляция нажатия клавиш для другого приложения (Win10 Под D3D) не работает
Добрый день! У меня такая трабла возникла. Нужно В игре под директ3Д зажать правую кнопку мышки на несколько секунд и отпустить. Вот код...

42
169 / 132 / 29
Регистрация: 16.02.2013
Сообщений: 867
18.02.2013, 02:11
Студворк — интернет-сервис помощи студентам
EvilFromHell, тогда почему цикл тормозит программу?
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
18.02.2013, 02:18  [ТС]
Прочел бегло тему-там никаких нареканий на мой таймер не видно Кроме того проблема точно так же возникала и без него, если поставить их быстрее-они будут спамить, но повиснет браузер с игрой. Кстати если спамить слишком быстро сообщения-то задержка становится заметно больше между посланными действиями и их выполнением. Поэтому можно предположить, что у браузера или игры есть какие-то приоритеты при обработке сообщений, и мои там почему-то обрабатываются медленно.
0
169 / 132 / 29
Регистрация: 16.02.2013
Сообщений: 867
18.02.2013, 02:21
EvilFromHell, что значит - спамить?
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
18.02.2013, 02:22  [ТС]
public static System.Timers.Timer t4 = new System.Timers.Timer(60);
и
this.timer3 = new System.Windows.Forms.Timer(this.components);
Разницы не видишь?

Добавлено через 31 секунду
EvilFromHell, что значит - спамить?
Отправлять PostMessage
0
169 / 132 / 29
Регистрация: 16.02.2013
Сообщений: 867
18.02.2013, 02:28
EvilFromHell, да я уже понял. вот почитал - http://www.rsdn.ru/forum/info/FAQ.dotnet.timers существуют три таймера, и твой таймер ничем не отличается от system.threading.timer .
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
18.02.2013, 02:40
Winhttp22, формовский таймер работает в потоке формы (что логично), в крайнем случае, синхронизируется, т.к. очевидно, что в формах будут применяться только синхронные события из-за проблем с доступом к граф. ресурсам из нескольких потоков.

Добавлено через 1 минуту
EvilFromHell, код тоже радует
C#
1
2
3
4
5
6
7
8
if (a) 
 if (b)
 {
   int x = 10;
 }
 else
   int x = 10;
else int x = 10;
был бы код в порядке, было бы гораздо проще разобраться что к чему и найти ошибку
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
18.02.2013, 02:50  [ТС]
был бы код в порядке, было бы гораздо проще разобраться что к чему и найти ошибку
Некоторые параметры были использованы для вывода на экран и тд для разнообразных проверок. Вы бы повнимательнее пригляделись к коду, он не такой уж большой и сложный, и совсем уж явного мусора там не много Если видите конкретные ошибки - запостите их, буду рад
Эти куски кода миллион раз переписывались, на мелкие несуразности можете не обращать внимание, главное-указанный выше вопрос.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
18.02.2013, 02:58
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 public static  void t4_Tick(object source, ElapsedEventArgs e)
{
    int virtual_code = MapVirtualKey(0x11, 1);
    try
    {
    if (e4)    
            if (!in4)
            {
                PostMessage((int)win3, WM_KEYDOWN, virtual_code, 0x11 << 16 | 1);
                in4 = true;
            }
            else
                PostMessage((int)win3, WM_KEYDOWN, virtual_code, 0x11 << 16 | 1 << 30 | 1);        
    else    
        if (in4)
        {
            PostMessage((int)win3, WM_KEYUP, virtual_code, 1 << 31 | 1 << 30 | 0x11 << 16 | 1);
            in4 = false;
        }    
    }
    catch { }
}
Это в самом первом приближении. Но уже гораздо лучше. А если то, что передается 4 параметром еще и в метод засунуть, то вообще замечательно.
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
18.02.2013, 03:02  [ТС]
Местами не соглашусь.
int virtual_code = MapVirtualKey(0x11, 1);
зачем эта строка там, если не факт, что она понадобится? логичнее засунуть внутрь. А остальное все выглядит так из-за того, что копипастилось 1000 раз и менялось, куда удобнее менять что-то в таком виде, чем распихивать каждый раз по местам.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
18.02.2013, 03:06
EvilFromHell, дублирование кода - слышали о таком? Если программа работает в 2 раза дольше, но в ней нет ни одного куска дублированного когда (хотя так не бывает, максимум - 5% замедления) - то это в 99,99999% случаев оправдано. В крайнем случае профайлер найдет узкое место, и понятную, готовую к сопровождению программу будет гораздо проще сделать и понятнее и быстрее, чем оригинал. Я вон тоже в 15 лет думал "о, объявлю-ка я переменную цикла типа byte, у меня массив маленький, сэкономлю 3 байта, а то нафиг мне целый int объявлять". А про выравнивание по 4 байта, написание сопровождаемого кода и неявное преобразование счетчика к инту - я даже и не слышал. Не повторяйте детских ошибок. C# - язык для человека, хотите писать язык, понятные только машине - ASM ждет.
Цитата Сообщение от EvilFromHell Посмотреть сообщение
А остальное все выглядит так из-за того, что копипастилось 1000 раз и менялось, куда удобнее менять что-то в таком виде, чем распихивать каждый раз по местам.
смотря как делать. Как раз когда все в одном месте гораздо проще менять... Если заранее этим озаботиться... А не выискивать 100500 констант/переменных по всему коду и смотреть, тот контекст или нет.
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
18.02.2013, 03:22  [ТС]
Слышать-то я слышал, и соглашусь, что это актуально в большом проэкте, который пишет не 1 человек и где другим возможно придется разбираться в немалом количестве твоего кода. Кроме того при изменении я скорее всего забуду удалить строчку сверху, и она останется мусором висеть в коде.
Когда ты пишешь один и код требует опитимизации- по-моему странно было бы заниматься такими вещами. А параметр для постмессаджа можно было бы запихать внутрь, но так исторически сложилось, потому что раньше параметр для нескольких мессаджей был одинаковый, а потом я изменил его. Можно конечно было для форума код подредактировать, но я не думал, что у кого-то вызовет затруднения прочесть.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
18.02.2013, 04:11
C#
1
int virtual_key = a5 << 5 +a4 || 0x2D - i4
афигеть как понятно, конечно, у кого могут возникнуть затруднения с такой фигней
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
18.02.2013, 10:42  [ТС]
http://msdn.microsoft.com/en-u... 85%29.aspx
Если почитать это, либо быть в курсе написанного - все станет ясно
0
169 / 132 / 29
Регистрация: 16.02.2013
Сообщений: 867
18.02.2013, 12:46
Psilon, я тоже когда писал раньше бота для одной игры, то там тоже ыциг что разберешь
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
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Threading;
using AutoItX3Lib;
using System.Diagnostics;
 
namespace Ryb
{
    /// <summary>
    /// Description of MainForm.
    /// </summary>
    public partial class MainForm : Form
    {
        public int[] spin1=new int[11]{0,0,0,0,0,0,0,0,0,0,0};
        public int[] spin2=new int[11]{0,0,0,0,0,0,0,0,0,0,0};
        public int[] spin3=new int[11]{0,0,0,0,0,0,0,0,0,0,0};
        public int[] gh= new int[2]{0,0};
        public int[] okno=new int[2]{0,0};
        public int[] wkalal=new int[2]{0,0};
        public int[] wkalayd=new int[2]{0,0};
        public int sost=0;
        public int zaverweniepotok=0;
        AutoItX3 au3= new AutoItX3Class();
        /* spin1[0]-*******
         * spin1[1]-*******
         * spin1[2]-*******
         * spin1[3]-*******
         * spin1[4]-*******
         * spin1[5]--*******
         * spin1[6]-*******
         * spin1[7]-
         * spin1[8]-
         * spin1[9]
         * spin1[10]
         * 
         * gh[0]=1 -нажата G
         * gh[0]=0 -отжата G
         * gh[1]=1 -нажата H
         * gh[1]=0 -отжата H
         * 
         */
        public MainForm()
        {
            //
            // The InitializeComponent() call is required for Windows Forms designer support.
            //
            InitializeComponent();
            
            //
            // TODO: Add constructor code after the InitializeComponent() call.
            //
        }
        
        [DllImport("user32.dll",SetLastError = true, CharSet = CharSet.Auto)]
        static public extern short GetAsyncKeyState(int vKey);
        
        bool koordget(int i)
        {
            if (GetAsyncKeyState(17)!=0 && GetAsyncKeyState(65)!=0)
            {
                int x =au3.MouseGetPosX();
                int y = au3.MouseGetPosY();
                    switch (i) 
                        {
                        case 1:
                            spin1[0]=x;
                            spin1[1]=y;
                                break;
                        case 2:
                            spin2[0]=x;
                            spin2[1]=y;
                                break;
                        case 3:
                                spin3[0]=x;
                                spin3[1]=y;
                                break;
                        }
                    return true;
            }
            return false;
        }
    
        void Button1Click(object sender, EventArgs e)
        {
            sost=1;
            timer1.Enabled=true;
            button1.Enabled=false;          
        }
        
        void Button2Click(object sender, EventArgs e)
        {
            sost=2;
            timer1.Enabled=true;
            button2.Enabled=false;  
        }
        
        void Button3Click(object sender, EventArgs e)
        {
            sost=3;
            timer1.Enabled=true;
            button3.Enabled=false;  
        }
        
        void Timer1Tick(object sender, EventArgs e)
        {
            if (sost!=0) {
                switch (sost) {
                case 1:
                    if (koordget(1))
                    {
                        timer1.Enabled=false;
                        sost=0;
                        button1.Enabled=true;   
                    }
                    break;
                case 2:
                    if (koordget(2))
                    {
                        timer1.Enabled=false;
                        sost=0;
                        button2.Enabled=true;   
                    }
                    break;
                case 3:
                    if (koordget(3))
                    {
                        timer1.Enabled=false;
                        sost=0;
                        button3.Enabled=true;   
                    }
                    break;
            }
                
            }
            //if (spin1[2]==1) {
                
            //  spin1[2]=0;
            //  spin1[9]=1;
                    
            //  }
        }
        void Button4Click(object sender, EventArgs e)
        {
            au3.AutoItSetOption("WinSearchChildren",1);
            okno[0]= au3.WinGetPosX("[CLASS:WindowsForms10.Window.8.app.0.aec740;W:1026;H:197]","");
            okno[1]=au3.WinGetPosY("[CLASS:WindowsForms10.Window.8.app.0.aec740;W:1026;H:197]","");
            wkalal[0]=okno[0]+417;
            wkalal[1]=okno[1]+24;
            
            wkalayd[0]=okno[0]+417;
            wkalayd[1]=okno[1]+7;
            
            au3.WinMove("[CLASS:WindowsForms10.Window.8.app.0.aec740;W:250;H:150]","",900,0);
            Thread.Sleep(50);
            au3.WinMove("*******","",-790,-590);
            Thread.Sleep(50);
            au3.WinSetTrans("*******","",1);
            au3.WinSetTrans("*******","",1);
            au3.WinSetTrans("*******","",0);
            
            
            najatie(1);
            au3.MouseClick("left",spin1[0],spin1[1],1,5);
            while (au3.PixelGetColor(spin1[0],spin1[1]-14)!=11534336) {
                Thread.Sleep(30);
                }
            najatie(2);
            au3.MouseClick("left",spin2[0],spin2[1],1,5);
            while (au3.PixelGetColor(spin2[0],spin2[1]-14)!=11534336) {
                Thread.Sleep(30);
                }
            najatie(3);
            au3.MouseClick("left",spin3[0],spin3[1],1,5);
            while (au3.PixelGetColor(spin3[0],spin3[1]-14)!=11534336) {
                Thread.Sleep(30);
                }
            Thread sp1= new Thread(nabludenie1);
            Thread sp2= new Thread(nabludenie2);
            Thread sp3= new Thread(nabludenie3);
            Thread viv=new Thread(vivajhivanie);
            
            sp1.Start();
            sp2.Start();
            sp3.Start();
            viv.Start();
            timer2.Enabled=true;
            
            
            
 
 
        }
        
        void nabludenie1()
        {
            Stopwatch taum=new Stopwatch();
            int[] belii=new int[2]{spin1[1]-6,spin1[1]-14};
            int check=0;
            while(zaverweniepotok==0)
            {
                while (spin1[2]==0 && spin1[3]==0 && zaverweniepotok==0) {
                if (au3.PixelGetColor(spin1[0],belii[1])!=11534336)
                {
                    taum.Restart();
                    check=1;
                }
                if (check==1) {
                    if (au3.PixelGetColor(spin1[0],belii[0])!=16777215){
                                                check=0;
                                                spin1[2]=1;
                                                taum.Reset();
                                                break;
                                             }
                }
                if (taum.ElapsedMilliseconds > 3500) {
                    spin1[3]=1;
                    taum.Reset();
                        break;
                }
                Thread.Sleep(10);
            }
                Thread.Sleep(10);
            }
        }
        
        void nabludenie2()
        {
            Stopwatch taum=new Stopwatch();
            int[] belii=new int[2]{spin2[1]-6,spin2[1]-14};
            int check=0;
            while(zaverweniepotok==0)
            {
                while (spin2[2]==0 && spin2[3]==0 && zaverweniepotok==0) {
                if (au3.PixelGetColor(spin2[0],belii[1])!=11534336)
                {
                    taum.Restart();
                    check=1;
                }
                if (check==1) {
                    if (au3.PixelGetColor(spin2[0],belii[0])!=16777215){
                                                check=0;
                                                spin2[2]=1;
                                                taum.Reset();
                                                break;
                                             }
                }
                if (taum.ElapsedMilliseconds>3500) {
                    spin2[3]=1;
                    taum.Reset();
                        break;
                }
                Thread.Sleep(10);
            }
                Thread.Sleep(10);
            }
        }
                
        void nabludenie3()
        {
            Stopwatch taum=new Stopwatch();
            int[] belii=new int[2]{spin3[1]-6,spin3[1]-14};
            int check=0;
            while(zaverweniepotok==0)
            {
                while (spin3[2]==0 && spin3[3]==0 && zaverweniepotok==0) {
                if (au3.PixelGetColor(spin3[0],belii[1])!=11534336)
                {
                    taum.Restart();
                    check=1;
                }
                if (check==1) {
                    if (au3.PixelGetColor(spin3[0],belii[0])!=16777215){
                                                check=0;
                                                spin3[2]=1;
                                                taum.Reset();
                                                break;
                                             }
                }
                if (taum.ElapsedMilliseconds>3500) {
                    spin3[3]=1;
                    taum.Reset();
                        break;
                }
                Thread.Sleep(10);
            }
                Thread.Sleep(10);
            }
        }       
        
        void vivajhivanie()
        {
            int vodoemx = au3.WinGetPosX("[CLASS:WindowsForms10.Window.8.app.0.aec740;W:800;H:500]","");
            int vodoemy= au3.WinGetPosY("[CLASS:WindowsForms10.Window.8.app.0.aec740;W:800;H:500]","");
            int vodoemxa=vodoemx+800;
            int vodoemya=vodoemy+480;
            int vodoemyb=vodoemy+490;
            while (zaverweniepotok==0)
            {
                if (spin1[2]==1 && spin1[6]==0) {
                if (spin2[2]==1) {
                        if (gh[0]==1) {
                             au3.ControlSend("[CLASS:WindowsForms10.Window.8.app.0.aec740;REGEXPTITLE:[А-Яа-яЁё.-];W:1026;H:735]","","","{G UP}",0);
                             gh[0]=0;
                        }
                        if (gh[1]==1) {
                             au3.ControlSend("[CLASS:WindowsForms10.Window.8.app.0.aec740;REGEXPTITLE:[А-Яа-яЁё.-];W:1026;H:735]","","","{H UP}",0);
                             gh[1]=0;
                        }
                        spin2[4]=1;
                        spin2[5]=0;
                }
                if (spin3[2]==1) {
                        if (gh[0]==1) {
                             au3.ControlSend("[CLASS:WindowsForms10.Window.8.app.0.aec740;REGEXPTITLE:[А-Яа-яЁё.-];W:1026;H:735]","","","{G UP}",0);
                             gh[0]=0;
                        }
                        if (gh[1]==1) {
                             au3.ControlSend("[CLASS:WindowsForms10.Window.8.app.0.aec740;REGEXPTITLE:[А-Яа-яЁё.-];W:1026;H:735]","","","{H UP}",0);
                             gh[1]=0;
                        }
                    spin3[4]=1;
                    spin3[5]=0;
                }
                najatie(1);
                spin1[5]=1;
                spin1[6]=1;
                au3.ControlSend("[CLASS:WindowsForms10.Window.8.app.0.aec740;REGEXPTITLE:[А-Яа-яЁё.-];W:1026;H:735]","","","{J}",0);
                Thread.Sleep(788);
                }
                if (spin2[2]==1 && spin2[6]==0) {
                if (spin1[2]==1) {
                        if (gh[0]==1) {
                             au3.ControlSend("[CLASS:WindowsForms10.Window.8.app.0.aec740;REGEXPTITLE:[А-Яа-яЁё.-];W:1026;H:735]","","","{G UP}",0);
                             gh[0]=0;
                        }
                        if (gh[1]==1) {
                             au3.ControlSend("[CLASS:WindowsForms10.Window.8.app.0.aec740;REGEXPTITLE:[А-Яа-яЁё.-];W:1026;H:735]","","","{H UP}",0);
                             gh[1]=0;
                        }
                    spin1[4]=1;
                    spin1[5]=0;
                }
                if (spin3[2]==1) {
                        if (gh[0]==1) {
                             au3.ControlSend("[CLASS:WindowsForms10.Window.8.app.0.aec740;REGEXPTITLE:[А-Яа-яЁё.-];W:1026;H:735]","","","{G UP}",0);
                             gh[0]=0;
                        }
                        if (gh[1]==1) {
                             au3.ControlSend("[CLASS:WindowsForms10.Window.8.app.0.aec740;REGEXPTITLE:[А-Яа-яЁё.-];W:1026;H:735]","","","{H UP}",0);
                             gh[1]=0;
                        }
                    spin3[4]=1;
                    spin3[5]=0;
                }
                najatie(2);
                spin2[5]=1;
                spin2[6]=1;
                au3.ControlSend("[CLASS:WindowsForms10.Window.8.app.0.aec740;REGEXPTITLE:[А-Яа-яЁё.-];W:1026;H:735]","","","{J}",0);
                Thread.Sleep(788);
                }
            
                if (spin3[2]==1 && spin3[6]==0) {
                if (spin2[2]==1) {
                        if (gh[0]==1) {
                             au3.ControlSend("[CLASS:WindowsForms10.Window.8.app.0.aec740;REGEXPTITLE:[А-Яа-яЁё.-];W:1026;H:735]","","","{G UP}",0);
                             gh[0]=0;
                        }
                        if (gh[1]==1) {
                             au3.ControlSend("[CLASS:WindowsForms10.Window.8.app.0.aec740;REGEXPTITLE:[А-Яа-яЁё.-];W:1026;H:735]","","","{H UP}",0);
                             gh[1]=0;
                        }
                    spin2[4]=1;
                    spin2[5]=0;
                }
                if (spin1[2]==1) {
                        if (gh[0]==1) {
                             au3.ControlSend("[CLASS:WindowsForms10.Window.8.app.0.aec740;REGEXPTITLE:[А-Яа-яЁё.-];W:1026;H:735]","","","{G UP}",0);
                             gh[0]=0;
                        }
                        if (gh[1]==1) {
                             au3.ControlSend("[CLASS:WindowsForms10.Window.8.app.0.aec740;REGEXPTITLE:[А-Яа-яЁё.-];W:1026;H:735]","","","{H UP}",0);
                             gh[1]=0;
                        }
                    spin1[4]=1;
                    spin1[5]=0;
                }
                najatie(3);
                spin3[5]=1;
                spin3[6]=1;
                au3.ControlSend("[CLASS:WindowsForms10.Window.8.app.0.aec740;REGEXPTITLE:[А-Яа-яЁё.-];W:1026;H:735]","","","{J}",0);
                Thread.Sleep(788);
                }
                
                while (spin1[2]==1 && zaverweniepotok==0|spin2[2]==1 && zaverweniepotok==0|spin3[2]==1 && zaverweniepotok==0) {
                    if(gh[0]==0){
                    if (au3.WinGetPosWidth("[class:WindowsForms10.Window.8.app.0.aec740;X:"+wkalal[0]+";Y:"+wkalal[1]+"]")==1) {
                        au3.ControlSend("[CLASS:WindowsForms10.Window.8.app.0.aec740;REGEXPTITLE:[А-Яа-яЁё.-];W:1026;H:735]","","","{G}",0);
                        au3.ControlSend("[CLASS:WindowsForms10.Window.8.app.0.aec740;REGEXPTITLE:[А-Яа-яЁё.-];W:1026;H:735]","","","{G DOWN}",0);
                        gh[0]=1;
                        }
                }
                    if (gh[0]==1){
                        if (au3.WinGetPosWidth("[class:WindowsForms10.Window.8.app.0.aec740;X:"+wkalal[0]+";Y:"+wkalal[1]+"]")>70) {
                        au3.ControlSend("[CLASS:WindowsForms10.Window.8.app.0.aec740;REGEXPTITLE:[А-Яа-яЁё.-];W:1026;H:735]","","","{G}",0);
                        au3.ControlSend("[CLASS:WindowsForms10.Window.8.app.0.aec740;REGEXPTITLE:[А-Яа-яЁё.-];W:1026;H:735]","","","{G UP}",0);
                        gh[0]=0;
                        }
                    }
                    if (gh[1]==0){
                    if (au3.WinGetPosWidth("[class:WindowsForms10.Window.8.app.0.aec740;X:"+wkalayd[0]+";Y:"+wkalayd[1]+"]")==1) {
                        au3.ControlSend("[CLASS:WindowsForms10.Window.8.app.0.aec740;REGEXPTITLE:[А-Яа-яЁё.-];W:1026;H:735]","","","{H}",0);
                        au3.ControlSend("[CLASS:WindowsForms10.Window.8.app.0.aec740;REGEXPTITLE:[А-Яа-яЁё.-];W:1026;H:735]","","","{H DOWN}",0);
                        gh[1]=1;
                        }
                    }
                    if (gh[1]==1){
                        if (au3.WinGetPosWidth("[class:WindowsForms10.Window.8.app.0.aec740;X:"+wkalayd[0]+";Y:"+wkalayd[1]+"]")>70) {
                        au3.ControlSend("[CLASS:WindowsForms10.Window.8.app.0.aec740;REGEXPTITLE:[А-Яа-яЁё.-];W:1026;H:735]","","","{H}",0);
                        au3.ControlSend("[CLASS:WindowsForms10.Window.8.app.0.aec740;REGEXPTITLE:[А-Яа-яЁё.-];W:1026;H:735]","","","{H UP}",0);
                        gh[1]=0;
                        }
                    }
                    //au3.PixelSearch(vodoemx,vodoemya,vodoemxa,vodoemyb,16777215);
                    //if (au3.error==0) {
                    //  au3.ControlSend("[CLASS:WindowsForms10.Window.8.app.0.aec740;REGEXPTITLE:[А-Яа-яЁё.-];W:1026;H:735]","","","{F}",0);
                    //  Thread.Sleep(200);
                    //}
                    
                    if (au3.WinActive("Садок","")>0) {
                        if (spin1[5]==1) {
                            au3.MouseClick("left",okno[0]+529,okno[1]+29,1,0);
                            Thread.Sleep(300);
                            au3.ControlSend("[CLASS:WindowsForms10.Window.8.app.0.aec740;REGEXPTITLE:[А-Яа-яЁё.-];W:1026;H:735]","","","{G}",0);
                            Thread.Sleep(50);
                            au3.ControlSend("[CLASS:WindowsForms10.Window.8.app.0.aec740;REGEXPTITLE:[А-Яа-яЁё.-];W:1026;H:735]","","","{H}",0);
                            Thread.Sleep(50);
                            au3.ControlSend("[CLASS:WindowsForms10.Window.8.app.0.aec740;REGEXPTITLE:[А-Яа-яЁё.-];W:1026;H:735]","","","{T}",0);
                            Thread.Sleep(200);
                            while (au3.PixelGetColor(spin1[0],spin1[1]-14)!=11534336) {
                                Thread.Sleep(30);
                            }
                            while (true) {
                                if (spin2[4]==1) {
                                    spin2[5]=1;
                                    spin2[4]=0;
                                    najatie(2);
                                    break;
                                }
                                if (spin3[4]==1) {
                                    spin3[5]=1;
                                    spin3[4]=0;
                                    najatie(3);
                                    break;
                                }
                                else
                                {
                                    break;
                                }
                            }
                        
                        spin1[5]=0;
                        spin1[2]=0;
                        spin1[6]=0;
                        //gh[0]=0;
                        //gh[1]=0;
                        Thread.Sleep(1500);
                        }
                            
                            if (spin2[5]==1) {
                            au3.MouseClick("left",okno[0]+529,okno[1]+29,1,0);
                            Thread.Sleep(300);
                            au3.ControlSend("[CLASS:WindowsForms10.Window.8.app.0.aec740;REGEXPTITLE:[А-Яа-яЁё.-];W:1026;H:735]","","","{G}",0);
                            Thread.Sleep(50);
                            au3.ControlSend("[CLASS:WindowsForms10.Window.8.app.0.aec740;REGEXPTITLE:[А-Яа-яЁё.-];W:1026;H:735]","","","{H}",0);
                            Thread.Sleep(50);
                            au3.ControlSend("[CLASS:WindowsForms10.Window.8.app.0.aec740;REGEXPTITLE:[А-Яа-яЁё.-];W:1026;H:735]","","","{T}",0);
                            Thread.Sleep(200);
                            while (au3.PixelGetColor(spin2[0],spin2[1]-14)!=11534336) {
                                Thread.Sleep(30);
                            }
                            while (true) {
                                if (spin1[4]==1) {
                                    spin1[5]=1;
                                    spin1[4]=0;
                                    najatie(1);
                                    break;
                                }
                                if (spin3[4]==1) {
                                    spin3[5]=1;
                                    spin3[4]=0;
                                    najatie(3);
                                    break;
                                }
                                else
                                {
                                    break;
                                }
                            }
                            spin2[5]=0;
                            spin2[2]=0;
                            spin2[6]=0;
                            //gh[0]=0;
                            //gh[1]=0;
                            Thread.Sleep(1500);
                            }
                            
                            if (spin3[5]==1) {
                            au3.MouseClick("left",okno[0]+529,okno[1]+29,1,0);
                            Thread.Sleep(300);
                            au3.ControlSend("[CLASS:WindowsForms10.Window.8.app.0.aec740;REGEXPTITLE:[А-Яа-яЁё.-];W:1026;H:735]","","","{G}",0);
                            Thread.Sleep(50);
                            au3.ControlSend("[CLASS:WindowsForms10.Window.8.app.0.aec740;REGEXPTITLE:[А-Яа-яЁё.-];W:1026;H:735]","","","{H}",0);
                            Thread.Sleep(50);
                            au3.ControlSend("[CLASS:WindowsForms10.Window.8.app.0.aec740;REGEXPTITLE:[А-Яа-яЁё.-];W:1026;H:735]","","","{T}",0);
                            Thread.Sleep(200);
                            while (au3.PixelGetColor(spin3[0],spin3[1]-14)!=11534336) {
                                Thread.Sleep(30);
                            }
                            while (true) {
                                if (spin1[4]==1) {
                                    spin1[5]=1;
                                    spin1[4]=0;
                                    najatie(1);
                                    break;
                                }
                                if (spin2[4]==1) {
                                    spin2[5]=1;
                                    spin2[4]=0;
                                    najatie(2);
                                    break;
                                }
                                else
                                {
                                    break;
                                }
                            }
                            spin3[5]=0;
                            spin3[2]=0;
                            spin3[6]=0;
                            //gh[0]=0;
                            //gh[1]=0;
                            Thread.Sleep(1500);
                        }
                    }
                    if (spin1[2]==1 && spin1[4]==0 && spin1[5]!=1) {
                        break;
                    }
                    if (spin2[2]==1 && spin2[4]==0 && spin2[5]!=1) {
                        break;
                    }
                    if (spin3[2]==1 && spin3[4]==0 && spin3[5]!=1) {
                        break;
                    }
                    
                    if (gh[0]==0 && au3.WinGetPosWidth("[class:WindowsForms10.Window.8.app.0.aec740;X:"+wkalal[0]+";Y:"+wkalal[1]+"]")<2) {
                        gh[0]=0;
                    }
                    if (gh[1]==0 && au3.WinGetPosWidth("[class:WindowsForms10.Window.8.app.0.aec740;X:"+wkalayd[0]+";Y:"+wkalayd[1]+"]")<2) {
                        gh[1]=0;
                    }
                    if (gh[0]==1 && au3.WinGetPosWidth("[class:WindowsForms10.Window.8.app.0.aec740;X:"+wkalal[0]+";Y:"+wkalal[1]+"]")>80) {
                        gh[0]=1;
                    }
                    if (gh[1]==1 && au3.WinGetPosWidth("[class:WindowsForms10.Window.8.app.0.aec740;X:"+wkalayd[0]+";Y:"+wkalayd[1]+"]")>80) {
                        gh[1]=1;
                    }
                    Thread.Sleep(10);
                }
                
                
                if (spin1[3]==1) {
                    najatie(1);
                    au3.ControlSend("[CLASS:WindowsForms10.Window.8.app.0.aec740;REGEXPTITLE:[А-Яа-яЁё.-];W:1026;H:735]","","","{T}",0);
                    Thread.Sleep(300);
                    while (au3.PixelGetColor(spin1[0],spin1[1]-14)!=11534336) {
                        Thread.Sleep(30);
                    }
                    Thread.Sleep(500);
                    spin1[3]=0;
                }
                if (spin2[3]==1) {
                    najatie(2);
                    au3.ControlSend("[CLASS:WindowsForms10.Window.8.app.0.aec740;REGEXPTITLE:[А-Яа-яЁё.-];W:1026;H:735]","","","{T}",0);
                    Thread.Sleep(300);
                    while (au3.PixelGetColor(spin2[0],spin2[1]-14)!=11534336) {
                        Thread.Sleep(30);
                    }
                    Thread.Sleep(500);
                    spin2[3]=0;
                }
                if (spin3[3]==1) {
                    najatie(3);
                    au3.ControlSend("[CLASS:WindowsForms10.Window.8.app.0.aec740;REGEXPTITLE:[А-Яа-яЁё.-];W:1026;H:735]","","","{T}",0);
                    Thread.Sleep(300);
                    while (au3.PixelGetColor(spin3[0],spin3[1]-14)!=11534336) {
                        Thread.Sleep(30);
                    }
                    Thread.Sleep(500);
                    spin3[3]=0;
                }
                Thread.Sleep(10);
        }
        }
            
        void najatie(byte nomer){
            switch (nomer) {
                case 1:
                    au3.ControlSend("[CLASS:WindowsForms10.Window.8.app.0.aec740;REGEXPTITLE:[А-Яа-яЁё.-];W:1026;H:735]","","","{1}",0);
                    Thread.Sleep(100);
                    break;
                case 2:
                    au3.ControlSend("[CLASS:WindowsForms10.Window.8.app.0.aec740;REGEXPTITLE:[А-Яа-яЁё.-];W:1026;H:735]","","","{2}",0);
                    Thread.Sleep(100);
                    break;
                case 3:
                    au3.ControlSend("[CLASS:WindowsForms10.Window.8.app.0.aec740;REGEXPTITLE:[А-Яа-яЁё.-];W:1026;H:735]","","","{3}",0);
                    Thread.Sleep(100);
                    break;
            }
        }
        
    
        
        void MainFormFormClosed(object sender, FormClosedEventArgs e)
        {
            zaverweniepotok=1;
            au3.WinMove("[CLASS:WindowsForms10.Window.8.app.0.aec740;W:250;H:150]","",0,0);
            Thread.Sleep(50);
            au3.WinMove("*******","",0,0);
            Thread.Sleep(50);
            au3.WinSetTrans("*******","",255);
            au3.WinSetTrans("*******","",255);
            au3.WinSetTrans("*******","",255);
        }
        
        void Timer2Tick(object sender, EventArgs e)
        {
            
            label1.Text=String.Format("sp1 {0} {1} {2} {3} {4} {5} {6} gh {7} {8}",
                                      spin1[0],
                                      spin1[1],
                                      spin1[2],
                                      spin1[3],
                                      spin1[4],
                                      spin1[5],
                                      spin1[6],
                                      gh[0],
                                      gh[1]);
                label2.Text=String.Format("sp2 {0} {1} {2} {3} {4} {5} {6} gh {7} {8}",
                                      spin2[0],
                                      spin2[1],
                                      spin2[2],
                                      spin2[3],
                                      spin2[4],
                                      spin2[5],
                                      spin2[6],
                                      gh[0],
                                      gh[1]);
                label3.Text=String.Format("sp3 {0} {1} {2} {3} {4} {5} {6} gh {7} {8}",
                                      spin3[0],
                                      spin3[1],
                                      spin3[2],
                                      spin3[3],
                                      spin3[4],
                                      spin3[5],
                                      spin3[6],
                                      gh[0],
                                      gh[1]);
        }
}
}
сейчас я конечно бы не писал такую тонну кода...
но он работает, а это самое главное
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
18.02.2013, 13:01
EvilFromHell, вот ниже пример кода, такой же, как и ваш. Что-нибудь из него понятно? Мне интересно просто
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
18.02.2013, 13:08  [ТС]
Разобрать код можно, вот только я пока не пойму, для какой игры он предназначен, если не секрет-название бы
Но конечно не с 1ого взгляда, он длиннее моего в 3 раза и не особо комментирован

Добавлено через 2 минуты
Да и массивов у меня в коде особо нет-одни условия и bool перменные. Остальное все вырезано для простоты
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
18.02.2013, 13:12
EvilFromHell, да нет, просто скажите, какой метод что делает и за что отвечает каждая переменная (в чужом коде естественно). К тому же комментарии - зло
0
169 / 132 / 29
Регистрация: 16.02.2013
Сообщений: 867
18.02.2013, 13:15
EvilFromHell, название игры не скажу. комментариев конечно не много, но я в этом коде понимаю, а это главное.
а если вы на форум вылаживаете свой код, то конечно стоит его подредактировать, так как другие его иогут не разобрать, и не помочь вам. массивы я сделал для удобства. их три и они одинаковые. сейчас я бы сделал класс в отдельном файле, чтобы читабельность была лучше + сократить его. и еще может быть что вынес в отдельный класс...
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
18.02.2013, 13:23
Цитата Сообщение от Winhttp22 Посмотреть сообщение
EvilFromHell, название игры не скажу. комментариев конечно не много, но я в этом коде понимаю, а это главное.


Заставить код работать недостаточно. Работоспособный код часто несовершенен.
Программисты, которые заставляют свой код работать и на этом считают свою
задачу выполненной, ведут себя непрофессионально. Возможно, они опасаются,
что у них не хватит времени для совершенствования структуры и архитектуры
кода, но я не могу с этим согласиться. Ничто не оказывает настолько
всестороннего и длительного отрицательного влияния на судьбу программного проекта,
как плохой код. Плохой график можно переделать, плохие требования можно
переопределить. Плохую динамику рабочей группы еще можно исправить.
Плохой код загнивает и разбухает, превращаясь в беспощадный груз, который тянет
группу ко дну. Сколько раз я видел, как работа заходит в тупик по одной причине:
в спешке вместо добротного кода создавалась какая-то безобразная мешанина,
которая после этого обрекала группу на бесконечные мучения.
Конечно, плохой код можно вычистить. Но это обходится очень дорого. В
процессе загнивания кода модули постепенно проникают друг в друга, образуется
множество скрытых и запутанных зависимостей. Поиск и разрыв старых
зависимостей — длительная, тяжелая работа. С другой стороны, поддерживать чистоту
в коде относительно несложно. Если утром вы устроили беспорядок в модуле, то
его будет легко вычистить днем. Или еще лучше, если вы устроили беспорядок
пять минут назад, то его будет очень легко вычистить прямо сейчас.
Итак, постоянно следите за тем, чтобы ваш код оставался как можно более
простым и чистым. Не допускайте, чтобы он начал загнивать.
0
169 / 132 / 29
Регистрация: 16.02.2013
Сообщений: 867
18.02.2013, 13:43
Psilon, ахаха.
Программисты, которые заставляют свой код работать и на этом считают свою
задачу выполненной, ведут себя непрофессионально.
насчет профессиональности - да, возможно он не профессиональный. я ведь в первую очередь не профессионал а любитель.
Возможно, они опасаются,
что у них не хватит времени для совершенствования структуры и архитектуры
кода, но я не могу с этим согласиться.
да, программисту, который получает деньги, не зависимо от того, готов проект или нет - это позволительно. я не долго во фрилансе нахожусь, так вот - мне деньги платят за то, что я выполнил работу в срок. и на какие то совершенствования у меня просто нет времени. конечно потом глядя на код я вижу, где его можно грамотней переписать. но зачем мне уже это? проект сдан, заказчик доволен, пользуется программой, я получил деньги. программа работает как надо. переписать - чтобы порадовать свой глаз?
Плохой код загнивает и разбухает, превращаясь в беспощадный груз, который тянет
группу ко дну.
тут снова о какой то группе идет речь... а я один работаю над проектом. если группа программистов работала бы, то конечно нужно грамотно писать, чтобы каждый все понимал, и не тратил время на понимание кода, но мне одному это зачем??
Сколько раз я видел, как работа заходит в тупик по одной причине:
в спешке вместо добротного кода создавалась какая-то безобразная мешанина,
которая после этого обрекала группу на бесконечные мучения.
снова о группе
так что - более уместен к вам. вы проводите цитату профессионала, который работает программистом, и который просто обьязан писать правильно. притом еще о группе программистов говорит, странно что вы этого не заметили. я же любитель.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.02.2013, 13:43
Помогаю со студенческими работами здесь

Перехватчик клавиш + эмуляция нажатия клавиш
Здравствуйте! Срочно нужна помощь! Моя программа работает в фоновом режиме. Мне нужно: 1) чтобы где бы я не находился в среде,...

Эмуляция нажатия клавиш.
Программа заключается в том, чтоб был постоянно повторяющийся цикл(по моему так) раз в пол минуты(не пренципиально можно и минуту но не...

Эмуляция нажатия клавиш
здрасте.мне нужно проэмулировать нажатие кнопок мыши и нажатий клавиш в неактивном окне(конкретно в браузере). слышал что можно окно...

Эмуляция нажатия клавиш
Всем привет! Помогите написать простенькую программу. Что должна делать? Вводим число в Edit (в секндах) должно использоваться через...

Эмуляция нажатия клавиш
помогите с кодом разобраться, не работает( Var PWD, Login : String; procedure PressingKeyboard(Key: byte; extra:...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
BOINC: 22 года — и всё ещё работает
Programma_Boinc 12.03.2026
BOINC: 22 года — и всё ещё работает Дэвид Андерсон написал ретроспективу. Кратко: в 2001 году он ушёл из United Devices, где был CTO, и за несколько месяцев написал ядро BOINC — клиент, сервер,. . .
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru