-
Notifications
You must be signed in to change notification settings - Fork 1
/
TutorialRu.tex
789 lines (648 loc) · 83.3 KB
/
TutorialRu.tex
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
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
\setlength{\parskip}{0.125in}
\chapter{Объявление о проведении Конкурса}
Общество с ограниченной ответственностью <<Мэйл.Ру>>, созданное и действующее в соответствии с законодательством Российской Федерации, с
местом нахождения по адресу: 125167, г. Москва, Ленинградский проспект, д. 39, строение 79, далее по тексту <<Организатор конкурса>>,
приглашает физических лиц, достигших к моменту опубликования настоящего Объявления о конкурсе 18 лет, далее по тексту <<Участник конкурса>>,
к участию в конкурсе на нижеследующих условиях:
\section{Наименование Конкурса}
<<Российский кубок по программированию искусственного интеллекта (Russian AI Cup)>>.
Целями проведения Конкурса являются:
\begin{itemize}
\item повышение общественного интереса к сфере создания программных продуктов;
\item предоставление Участникам конкурса возможности раскрыть творческие способности;
\item развитие профессиональных навыков Участников конкурса.
\end{itemize}
Конкурс состоит из 3 (трёх) этапов, каждый из которых завершается определением Победителей. Последний этап Конкурса является решающим.
\section{Информация об организаторе конкурса}
Наименование: ООО <<Мэйл.Ру>>
Адрес места нахождения: 125167, г. Москва, Ленинградский проспект, д. 39, строение 79
Почтовый адрес: 125167, г. Москва, Ленинградский проспект, д. 39, строение 79, БЦ <<SkyLight>>
Телефон: (495) 725-63-57
Сайт: http://www.russianaicup.ru
Е-мейл: [email protected]
\section{Сроки проведения Конкурса}
Срок проведения Конкурса: с 00.00 часов 7 ноября 2017 года до 24.00 часов 24 декабря 2017 года по Московскому времени.
Первая неделя (с 00.00 часов 7 ноября 2017 года до 24.00 часов 12 ноября 2017 года) и четвёртая неделя (с 00.00 часов 27 ноября 2017 года до
24.00 часов 3 декабря 2017 года) Конкурса являются тестовыми. В течение этого периода функциональность сайта и тестирующей системы Конкурса
может быть неполной, а в правила могут вноситься существенные изменения.
Сроки начала и окончания этапов Конкурса:
\begin{itemize}
\item первый этап – с 00 часов 00 минут 25 ноября 2017 года до 24 часов 00 минут 26 ноября 2017 года;
\item второй этап – с 00 часов 00 минут 9 декабря 2017 года до 24 часов 00 минут 10 декабря 2017 года;
\item третий этап (заключительный) – с 00 часов 00 минут 16 декабря 2017 года до 24 часов 00 минут 17 декабря 2017 года.
\end{itemize}
\section{Условие получения статуса Участника конкурса}
Для участия в Конкурсе необходимо пройти процедуру регистрации в Системе Организатора конкурса, размещённой на сайте Организатора конкурса в
сети Интернет по адресу: http://www.russianaicup.ru.
\section{Срок регистрации Участников конкурса в Системе Организатора}
Регистрация Участников конкурса проводится с 00.00 часов 7 ноября 2017 года до 24.00 часов 24 декабря 2017 года включительно.
\section{Территория проведения Конкурса}
Конкурс проводится на территории Российской Федерации. Проведение всех этапов Конкурса осуществляется путем удалённого доступа к Системе
Организатора конкурса через сеть Интернет.
\section{Условия проведения Конкурса (существо заданий, критерии и порядок оценки)}
Порядок проведения Конкурса, существо задания, критерии и порядок оценки указаны в главе 2 данного документа.
Конкурсная документация включает в себя:
\begin{itemize}
\item Объявление о проведении Конкурса;
\item Соглашение об организации и порядке проведения Конкурса;
\item Правила проведения Конкурса;
\item информационные данные, содержащиеся в Системе Организатора конкурса.
\end{itemize}
Участник конкурса может ознакомиться с конкурсной документацией на сайте Организатора конкурса в сети Интернет по адресу:
http://www.russianaicup.ru, а также при прохождении процедуры регистрации в Системе Организатора конкурса.
Организатор конкурса оставляет за собой право на изменение конкурсной документации, условий проведения Конкурса и отказ от его проведения в
соответствии с условиями конкурсной документации и нормами законодательства РФ. При этом Организатор Конкурса обязуется уведомить
Участников конкурса обо всех произошедших изменениях путём отправки уведомления, в порядке и на условиях, предусмотренных в конкурсной
документации.
\section{Порядок определения Победителей и вручения Призов. Призовой фонд Конкурса}
Критерии оценки результатов Конкурса, количество и порядок определения Победителей содержатся в главе 2 данного документа.
Призовой фонд Конкурса формируется за счет средств Организатора конкурса.
Призовой фонд:
\begin{itemize}
\item 1 место --- Apple Macbook Pro;
\item 2 место --- Apple Macbook Air;
\item 3 место --- Apple iPad;
\item 4 место --- Samsung Gear S3;
\item 5 место --- WD My Cloud 6 TB;
\item 6 место --- WD My Passport Ultra 4TB;
\item 1-6 места в Песочнице --- WD My Passport Ultra 2TB.
\end{itemize}
Все участники Конкурса, принявшие участие во втором или третьем этапах, будут награждены футболкой. Все участники Конкурса, принявшие
участие в третьем этапе, также получат толстовку с символикой соревнования.
Все участники, занявшие призовые места, будут оповещены посредством отправки сообщения на адрес электронной почты, указанный участником при
регистрации в Системе Организатора.
Призы будут высланы участникам в виде посылок, используя Почту России или другую почтовую службу, в течение двух месяцев после окончания
финального этапа. Срок доставки приза по почтовому адресу, указанному участником, зависит от сроков доставки используемой почтовой службы.
Почтовые адреса призёров для отправки призов Организатор получает из учётных данных участника в Системе Организатора. Адрес должен быть
указан участником-призёром в течение трёх дней после получения уведомления о получении приза.
При отсутствии ответа в обозначенные сроки или отказе предоставить точные данные, необходимые для вручения призов Конкурса, Организатор
оставляет за собой право отказать такому участнику в выдаче приза Конкурса. Денежный эквивалент приза не выдаётся.
Победители Конкурса обязуются предоставить Организатору конкурса копии всех документов, необходимых для бухгалтерской и налоговой отчётности
Организатора конкурса. Перечень документов, которые Победитель обязан предоставить Организатору конкурса, может включать в себя:
\begin{itemize}
\item копию паспорта Победителя;
\item копию свидетельства о постановке на налоговый учет Победителя;
\item копию пенсионного удостоверения Победителя;
\item данные об открытии банковского лицевого счета Победителя;
\item иные документы, которые Организатор конкурса потребует от Участника конкурса в целях формирования отчётности о проведённом Конкурсе.
\end{itemize}
Наряду с копиями Организатор конкурса вправе запросить оригиналы вышеуказанных документов.
В соответствии с подпунктом 4 пункта 1 статьи 228 НК РФ Победитель Конкурса, ставший обладателем Приза, самостоятельно несёт все расходы по
уплате всех применимых налогов, установленных действующим законодательством Российской Федерации.
\section{Порядок и способ информирования участников Конкурса}
Информирование Участников Конкурса осуществляется путём размещения информации в сети Интернет на Сайте Организатора конкурса по адресу:
http://www.russianaicup.ru, а также через Систему Организатора конкурса, в течение всего срока проведения Конкурса.
\chapter{О мире CodeWars 2017}
\section{Общие положения игры и правила проведения турнира}
Данное соревнование предоставляет вам возможность проверить свои навыки программирования, создав искусственный интеллект (стратегию),
управляющий большим количеством боевых единиц (техники) в специальном игровом мире (подробнее об особенностях мира CodeWars 2017 можно
узнать в следующих пунктах этой главы). Специфической особенностью задачи этого года является то, что набор действий, доступных вашей
стратегии, схож с возможностями управления в обычных компьютерных играх жанра RTS. Также есть ограничение на количество действий в единицу
игрового времени. В каждой игре вам будет противостоять стратегия другого игрока. Для победы необходимо набрать больше баллов, чем у вашего
оппонента. Баллы начисляются за различные игровые действия. Разумеется, за полное уничтожение противника даётся значительное количество
баллов, что почти полностью нивелирует другие достижения в процессе игры. Сохраняется теоретическая возможность уничтожить противника, но в
то же время проиграть по баллам, однако на практике такое почти невозможно. Количество баллов, полученных в процессе игры, становится более
важным, если ни одному из участников не удалось добиться полной победы за отведённое на игру время.
Сражение происходит на различных типах местности и при различных погодных условиях, влияющих на некоторые параметры техники. В некоторых
режимах игры на карте могут присутствовать нейтральные сооружения, захватывая которые стратегия получает возможность производить новую
технику или обретает другие игровые преимущества. Игры последнего этапа турнира проводятся в условиях частичной видимости.
Турнир проводится в несколько этапов, которым предшествует квалификация в Песочнице. Песочница --- соревнование, которое проходит на
протяжении всего чемпионата. В рамках каждого этапа игроку соответствует некоторое значение рейтинга --- показателя того, насколько успешно
его стратегия участвует в играх.
Начальное значение рейтинга в Песочнице равно $1200$. По итогам игры это значение может как увеличиться, так и уменьшиться. При этом победа
над слабым (с низким рейтингом) противником даёт небольшой прирост, также и поражение от сильного соперника незначительно уменьшает ваш
рейтинг. Со временем рейтинг в Песочнице становится всё более инертным, что позволяет уменьшить влияние случайных длинных серий побед или
поражений на место участника, однако вместе с тем и затрудняет изменение его положения при существенном улучшении стратегии. Для отмены
данного эффекта участник может сбросить изменчивость рейтинга до начального состояния при отправке новой стратегии, включив соответствующую
опцию. В случае принятия новой стратегии системой рейтинг участника сильно упадёт после следующей игры в Песочнице, однако по мере
дальнейшего участия в играх быстро восстановится и даже станет выше, если ваша стратегия действительно стала эффективнее. Не рекомендуется
использовать данную опцию при незначительных, инкрементальных улучшениях вашей стратегии, а также в случаях, когда новая стратегия
недостаточно протестирована и эффект от изменений в ней достоверно не известен.
Начальное значение рейтинга на каждом основном этапе турнира равно $0$. За каждую игру участник получает определённое количество единиц
рейтинга в зависимости от занятого места (система, аналогичная используемой в чемпионате <<Формула-1>>). Если два или более участников делят
какое-то место, то суммарное количество единиц рейтинга за это место и за следующие $\texttt{количество\_таких\_участников}-1$ мест делится
поровну между этими участниками. Например, если два участника делят первое место, то каждый из них получит половину от суммы единиц рейтинга
за первое и второе места. При делении округление всегда совершается в меньшую сторону. Более подробная информация об этапах турнира будет
предоставлена в анонсах на сайте проекта.
Сначала все участники могут участвовать только в играх, проходящих в Песочнице. Игроки могут отправлять в Песочницу свои стратегии, и
последняя принятая из них берётся системой для участия в квалификационных играх. Каждый игрок участвует примерно в одной квалификационной
игре за час. Жюри оставляет за собой право изменить этот интервал, исходя из пропускной способности тестирующей системы, однако для
большинства участников он остаётся постоянной величиной. Существует ряд критериев, по которым интервал участия в квалификационных играх
может быть увеличен для конкретного игрока. За каждую N-ю полную неделю, прошедшую с момента отправки игроком последней стратегии, интервал
участия для этого игрока увеличивается на N базовых интервалов тестирования. Учитываются только принятые системой стратегии. За каждое
<<падение>> стратегии в $10$ последних играх в Песочнице начисляется дополнительный штраф, равный $20\%$ от базового интервала тестирования.
Подробнее о причинах <<падения>> стратегии можно узнать в следующих разделах. Интервал участия игрока в Песочнице не может стать больше
суток.
Игры в Песочнице проходят по набору правил, соответствующему правилам случайного прошедшего этапа турнира или же правилам следующего
(текущего) этапа. При этом чем ближе значение рейтинга двух игроков в рамках Песочницы, тем больше вероятность того, что они окажутся в
одной игре. Песочница стартует до начала первого этапа турнира и завершается через некоторое время после финального (смотрите расписание
этапов для уточнения подробностей). Помимо этого Песочница замораживается на время проведения этапов турнира. По итогам игр в Песочнице
происходит отбор для участия в Раунде 1, в который попадут $1080$ участников с наибольшим рейтингом на момент начала этого этапа турнира
(при равенстве рейтинга приоритет отдаётся игроку, раньше отправившему последнюю версию своей стратегии), а также дополнительный набор в
следующие этапы турнира, включая Финал.
Этапы турнира:
\begin{itemize}
\item В \textbf{Раунде 1} вам предстоит изучить правила игры и освоить управление большим количеством юнитов. В начале игры вам даётся
$500$ единиц техники. Вашему оппоненту даётся такое же количество техники. Задача --- уничтожить! Всё просто. Раунд 1, как и все
последующие этапы, состоит из двух частей, между которыми будет небольшой перерыв (с возобновлением работы Песочницы), который
позволит улучшить свою стратегию. Для игр в каждой части выбирается последняя стратегия, отправленная игроком до начала этой части.
Игры проводятся волнами. В каждой волне каждый игрок участвует ровно в одной игре. Количество волн в каждой части определяется
возможностями тестирующей системы, но гарантируется, что оно не будет меньше десяти. $300$ участников с наиболее высоким рейтингом
пройдут в Раунд 2. Также в Раунд 2 будет проведён дополнительный набор $60$ участников с наибольшим рейтингом в Песочнице (на момент
начала Раунда 2) из числа тех, кто не прошёл по итогам Раунда 1.
\item В \textbf{Раунде 2} вам предстоит улучшить свои навыки управления большим количеством юнитов. Также на карте появляются сооружения,
которые ваша стратегия может захватывать, получая тем самым игровое преимущество над оппонентом. Дополнительно усложняет задачу то,
что после подведения итогов Раунда 1 часть слабых стратегий будет отсеяна и вам придётся противостоять более сильным соперникам. По
итогам Раунда 2 лучшие $50$ стратегий попадут в Финал. Также в Финал будет проведен дополнительный набор $10$ участников с
наибольшим рейтингом в Песочнице (на момент начала Финала) из числа тех, кто не прошёл в рамках основного турнира.
\item \textbf{Финал} является самым серьёзным этапом. После отбора, проведённого по итогам двух первых этапов, останутся сильнейшие. Также
в Финале вводится туман войны, ограничивающий видимость техники оппонента. Стратегии всегда доступны полные карты местности и
погоды, а также информация обо всех сооружениях на карте. Радиус обзора юнитов достаточно большой. Таким образом, изменение правил
не должно сильно сказаться на локальном тактическом управлении. Однако для получения информации об отдалённых участках карты
стратегии будет необходимо отправлять часть техники в разведку. Система проведения Финала имеет свои особенности. Этап по-прежнему
делится на две части, однако они уже не будут состоять из волн. В каждой части этапа будут проведены игры между всеми парами
участников Финала. Если позволит время и возможности тестирующей системы, операция будет повторена.
\end{itemize}
После окончания Финала все финалисты упорядочиваются по невозрастанию рейтинга. При равенстве рейтингов более высокое место занимает тот
финалист, чья участвовавшая в Финале стратегия была отослана раньше. Призы за Финал распределяются на основании занятого места после этого
упорядочивания.
После окончания Песочницы все её участники, кроме призёров Финала, упорядочиваются по невозрастанию рейтинга. При равенстве рейтингов более
высокое место занимает тот участник, который раньше отослал последнюю версию своей стратегии. Призы за Песочницу распределяются на основании
занятого места после этого упорядочивания.
\section{Описание игрового мира}
Игровой мир является двумерным, а все юниты в нём имеют форму круга. Ось абсцисс в этом мире направлена слева направо, ось ординат ---
сверху вниз, угол $0.0$ совпадает с направлением оси абсцисс, а положительный угол вращения означает вращение по часовой стрелке. Игровая
область ограничена квадратом, левый верхний угол которого имеет координаты ($0.0$, $0.0$), а длина стороны равна $1024.0$. Ни один юнит не
может полностью или частично находиться за пределами игровой области.
В начале каждой игры техника первого игрока находится в левом верхнем углу игровой области, а техника второго игрока --- в правом нижнем.
При этом координаты для стратегии второго игрока передаются в преобразованном виде. Таким образом, стратегия всегда <<думает>>, что начинает
игру в левом верхнем углу карты, а противник находится в правом нижнем. Количество техники у каждого игрока в начале игры кратно $100$.
Техника разбита на группы по $100$ юнитов в каждой. Вся техника в одной такой группе имеет одинаковый тип. Формацией группы является квадрат
$10\times10$. Если в начале игры повернуть игровую область на $180^\circ$ относительно её центра, то позиция каждого юнита второго игрока
совпадёт с позицией юнита первого игрока до поворота. При этом юниты с совпадающей позицией будут иметь одинаковый тип.
Время в игре дискретное и измеряется в <<тиках>>. В начале каждого тика симулятор игры передаёт стратегиям участников данные о состоянии
мира, получает от них управляющие сигналы и обновляет состояние мира в соответствии с этими сигналами и ограничениями мира. Затем происходит
расчёт изменения мира и объектов в нём за этот тик, и процесс повторяется снова с обновлёнными данными. Максимальная длительность любой игры
равна $20000$ тиков, однако игра может быть прекращена досрочно, если все юниты хотя бы одной стратегии были уничтожены либо все стратегии
<<упали>>. Крайне маловероятно, но всё-таки возможно, что все юниты обоих игроков будут уничтожены в один и тот же тик. Тогда дополнительные
баллы получат все участники игры.
<<Упавшая>> стратегия больше не может управлять техникой. Стратегия считается <<упавшей>> в следующих случаях:
\begin{itemize}
\item Процесс, в котором запущена стратегия, непредвиденно завершился, либо произошла ошибка в протоколе взаимодействия между стратегией
и игровым сервером.
\item Стратегия превысила одно (любое) из отведённых ей ограничений по времени. Стратегии на один тик выделяется не более $20$ секунд
реального времени. Но в сумме на всю игру процессу стратегии выделяется
\begin{equation}
20\times\textit{<длительность\_игры\_в\_тиках>}+20000
\end{equation}
миллисекунд реального времени и
\begin{equation}
10\times\textit{<длительность\_игры\_в\_тиках>}+20000
\end{equation}
миллисекунд процессорного времени.\footnote[1]{Несмотря на то, что ограничение реального времени заметно выше ограничения
процессорного времени, запрещено искусственно <<замедлять>> тестирование стратегии командами типа <<\texttt{sleep}>> (равно как и
пытаться замедлить/дестабилизировать тестирующую систему другими способами). В случае выявления подобных злоупотреблений, жюри
оставляет за собой право применить к данному пользователю меры на своё усмотрение, вплоть до дисквалификации из соревнования и
блокировки аккаунта.} В формуле учитывается максимальная длительность игры. Ограничение по времени остаётся прежним, даже если
реальная длительность игры отличается от этого значения. Все ограничения по времени распространяются не только на код участника, но
и на взаимодействие клиента-оболочки стратегии с игровым симулятором.
\item Стратегия превысила ограничение по памяти. В любой момент времени процесс стратегии не должен потреблять более 256 Мб оперативной
памяти.
\end{itemize}
\section{Типы техники}
В мире CodeWars 2017 все юниты являются техникой. Существует $5$ типов техники:
\begin{itemize}
\item \textbf{танк} (\texttt{TANK}): наземный юнит, эффективен против других наземных юнитов;
\item \textbf{БМП} --- боевая машина пехоты (\texttt{IFV}): наземный юнит, эффективен против воздушных юнитов;
\item \textbf{ударный вертолёт} (\texttt{HELICOPTER}): воздушный юнит, эффективен против наземных юнитов;
\item \textbf{истребитель} (\texttt{FIGHTER}): воздушный юнит, эффективен против других воздушных юнитов;
\item \textbf{БРЭМ} --- бронированная ремонтно-эвакуационная машина (\texttt{ARRV}): ремонтирует повреждённую технику.
\end{itemize}
Основными характеристиками техники являются текущее и максимальное значение прочности. При падении прочности до нуля юнит считается
уничтоженным и убирается из игрового мира. Начальное и максимальное значение прочности каждого юнита равно $100$. Все юниты являются кругами
радиуса $2.0$. Интервал между двумя последовательными атаками техники любого типа, кроме БРЭМ, составляет $60$ тиков. БРЭМ не могут
атаковать.
Сравнительные характеристики типов техники приведены в следующей таблице:
\begin{tabular}{| l | l | l | l | l | l |}
\hline
Характеристика \char`\\ Тип техники & Танк & БМП & Вертолёт & Истребитель & БРЭМ \\
\hline
Скорость & $0.3$ & $0.4$ & $0.9$ & $1.2$ & $0.4$ \\
Дальность обзора & $80$ & $80$ & $100$ & $120$ & $60$ \\
Дальность атаки по наземным целям & $20$ & $18$ & $20$ & --- & --- \\
Дальность атаки по воздушным целям & $18$ & $20$ & $18$ & $20$ & --- \\
Урон одной атаки по наземным целям & $100$ & $90$ & $100$ & --- & --- \\
Урон одной атаки по воздушным целям & $60$ & $80$ & $80$ & $100$ & --- \\
Защита от атак наземных целей & $80$ & $60$ & $40$ & $70$ & $50$ \\
Защита от атак воздушных целей & $60$ & $80$ & $40$ & $70$ & $20$ \\
Время производства & $60$ & $60$ & $75$ & $90$ & $60$ \\
\hline
\end{tabular}
В отсутствие тумана войны, дальность обзора не оказывает почти никакого влияния на игру и учитывается только при совершении некоторых
действий. При включенном тумане войны стратегия участника будет получать данные только о тех юнитах противника, которые находятся в пределах
дальности\footnote[2]{Здесь и далее под расстоянием между юнитами подразумевается расстояние между их центрами, если явно не указано
другое.} обзора хотя бы одного юнита этого участника.
Все атакующие юниты автоматически наносят урон, если в пределах дальности их атаки есть хотя бы один юнит противника, а также прошло
достаточно времени с момента последней атаки. При наличии нескольких целей, для атаки выбирается случайная из них. При этом, чем выше
потенциальный урон одной атаки ($<урон>-<защита>$) по конкретной цели, тем с большей вероятностью эта цель будет выбрана. Значение
прочности цели не учитывается. Если потенциальный урон по цели не является положительным числом, считается, что юнит не может атаковать
цель. Урон наносится мгновенно. Также считается, что все юниты, совершающие атаку в один тик, делают это одновременно. Таким образом, дуэль
двух одинаковых юнитов разных игроков закончится уничтожением обоих этих юнитов.
БРЭМ каждый тик автоматически ремонтируют на $0.1$ одного из дружественных юнитов, прочность которых меньше максимальной, а расстояние до
БРЭМ не превышает $10$. При наличии нескольких целей, для ремонта выбирается случайная из них. При этом, чем ниже прочность этой цели, тем с
большей вероятностью она будет выбрана. Значение скорости ремонта меньше единицы, поэтому на протяжении нескольких тиков может казаться, что
прочность техники не восстанавливается, однако это не так. Суммарное восстановление прочности за прошедшие тики накапливается в специальном
пуле. Техника считается уничтоженной, если целочисленная часть её прочности падает до нуля, независимо от значения в пуле.
\section{Типы местности и погоды}
Игровая область мира условно поделена на клетки размером $32.0\times32.0$. В каждой из таких клеток может быть один из трёх типов местности
и один из трёх типов погоды. Тип местности влияет на различные параметры наземной техники; тип погоды, соответственно, --- воздушной. Карты
местности и погоды превращаются сами в себя, если их повернуть относительно центра игровой области на $180^\circ$. Обе карты не изменяются в
процессе игры и всегда доступны стратегии, независимо от наличия тумана войны.
\begin{tabular}{| l | l | l | l |}
\hline
Характеристика \char`\\ Тип местности & Равнина & Топь & Лес \\
\hline
Коэффициент скорости & $1.0$ & $0.6$ & $0.8$ \\
Коэффициент дальности обзора & $1.0$ & $1.0$ & $0.8$ \\
Коэффициент незаметности & $1.0$ & $1.0$ & $0.6$ \\
\hline
\end{tabular}
\begin{tabular}{| l | l | l | l |}
\hline
Характеристика \char`\\ Тип погоды & Ясно & Плотные облака & Сильный дождь \\
\hline
Коэффициент скорости & $1.0$ & $0.8$ & $0.6$ \\
Коэффициент дальности обзора & $1.0$ & $0.8$ & $0.6$ \\
Коэффициент незаметности & $1.0$ & $0.8$ & $0.6$ \\
\hline
\end{tabular}
Если с коэффициентами скорости и дальности обзора всё очевидно, то коэффициент незаметности техники влияет на дальность обзора любого юнита
противника при проверке видимости этой техники. Таким образом, юнит видит цель, если и только если расстояние до цели меньше или равно
\begin{equation}
\begin{split}
\textit{<дальность\_обзора\_юнита>}\times\textit{<коэффициент\_дальности\_обзора\_юнита>} \\ \times\textit{<коэффициент\_незаметности\_цели>}
\end{split}
\end{equation}
При отключенном тумане войны значение имеют только коэффициенты скорости и дальности обзора; при этом коэффициент дальности обзора
учитывается только при совершении некоторых действий.
\section{Сооружения}
Сооружения появляются в Раунде 2 турнира и представляют собой квадратные области на карте. Длина стороны каждого такого квадрата равна
$64.0$, а его левый верхний угол совпадает с левым верхним углом одной из клеток карты местности/погоды. Расположение сооружений симметрично
для обоих игроков. Всего на карте может быть до $8$ пар сооружений (являющихся отражениями друг друга). Стратегия получает информацию обо
всех сооружениях, независимо от наличия тумана войны.
В начале игры все сооружения являются нейтральными. Стратегии могут захватывать сооружения, перемещая наземную технику в область сооружения.
Каждый юнит в области сооружения вырабатывает $0.005$ единицы захвата этого сооружения за игровой тик. При накоплении $100.0$ единиц захвата
процесс прекращается, а сооружение переходит под контроль стратегии. Если ваш оппонент полностью или частично захватил сооружение, сперва
необходимо обнулить его уровень захвата. Обнуление захвата оппонента происходит таким же образом и с такой же скоростью, как и собственно
сам захват. Если оппонент уже контролирует сооружение, то он будет сохранять контроль над ним до тех пор, пока его уровень захвата не упадёт
до нуля.
Типы сооружений:
\begin{itemize}
\item центр управления (\texttt{CONTROL\_CENTER}): увеличивает лимит количества действий стратегии на $3$ за $60$ тиков, а также
уменьшает интервал между тактическими ядерными ударами на $60$ тиков;
\item завод (\texttt{FACTORY}): автоматически производит технику, тип производимой техники определяется стратегией, скорость
производства зависит от типа техники.
\end{itemize}
Новая техника стратегии появляется на заводе рядами слева направо, сверху вниз. Техника оппонента --- также рядами, но справа налево, снизу
вверх. Расстояние между центрами двух соседних юнитов, произведённых на заводе, равно $6.0$. Если следующая по очереди позиция юнита занята,
тогда она будет пропущена и так далее, пока не будет найдена свободная позиция. Если все позиции для производства юнитов заняты, завод
приостановит производство новой техники.
\section{Управление}
В начале каждого тика симулятор игры отправляет стратегии сведения о текущем состоянии видимой части мира. В ответ стратегия отправляет
набор инструкций (инкапсулированных в объекте класса \texttt{Move}) для управления техникой или просто пропускает ход, не устанавливая поле
\texttt{move.action} или инициализируя его значением \texttt{NONE}. Изначально количество возможных действий стратегии ограничено $12$-ю
ходами за $60$ тиков. Это значение может быть увеличено при захвате стратегией одного или нескольких центров управления. Действие стратегии
будет проигнорировано игровым симулятором, если за последние $60 - 1$ тиков она уже совершила максимально доступное ей количество действий.
Инструкции стратегии обрабатываются в следующем порядке:
\begin{itemize}
\item Сперва происходит изменение мира в соответствии с пожеланиями стратегии: выполняются все действия по выделению юнитов, назначению
юнитам групп, настраивается производство техники на заводе и т.д. Также обновляются приказы юнитов.
\item Затем все юниты упорядочиваются случайным образом, и происходит их перемещение в соответствии с полученными или уже имеющимися
приказами, а также с ограничением максимальной скорости этих юнитов с учётом типа местности или погоды. В мире CodeWars 2017 нет
инерции, а перемещение происходит мгновенно или вообще не происходит. Перемещение техники осуществляется последовательно, согласно
выбранному порядку. При этом частичное перемещение техники не применяется. Если позицию техники невозможно изменить на полную
величину вычисленного игровым симулятором перемещения\footnotemark[3], то её перемещение откладывается. После окончания перебора
игровой симулятор снова итерируется по всем юнитам и пытается переместить тех, чья позиция в данный тик ещё не изменялась. Так
происходит до тех пор, пока не будут перемещены все юниты. Если на очередной итерации не было перемещено ни одного юнита, то
операция также прерывается.
\item Затем все юниты, не находящиеся на перезарядке, одновременно совершают атакующие действия, а БРЭМ производят ремонт.
\item В последнюю очередь изменяется уровень захвата сооружений и производится новая техника.
\end{itemize}
\footnotetext[3]{Техника после перемещения частично или полностью находится за пределами карты либо пересекается с какой-либо другой
техникой, такой, что столкновение этих двух юнитов запрещено правилами игры.}
Как уже было упомянуто, управление в CodeWars схоже с управлением в обычных компьютерных играх жанра RTS, хотя и не претендует на полное
соответствие. Стратегии доступны следующие действия:
\begin{itemize}
\item \texttt{CLEAR\_AND\_SELECT}. Стандартное выделение дружественных юнитов рамкой либо выделение ранее созданной группы юнитов. В
первом случае необходимо дополнительно задать границы рамки (\texttt{move.left}, \texttt{move.top}, \texttt{move.right} и
\texttt{move.bottom}), также опционально можно установить тип техники (\texttt{move.vehicleType}), во втором --- номер группы (от
$1$ до $100$). Если задан номер группы, то все остальные параметры объекта \texttt{move} будут проигнорированы.
\item \texttt{ADD\_TO\_SELECTION}. Аналогично действию \texttt{CLEAR\_AND\_SELECT} с тем исключением, что существующее выделение юнитов
не будет сброшено.
\item \texttt{DESELECT}. Снимает выделение с юнитов, соответствующих указанным параметрам. Настройка действия не отличается от
приведённых выше двух типов действий.
\item \texttt{ASSIGN}. Устанавливает для всех выделенных юнитов принадлежность к группе. Необходимо дополнительно установить номер
группы. При этом юниты, добавленные в группу ранее, остаются в ней. Юнит может находиться одновременно в нескольких группах.
\item \texttt{DISMISS}. Убирает у всех выделенных юнитов принадлежность к группе. Необходимо дополнительно установить номер группы.
\item \texttt{DISBAND}. Убирает всех юнитов из указанной группы.
\item \texttt{MOVE}. Приказывает выделенным юнитам перемещаться в указанном направлении. Параметры \texttt{move.x} и \texttt{move.y}
задают вектор движения. Таким образом, юниты перемещаются, сохраняя формацию. Дополнительно можно ограничить максимальную скорость
перемещения, чтобы медленные юниты не отставали от более быстрых.
\item \texttt{ROTATE}. Приказывает выделенным юнитам поворачиваться относительно указанной точки. Параметры \texttt{move.x} и
\texttt{move.y} задают эту точку, а \texttt{move.angle} --- угол поворота. Юниты двигаются по окружности. Таким образом,
расстояние от юнита до указанной точки не изменяется в процессе движения. Дополнительно можно ограничить максимальную линейную или
максимальную угловую скорость перемещения, чтобы формация поворачивалась синхронно, а медленные юниты не отставали от более
быстрых.
\item \texttt{SCALE}. Масштабирует формацию выделенных юнитов относительно указанной точки с указанным коэффициентом. Параметры
\texttt{move.x} и \texttt{move.y} задают эту точку, а \texttt{move.factor} --- коэффициент от $0.1$ до $10.0$. При значениях
коэффициента больше $1.0$ происходит расширение формации, при значениях меньше $1.0$ --- сжатие. Чтобы определить позицию юнита в
конце движения, необходимо построить вектор из указанной точки в позицию юнита до начала движения, умножить обе координаты этого
вектора на коэффициент и отложить полученный вектор от указанной в приказе точки. Все юниты будут линейно перемещаться каждый к
своей цели. Дополнительно можно ограничить максимальную скорость перемещения.
\item \texttt{SETUP\_VEHICLE\_PRODUCTION}. Настраивает производство техники на захваченном заводе. Необходимо дополнительно указать тип
техники и идентификатор завода. При этом прогресс производства будет сброшен, даже если указанный тип техники равен типу техники,
производящейся на заводе в данный момент.
\item \texttt{TACTICAL\_NUCLEAR\_STRIKE}. Запрашивает нанесение тактического ядерного удара по указанным координатам. Необходимо
дополнительно указать идентификатор дружественной техники, которая будет осуществлять подсветку цели. Удар можно запрашивать не
чаще, чем раз в $1200$ тиков. Этот интервал немного уменьшается за каждый захваченный центр управления. Нанесение удара происходит
не мгновенно, а через $30$ тиков после запроса. Для осуществления подсветки цель удара должна находиться в зоне видимости
указанного юнита, как в момент запроса, так и все последующие тики до нанесения удара. Если юнит, подсвечивающий цель, погибает
либо цель выходит из зоны видимости юнита хотя бы на один тик, нанесение удара отменяется. Удар поражает все цели на расстоянии,
не превышающем $50.0$, как вражеские, так и союзные. При этом урон в центре взрыва составляет $99$ единиц и равномерно падает до
нуля на краю. Юнит может подсвечивать цель, если и только если расстояние до цели меньше или равно
\begin{equation}
\begin{split}
\textit{<дальность\_обзора\_юнита>}\times\textit{<коэффициент\_дальности\_обзора\_юнита>}
\end{split}
\end{equation}
\end{itemize}
\section{Столкновения юнитов}
Коллизия наземных юнитов между собой, а также с границами карты не допускается игровым симулятором. Коллизия воздушных юнитов между собой, а
также с границами карты не допускается игровым симулятором. Исключение составляют воздушные юниты, принадлежащие разным игрокам.
\section{Начисление баллов}
Баллы начисляются за следующие дествия:
\begin{itemize}
\item За уничтожение юнита противника даётся $1$ балл.
\item Захват сооружения приносит стратегии $100$ баллов.
\item При уничтожении всех юнитов оппонента стратегия получает $1000$ баллов. Игра при этом завершается.
\item Каждые $1000$ тиков, начиная с $10000$ и не включая последний тик, стратегия затрачивает $1$ балл на содержание каждых $25$
юнитов, находящихся под контролем этой стратегии, но суммарно не менее $20$ баллов за один платёж. Количество баллов не может
упасть ниже нуля.
\end{itemize}
\chapter{Создание стратегии}
\section{Техническая часть}
Сперва для создания стратегии вам необходимо выбрать один из ряда поддерживаемых языков программирования\footnote[4]{Для всех языков
программирования используются 32-битные версии компиляторов/интерпретаторов.}: Java (Oracle JDK 8), C\# (Roslyn 1.3+), C++14 (GNU MinGW C++
6.2+), Python 2 (Python 2.7+), Python 3 (Python 3.5+), Pascal (Free Pascal 3.0+), Ruby (JRuby 9.1+, Oracle JDK 8). Возможно, этот набор
будет расширен. На сайте проекта вы можете скачать пользовательский пакет для каждого из языков. Модифицировать в пакете разрешено лишь один
файл, который и предназначен для содержания вашей стратегии, например, MyStrategy.java (для Java) или MyStrategy.py (для
Python)\footnote[5]{Исключение составляет C++, для которого можно модифицировать два файла: MyStrategy.cpp и MyStrategy.h. Причём, наличие
в архиве файла MyStrategy.cpp является обязательным (иначе стратегия не скомпилируется), а наличие файла MyStrategy.h --- опциональным. В
случае его отсутствия будет использован стандартный файл из пакета.}. Все остальные файлы пакета при сборке стратегии будут замещены
стандартными версиями. Однако вы можете добавлять в стратегию свои файлы с кодом. Эти файлы должны находиться в том же каталоге, что и
основной файл стратегии. При отправке решения все они должны быть помещены в один ZIP-архив (файлы должны находиться в корне архива). Если
вы не добавляете новых файлов в пакет, достаточно отправить сам файл стратегии (с помощью диалога выбора файла) или же вставить его код в
текстовое поле.
После того, как вы отправили свою стратегию, она попадает в очередь тестирования. Система сперва попытается скомпилировать пакет с вашими
файлами, а затем, если операция прошла успешно, создаст несколько коротких (по $200$ тиков) игр разных форматов\footnote[6]{Основными
параметрами формата игры являются количество игроков, участвующих в нём, и количество юнитов, находящихся под управлением каждого игрока.
Кратко формат записывается в виде $\texttt{<количество\_игроков>}~\times~\texttt{<количество\_юнитов>}$, например запись $4\times3$ означает
формат игры, в котором участвует $4$ игрока, управляющих тремя юнитами каждый. В чемпионатах, все игры которых всегда проходят в формате
дуэлей, может использоваться альтернативная форма записи, например, $1$ игрок на $1$ игрока ($2\times~\texttt{N}$ в каноническом виде), $1$
юнит на $1$ юнита ($2\times1$) или $3$ юнита на $3$ юнита ($2\times3$). Слова <<игрок>> и <<юнит>> в записи формата могут заменяться
соответствующими иконками или вообще убираться, если из контекста понятно, о чём идёт речь. К формату игры может быть добавлено пояснение в
случае, если краткая запись формата для разных этапов чемпионата совпадает.}: $1$ на $1$, $1$ на $1$ с добавлением сооружений и $1$ на $1$ с
добавлением сооружений и тумана войны. Для управления техникой каждого из участников этих игр будет запущен отдельный клиентский процесс с
вашей стратегией, и для того, чтобы стратегия считалась принятой (корректной), ни один из экземпляров стратегии не должен <<упасть>>.
Игрокам в этих тестовых играх будут даны имена в формате \texttt{<имя\_игрока>}, \texttt{<имя\_игрока> (2)}, \texttt{<имя\_игрока> (3)} и
т.д.
После успешного прохождения описанного процесса ваша посылка получает статус <<Принята>>. Первая успешная посылка одновременно означает и
вашу регистрацию в Песочнице. Вам начисляется стартовый рейтинг ($1200$), и ваша стратегия начинает участвовать в периодических
квалификационных играх (смотрите описание Песочницы для получения более подробной информации). Также вам становится доступна функция
создания собственных игр, в которых в качестве соперника можно выбирать любую стратегию любого игрока (в том числе и вашу собственную),
созданную до момента вашей последней успешной посылки. Созданные вами игры не влияют на рейтинг.
В системе присутствуют ограничения на количество посылок и пользовательских игр, а именно:
\vspace{-0.15in}
\begin{itemize}
\item В течение двадцати минут нельзя отослать стратегию более трёх раз. Суммарный размер (без сжатия) стратегий, отправленных за двадцать
минут, не может быть больше 3 Мб. Ограничение на размер одной посылки составляет 2 Мб.
\vspace{-0.10in}
\item В течение двадцати минут нельзя создать более трёх пользовательских игр. После завершения каждого основного этапа соревнования это
число автоматически увеличивается на единицу.
\vspace{-0.10in}
\end{itemize}
Для упрощения отладки небольших изменений стратегии в системе присутствует возможность сделать тестовую посылку (флажок <<Тестовая посылка>>
на форме отправки стратегии). Тестовая посылка не отображается другим пользователям, не участвует в квалификационных играх в Песочнице и
играх в этапах турнира, также невозможно собственноручно создавать игры с её участием. Однако, после принятия данной посылки, система
автоматически добавляет тестовую игру с двумя участниками (формат $1$ на $1$): непосредственно тестовой посылкой и стратегией из раздела
<<Быстрый старт>>. Тестовая игра видна только участнику, сделавшему данную тестовую посылку. Базовая длительность такой тестовой игры
составляет $2000$ тиков. На частоту тестовых посылок действует то же ограничение, что и на частоту обычных посылок. Тестовые игры на частоту
создания игр пользователем не влияют.
У игроков есть возможность в специальном визуализаторе просматривать прошедшие игры. Для этого нужно нажать кнопку <<Смотреть>> в списке игр
либо нажать кнопку <<Посмотреть игру>> на странице игры.
Если вы смотрите игру с участием вашей стратегии и заметили некоторую странность в её поведении, или ваша стратегия делает не то, что вы от
неё ожидали, то вы можете воспользоваться специальной утилитой Repeater для воспроизведения локального повтора данной игры. Локальный повтор
игры --- это возможность запустить стратегию на вашем компьютере так, чтобы она видела игровой мир вокруг себя таким, каким он был при
тестировании на сервере. Это поможет вам выполнять отладку, добавлять логирование и наблюдать за реакцией вашей стратегии в каждый момент
игры. Для этого скачайте Repeater с сайта CodeWars 2017 (раздел <<Документация>> $\rightarrow$ <<Утилита Repeater>>) и разархивируйте.
Для запуска Repeater вам необходимо установленное ПО Java $8+$ Runtime Environment. Обратите внимание, что любое взаимодействие вашей
стратегии с игровым миром при локальном повторе полностью игнорируется. Это означает, что в каждый момент времени окружающий мир для
стратегии в точности совпадает с миром, каким он был в игре при тестировании на сервере и не зависит от того, какие действия ваша стратегия
предпринимает. Утилита Repeater располагает только теми данными, которые отправлялись вашей стратегии, но не полной записью игры. Поэтому
визуализация игры не осуществляется. Подробнее об утилите Repeater читайте в соответствующем разделе на сайте.
Помимо всего выше перечисленного у игроков есть возможность запускать простые тестовые игры локально на своём компьютере. Для этого
необходимо загрузить архив с утилитой Local runner из раздела сайта <<Документация>> $\rightarrow$ <<Local runner>>. Использование данной
утилиты позволит вам тестировать свою стратегию в условиях, аналогичных условиям тестовой игры на сайте, но без каких либо ограничений по
количеству создаваемых игр. Рендерер для локальных игр заметно отличается от рендерера на сайте. Все игровые объекты в нём отображаются
схематично (без использования красочных моделей). Создать локальную тестовую игру очень просто: запустите Local runner с помощью
соответствующего скрипта запуска (*.bat для Windows или *.sh для *n*x систем), затем запустите свою стратегию из среды разработки (или любым
другим удобным вам способом) и смотрите игру. Во время локальных игр вы можете выполнять отладку своей стратегии, ставить точки останова.
Однако следует помнить, что Local runner ожидает отклика от стратегии не более $30$ минут. По прошествии этого времени он посчитает
стратегию <<упавшей>> и продолжит работу без неё.
\section{Управление техникой}
Для вашего игрока в начале игры создаётся объект класса \texttt{MyStrategy}, в полях которого стратегия может сохранять информацию о ходе
игры. Управление техникой осуществляется с помощью метода \texttt{move} стратегии, который вызывается один раз за тик. Методу передаются
следующие параметры:
\begin{itemize}
\item ваш игрок \texttt{me};
\item текущее состояние мира \texttt{world};
\item набор игровых констант \texttt{game};
\item объект \texttt{move}, устанавливая свойства которого, стратегия и управляет техникой.
\end{itemize}
Реализация клиента-оболочки стратегии на разных языках может отличаться, однако в общем случае \textbf{не} гарантируется, что при разных
вызовах метода \texttt{move} в качестве параметров ему будут переданы ссылки на одни и те же объекты. Таким образом, нельзя, например,
сохранить ссылки на объекты \texttt{world} или \texttt{vehicle} и получать в следующие тики обновлённую информацию об этих объектах, считывая
их поля.
\newpage
\section{Примеры реализации}
Далее для всех языков программирования приведены простейшие примеры стратегий, которые сперва выделяют всю вашу технику, а затем отправляют
её на сближение с противником. Полную документацию по классам и методам для языка Java можно найти в следующих главах.
\subsection{Пример для Java}
\begin{verbatim}
import model.*;
public final class MyStrategy implements Strategy {
@Override
public void move(Player me, World world, Game game, Move move) {
if (world.getTickIndex() == 0) {
move.setAction(ActionType.CLEAR_AND_SELECT);
move.setRight(world.getWidth());
move.setBottom(world.getHeight());
return;
}
if (world.getTickIndex() == 1) {
move.setAction(ActionType.MOVE);
move.setX(world.getWidth() / 2.0D);
move.setY(world.getHeight() / 2.0D);
}
}
}
\end{verbatim}
\subsection{Пример для C\#}
\begin{verbatim}
using Com.CodeGame.CodeWars2017.DevKit.CSharpCgdk.Model;
namespace Com.CodeGame.CodeWars2017.DevKit.CSharpCgdk {
public sealed class MyStrategy : IStrategy {
public void Move(Player me, World world, Game game, Move move) {
if (world.TickIndex == 0) {
move.Action = ActionType.ClearAndSelect;
move.Right = world.Width;
move.Bottom = world.Height;
return;
}
if (world.TickIndex == 1) {
move.Action = ActionType.Move;
move.X = world.Width / 2.0D;
move.Y = world.Height / 2.0D;
}
}
}
}
\end{verbatim}
\newpage
\subsection{Пример для C++}
\begin{verbatim}
#include "MyStrategy.h"
#define PI 3.14159265358979323846
#define _USE_MATH_DEFINES
#include <cmath>
#include <cstdlib>
using namespace model;
using namespace std;
void MyStrategy::move(const Player& me, const World& world, const Game& game, Move& move) {
if (world.getTickIndex() == 0) {
move.setAction(ActionType::CLEAR_AND_SELECT);
move.setRight(world.getWidth());
move.setBottom(world.getHeight());
return;
}
if (world.getTickIndex() == 1) {
move.setAction(ActionType::MOVE);
move.setX(world.getWidth() / 2.0);
move.setY(world.getHeight() / 2.0);
}
}
MyStrategy::MyStrategy() { }
\end{verbatim}
\newpage
\subsection{Пример для Python 2}
\begin{verbatim}
from model.ActionType import ActionType
from model.Game import Game
from model.Move import Move
from model.Player import Player
from model.World import World
class MyStrategy:
def move(self, me, world, game, move):
"""
@type me: Player
@type world: World
@type game: Game
@type move: Move
"""
if world.tick_index == 0:
move.action = ActionType.CLEAR_AND_SELECT
move.right = world.width
move.bottom = world.height
if world.tick_index == 1:
move.action = ActionType.MOVE
move.x = world.width / 2.0
move.y = world.height / 2.0
\end{verbatim}
\subsection{Пример для Python 3}
\begin{verbatim}
from model.ActionType import ActionType
from model.Game import Game
from model.Move import Move
from model.Player import Player
from model.World import World
class MyStrategy:
def move(self, me: Player, world: World, game: Game, move: Move):
if world.tick_index == 0:
move.action = ActionType.CLEAR_AND_SELECT
move.right = world.width
move.bottom = world.height
if world.tick_index == 1:
move.action = ActionType.MOVE
move.x = world.width / 2.0
move.y = world.height / 2.0
\end{verbatim}
\newpage
\subsection{Пример для Pascal}
\begin{verbatim}
unit MyStrategy;
interface
uses
StrategyControl, TypeControl, ActionTypeControl, CircularUnitControl, FacilityControl,
FacilityTypeControl, GameControl, MoveControl, PlayerContextControl, PlayerControl,
TerrainTypeControl, UnitControl, VehicleControl, VehicleTypeControl, VehicleUpdateControl,
WeatherTypeControl, WorldControl;
type
TMyStrategy = class (TStrategy)
public
procedure Move(me: TPlayer; world: TWorld; game: TGame; move: TMove); override;
end;
implementation
uses
Math;
procedure TMyStrategy.Move(me: TPlayer; world: TWorld; game: TGame; move: TMove);
begin
if world.TickIndex = 0 then begin
move.Action := ACTION_CLEAR_AND_SELECT;
move.Right := world.Width;
move.Bottom := world.Height;
exit;
end;
if world.TickIndex = 1 then begin
move.Action := ACTION_MOVE;
move.X := world.Width / 2.0;
move.Y := world.Height / 2.0;
end;
end;
end.
\end{verbatim}
\newpage
\subsection{Пример для Ruby}
\begin{verbatim}
require './model/game'
require './model/move'
require './model/player'
require './model/world'
class MyStrategy
# @param [Player] me
# @param [World] world
# @param [Game] game
# @param [Move] move
def move(me, world, game, move)
if world.tick_index == 0
move.action = ActionType::CLEAR_AND_SELECT
move.right = world.width
move.bottom = world.height
end
if world.tick_index == 1
move.action = ActionType::MOVE
move.x = world.width / 2.0
move.y = world.height / 2.0
end
end
end
\end{verbatim}