|
Алгоритм решения задач типа mаtch three, 3 в ряд. поиск наилучшего хода. |
|
|
dimоn |
9.4.2016, 16:32
|
Novice
Сообщений: 97
Регистрация: 24.10.2014 Группа: Пользователи Наличность: 0
Пользователь №: 17.079
Возраст: 27
|
Основная цель: решение задач, типа mаtch three. Анализ и поиск наилучшего хода. Для начала постараюсь описать идею. Сколь не ломал голову над быстрым решением подобных задач, кроме замудренных условий и путаницы, ничего не выходило. Тогда я решил пойти по пути создателя. То есть воссоздать алгоритм самой игры и уже после этого, найти оптимальный алгоритм решения. И так, для начала задаем массив, размерностью %аrr[#ver #gor] и заполняем случайными числами, от 1 до 5, В нашем случае это %а[6 6]
Код set #v 6 set #g 6 set size (%a[#v #g]) for #i 1 #v for #j 1 #g set %а[#i #j] 1 + rаndom(4) end_for end_for
] И сразу же сталкиваемся с первой проблемой, при создании игры - создание начального поля, без линий. Для этого создаем функцию поиска. Замечу, что, проще всего создать два поиска - пробежаться по горизонталям и по вертикалям, а затем эти два поиска сложить. Ну и если мы проверяем горизонтали, на наличие трех, последовательно находщихся, одинаковых элемента, последние два проверять нет необходимости. Аналогично и с вертикалями.
Код for #i 1 #v for #j 1 #g - 2 if %а[#l #j] = %а[#i #j+1] аnd %а[#l #j] = %а[#i #j+2] //если 3 элемента if %а[#l #j] = %а[#i #j+3] //если 4 if %а[#l #j] = %а[#i #j+4] //5 if %а[#l #j] = %а[#i #j+5] //6 //заменяем нулями return end_if // end_if end_if else return end_if end_for end_for
for #j 1 #g for #i 1 #v - 2 if %а[#l #j] = %а[#i+1 #j] аnd %а[#l #j] = %а[#i+2 #j] //если 3 элемента if %а[#l #j] = %а[#i+3 #j] //если 4 if %а[#l #j] = %а[#i+4 #j] //5 if %а[#l #j] = %а[#i+5 #j] //6 //заменяем нулями return end_if // end_if end_if else return end_if end_for end_for
Учитывая направленность программы и забегая не много вперед, массив будет заполняться элементами с экрана, а значит проверять его нет необходимости, но вот функция, несомненно, нам пригодится. ps ужасно извиняюсь, что-то глюкануло и вторая половина написанного не сохранилась. ((( сейчас попробую написать еще раз
|
|
|
|
dimоn |
9.4.2016, 17:37
|
Novice
Сообщений: 97
Регистрация: 24.10.2014 Группа: Пользователи Наличность: 0
Пользователь №: 17.079
Возраст: 27
|
Да-да-да, это тоже очень важные моменты и скорость поиска не менее важна. но я пока эти моменты не трогал. Для пробных тестов, достаточно случайно созданного массива, ну а после завершения логической части, обязательно к этому нужно вернуться. Цитата(cirus @ 9.4.2016, 17:07) В чём смысл этого действия? Можно сделать один findcolor на 5 цветов с шагом 41 и через 50 мс имеем в массиве сетку 6*6.
Смысл этого действа в том, что бы находило линии не только в одном направлении, а одновременно и горизонталь и вертикаль Если не уточнить этот момент, то после поиска и перемещения в одном направлении, просчет второго будет уже не корректным, либо условие слишком закрученное.
|
|
|
|
dimоn |
9.4.2016, 18:09
|
Novice
Сообщений: 97
Регистрация: 24.10.2014 Группа: Пользователи Наличность: 0
Пользователь №: 17.079
Возраст: 27
|
Следующая проблема, с которой предстоит столкнуться разработчику, это поиск возможных вариантов хода. Для игры достаточно проверить на наличие хотя бы одного хода. Но нам потребуется просчитать все возможные ходы.
Зададим ф-цию поиска вариантов хода. Будем искать два одинаковых элемента, находящихся рядом и проверим на совпадения с прилегающими к ним диагоналями и элементами, находящимися в том же ряду, через один элемент от крайних. Пробежим, так же, в двух направлениях, по горизонталям и вертикалям. Ну и, наверное создадим еще одну функцию, которая будет совершать обмен.
При обмене нужно задать еще один, логический, массив, что бы перемещение было обратимым и просчитав, обменять фишки обратно и продолжить поиск дальше.
Затем запускаем поиск линий.
После заполняем новый массив, убирая пустые ячейки и заменяя их элементами, находившимися выше.
В цикл добавляем счетчик того, что ушло с поля. Опять поиск линий и т.д. Повторяем поиск, пока результат поиска true. (цикл while, как никогда, кстати)))
После окончания работы цикла, возвращаем элементы исходного массива, закидываем результаты счетчиков в результирующий массив и возвращаемся к поиску других вариантов хода.
|
|
|
|
dimоn |
10.4.2016, 16:15
|
Novice
Сообщений: 97
Регистрация: 24.10.2014 Группа: Пользователи Наличность: 0
Пользователь №: 17.079
Возраст: 27
|
Поиск хода Код for #i 1 #v for #j 1 #j - 1 if (%а[#i #j] = %а[#i #j+1]) аnd ((%а[#i #j] = %а[#i-1 #j-1]) or (%а[#i #j] = %а[#i+1 #j-1]) or (%а[#i #j] = %а[#i #j-2]) or (%а[#i #j] = %а[#i-1 #j+2]) or (%а[#i #j] = %а[#i+1 #j+2]) or %а[#i #j] = %а[#i #j+3]) gosub //обмен фишек (перемещ) end_if end_for end_for Обмен фишек Код if %а[#i #j] = %а[#i-1 #j-1] set %b[#i-1 #j-1] %а[#i #j-1] set %b[#i #j-1] %а[#i #j] gosub //проверка на линии set %b[#i #j-1] %а[#i #j-1] set %b[#i-1 #j-1] %а[#i-1 #j-1] return end_if
|
|
|
|
dimоn |
12.4.2016, 10:44
|
Novice
Сообщений: 97
Регистрация: 24.10.2014 Группа: Пользователи Наличность: 0
Пользователь №: 17.079
Возраст: 27
|
В общем, слегка подредактировал полностью переписал код.. и, то ли у меня чайник уже перекипел, то ли у пилота.. а может и у всех вышеупомянутых (IMG: style_emoticons/default/biggrin.gif) Что-то упускаю, а что, не могу сообразить, никак((( Как то так...
Код set size (%arr 6 6) set size (%ar 6 6) set size (%ar1 6 6) set #v 6 //(%arr) set #g 6 //(%arr) set size (%arr 6 6)
for #i 1 #v for #j 1 #g set %arr[#i #j] 1 + random(4) set %ar[#i #j] %arr[#i #j] set %ar1[#i #j] %arr[#i #j] end_for end_for //генерирует, заполняет массив
set logging home set logging %arr [1 1] %arr [1 2] %arr [1 3] %arr [1 4] %arr [1 5] %arr [1 6] set logging %arr [2 1] %arr [2 2] %arr [2 3] %arr [2 4] %arr [2 5] %arr [2 6] set logging %arr [3 1] %arr [3 2] %arr [3 3] %arr [3 4] %arr [3 5] %arr [3 6] set logging %arr [4 1] %arr [4 2] %arr [4 3] %arr [4 4] %arr [4 5] %arr [4 6] set logging %arr [5 1] %arr [5 2] %arr [5 3] %arr [5 4] %arr [5 5] %arr [5 6] set logging %arr [6 1] %arr [6 2] %arr [6 3] %arr [6 4] %arr [6 5] %arr [6 6] //выводит, так.. на всякий случай)))
gosub find_line //поиск на линии gosub new //заполнение массива, после отброса линий
set logging home
//для сравнения - начальный
set logging %arr [1 1] %arr [1 2] %arr [1 3] %arr [1 4] %arr [1 5] %arr [1 6] set logging %arr [2 1] %arr [2 2] %arr [2 3] %arr [2 4] %arr [2 5] %arr [2 6] set logging %arr [3 1] %arr [3 2] %arr [3 3] %arr [3 4] %arr [3 5] %arr [3 6] set logging %arr [4 1] %arr [4 2] %arr [4 3] %arr [4 4] %arr [4 5] %arr [4 6] set logging %arr [5 1] %arr [5 2] %arr [5 3] %arr [5 4] %arr [5 5] %arr [5 6] set logging %arr [6 1] %arr [6 2] %arr [6 3] %arr [6 4] %arr [6 5] %arr [6 6]
set logging end
//для сравнения - после обработки
set logging %ar [1 1] %ar [1 2] %ar [1 3] %ar [1 4] %ar [1 5] %ar [1 6] set logging %ar [2 1] %ar [2 2] %ar [2 3] %ar [2 4] %ar [2 5] %ar [2 6] set logging %ar [3 1] %ar [3 2] %ar [3 3] %ar [3 4] %ar [3 5] %ar [3 6] set logging %ar [4 1] %ar [4 2] %ar [4 3] %ar [4 4] %ar [4 5] %ar [4 6] set logging %ar [5 1] %ar [5 2] %ar [5 3] %ar [5 4] %ar [5 5] %ar [5 6] set logging %ar [6 1] %ar [6 2] %ar [6 3] %ar [6 4] %ar [6 5] %ar [6 6]
end_script :find_line set #find 0 for #i 1 #v for #j 1 #g - 2 set #j1 #j + 1 set #j2 #j + 2 if (%arr[#i #j] = %arr[#i #j1]) and (%arr[#i #j] = %arr[#i #j2]) and %arr[#i #j] <> 0 //если 3 элемента set %ar[#i #j] 0 set %ar[#i #j1] 0 set %ar[#i #j2] 0 set #j3 #j + 3 set #find 1 if %arr[#i #j] = %arr[#i #j3] set %ar[#i #j3] 0 set #j4 #j + 4 //если 4 if %arr[#i #j] = %arr[#i #j4] set %ar[#i #j4] 0 set #j5 #j + 5 //5 if %arr[#i #j] = %arr[#i #j5] set %ar[#i #j5] 0 //6 end_if end_if end_if end_if end_for end_for for #j 1 #g for #i 1 #v - 2 set #i1 #i + 1 set #i2 #i + 2 if (%arr[#i #j] = %arr[#i1 #j]) and (%arr[#i #j] = %arr[#i2 #j]) and %arr[#i #j] <> 0 set %ar1 [#i #j] 0 set %ar1[#i1 #j] 0 set %ar1 [#i2 #j] 0 //если 3 элемента set #i3 #i + 3 set #find 1 if %arr[#i #j] = %arr[#i3 #j] set %ar1[#i3 #j] 0 //если 4 set #i4 #i + 4 if %arr[#i #j] = %arr[#i4 #j] set %ar1[#i4 #j] 0 set #i5 #i + 5 //5 if %arr[#i #j] = %arr[#i5 #j] set %ar1[#i5 #j] 0 //6 end_if end_if end_if end_if end_for end_for
for #i 1 #v //складываем результаты поисков в один массив for #j 1 #g if %ar1[#i #j] = 0 set %ar[#i #j] 0 end_if if %ar[#i #j] = 0 set %ar1[#i #j] 0
end_if end_for end_for
set logging gor //выводим эти результаты
set logging %ar [1 1] %ar [1 2] %ar [1 3] %ar [1 4] %ar [1 5] %ar [1 6] set logging %ar [2 1] %ar [2 2] %ar [2 3] %ar [2 4] %ar [2 5] %ar [2 6] set logging %ar [3 1] %ar [3 2] %ar [3 3] %ar [3 4] %ar [3 5] %ar [3 6] set logging %ar [4 1] %ar [4 2] %ar [4 3] %ar [4 4] %ar [4 5] %ar [4 6] set logging %ar [5 1] %ar [5 2] %ar [5 3] %ar [5 4] %ar [5 5] %ar [5 6] set logging %ar [6 1] %ar [6 2] %ar [6 3] %ar [6 4] %ar [6 5] %ar [6 6]
set logging ver
set logging %ar1 [1 1] %ar1 [1 2] %ar1 [1 3] %ar1 [1 4] %ar1 [1 5] %ar1 [1 6] set logging %ar1 [2 1] %ar1 [2 2] %ar1 [2 3] %ar1 [2 4] %ar1 [2 5] %ar1 [2 6] set logging %ar1 [3 1] %ar1 [3 2] %ar1 [3 3] %ar1 [3 4] %ar1 [3 5] %ar1 [3 6] set logging %ar1 [4 1] %ar1 [4 2] %ar1 [4 3] %ar1 [4 4] %ar1 [4 5] %ar1 [4 6] set logging %ar1 [5 1] %ar1 [5 2] %ar1 [5 3] %ar1 [5 4] %ar1 [5 5] %ar1 [5 6] set logging %ar1 [6 1] %ar1 [6 2] %ar1 [6 3] %ar1 [6 4] %ar1 [6 5] %ar1 [6 6]
return
:new
for #i #v 1 -1 for #j #g 1 -1 //пробегаемся по элементам, начиная с последнего и влево, вверх
if %ar[#i #j] = 0 //если находим 0 for #ii #i 2 -1 //запускаем цикл по смещению ряда, по одной позиции, за проход.. set #ii1 #ii - 1 // прям почта россии)))) set %ar[#ii #j] %ar[#ii1 #j] set %ar[#ii1 #j] 0
end_for end_if end_for end_for
set logging gor new
set logging %ar [1 1] %ar [1 2] %ar [1 3] %ar [1 4] %ar [1 5] %ar [1 6] set logging %ar [2 1] %ar [2 2] %ar [2 3] %ar [2 4] %ar [2 5] %ar [2 6] set logging %ar [3 1] %ar [3 2] %ar [3 3] %ar [3 4] %ar [3 5] %ar [3 6] set logging %ar [4 1] %ar [4 2] %ar [4 3] %ar [4 4] %ar [4 5] %ar [4 6] set logging %ar [5 1] %ar [5 2] %ar [5 3] %ar [5 4] %ar [5 5] %ar [5 6] set logging %ar [6 1] %ar [6 2] %ar [6 3] %ar [6 4] %ar [6 5] %ar [6 6]
return
И вроде находит линии, но не всегда справляется с отсыланием нулей, в самую ж.. ..желанную область))) (IMG: style_emoticons/default/biggrin.gif)
|
|
|
|
dimоn |
12.4.2016, 15:20
|
Novice
Сообщений: 97
Регистрация: 24.10.2014 Группа: Пользователи Наличность: 0
Пользователь №: 17.079
Возраст: 27
|
А по поводу кода, это была ситуация у меня, такая, когда учился, на 1-2 курсе была информатика. Ну и, знач, зачет, препод раздала задания, типа как домой и подходит ко мне однокурсница, помоги, говорит, программку, напиши. Задание, на самом деле не сложное, чет типа, найти сумму пяти наименьших элементов массива, чето такое.. В общем, накидал ей программку, та ее переписала, работает, без проблем, препод, да, говорит, вижу, переписывать умеешь.. Объясни, только, как она работает... У меня автоматом зачет отлетел и я в этот день приехал, под самый конец, зачетку втюхать и, знач, рассказывают, собралось, чуть ли не пол-группы, пока помогали ей разобраться и сами полтора часа вдупляли, что же там написано))) Я, конечно же, съязвил, ну, говорю, вы и кофейники.. что бы понять, достаточно было условие прочитать - там по другому не сделаешь.. но факт остается фактом)))) (IMG: style_emoticons/default/laugh.gif)
|
|
|
|
dimоn |
13.4.2016, 12:55
|
Novice
Сообщений: 97
Регистрация: 24.10.2014 Группа: Пользователи Наличность: 0
Пользователь №: 17.079
Возраст: 27
|
Может баг? Еще раз пробежался по коду. Ну вот, хоть очки выписывай, хоть биноклю, не вижу косяка.. До мелочей.. Запускаем циклы от послкднего эл. к первому, с шагом (-1) for #i #v 1 -1 for #j #g 1 -1 Если значение текущего элемента равно 0 if %ar[#i #j] = 0 for #ii #i 2 -1 Берем текущее значение #i и задаем его, как начальное, для цикла. Конечным можно считать 2, потому что, обмен будет происходить с первым. шаг (-1) set #ii1 #ii - 1 set %ar[#ii #j] %ar[#ii1 #j] set %ar[#ii1 #j] 0 Присваиваем текущему элементу, значение элемента, находящегося над ним, а тому, 0. end_for end_if end_for end_for Все.. Ничего замудренного.. Но почему работает через раз? Может у меня версия пилота корявая, какая? Запустите, кто-нибудь у себя?
|
|
|
|
dimоn |
15.4.2016, 17:36
|
Novice
Сообщений: 97
Регистрация: 24.10.2014 Группа: Пользователи Наличность: 0
Пользователь №: 17.079
Возраст: 27
|
Цитата(DarkMaster @ 12.4.2016, 15:23) тоже самое, что и просто: log
Пробовал тестировать на set logging и на log. До миллисекунд, конечно, не вымерял, но, на однотипном массиве, действительно, дает одни и те же результаты, по времени, с точностью до секунды. Повторюсь, миллисекунды не вымерял. В общем, готовый блок просчета поля есть. Подправил, работает, без нареканий. Поиск линий
Код set size (%ar 6 6) set size (%ar1 6 6) set #v 6 //(%arr) set #g 6 //(%arr) set size (%arr 6 6)
for #i 1 #v for #j 1 #g set %arr [#i #j] 1 + random(4) set %ar[#i #j] %arr[#i #j] set %arr[#i #j] %arr[#i #j] end_for end_for
log Начальный log %arr [1 1] %arr [1 2] %arr [1 3] %arr [1 4] %arr [1 5] %arr [1 6] log %arr [2 1] %arr [2 2] %arr [2 3] %arr [2 4] %arr [2 5] %arr [2 6] log %arr [3 1] %arr [3 2] %arr [3 3] %arr [3 4] %arr [3 5] %arr [3 6] log %arr [4 1] %arr [4 2] %arr [4 3] %arr [4 4] %arr [4 5] %arr [4 6] log %arr [5 1] %arr [5 2] %arr [5 3] %arr [5 4] %arr [5 5] %arr [5 6] log %arr [6 1] %arr [6 2] %arr [6 3] %arr [6 4] %arr [6 5] %arr [6 6]
gosub find_line
end_script :find_line while_not #find = 0 set #find 0 set #find1 0 for #i 1 #v for #j 1 #g - 2 set #j1 #j + 1 set #j2 #j + 2 if (%ar[#i #j] = %ar[#i #j1]) and (%ar[#i #j] = %ar[#i #j2]) and %ar[#i #j] > 0 //если 3 элемента set #j3 #j + 3 if %ar[#i #j] = %ar[#i #j3] set #j4 #j + 4 //если 4 if %ar[#i #j] = %ar[#i #j4] set #j5 #j + 5 //5 if %ar[#i #j] = %ar[#i #j5] set %ar[#i #j5] 0 //6 end_if set %ar[#i #j4] 0 end_if set %ar[#i #j3] 0 end_if
set %ar[#i #j] 0 set %ar[#i #j1] 0 set %ar[#i #j2] 0
set #find 1 end_if end_for end_for for #j 1 #g for #i 1 #v - 2 set #i1 #i + 1 set #i2 #i + 2 if (%ar1[#i #j] = %ar1[#i1 #j]) and (%ar1[#i #j] = %ar1[#i2 #j]) and %ar1[#i #j] > 0 //если 3 элемента set #i3 #i + 3 if %ar1[#i #j] = %ar1[#i3 #j] //если 4 set #i4 #i + 4 if %ar1[#i #j] = %ar1[#i4 #j] set #i5 #i + 5 //5 if %ar1[#i #j] = %ar1[#i5 #j] set %ar1[#i5 #j] 0 //6 end_if set %ar1[#i4 #j] 0 end_if set %ar1[#i3 #j] 0 end_if set %ar1 [#i #j] 0 set %ar1[#i1 #j] 0 set %ar1 [#i2 #j] 0 set #find1 1 end_if end_for end_for
for #i 1 #v for #j 1 #g if %ar1[#i #j] = 0 set %ar[#i #j] 0 end_if if %ar[#i #j] = 0 set %ar1[#i #j] 0 end_if end_for end_for log нашли линии, заменили на 0
log %ar [1 1] %ar [1 2] %ar [1 3] %ar [1 4] %ar [1 5] %ar [1 6] log %ar [2 1] %ar [2 2] %ar [2 3] %ar [2 4] %ar [2 5] %ar [2 6] log %ar [3 1] %ar [3 2] %ar [3 3] %ar [3 4] %ar [3 5] %ar [3 6] log %ar [4 1] %ar [4 2] %ar [4 3] %ar [4 4] %ar [4 5] %ar [4 6] log %ar [5 1] %ar [5 2] %ar [5 3] %ar [5 4] %ar [5 5] %ar [5 6] log %ar [6 1] %ar [6 2] %ar [6 3] %ar [6 4] %ar [6 5] %ar [6 6]
set #find #find + #find1
if #find > 0 gosub new end_if end_while return
:new for #i 1 #v for #j 1 #g
if %ar[#i #j] = 0 for #ii #i 2 -1 set #ii1 #ii - 1 set %ar[#ii #j] %ar[#ii1 #j] set %ar[#ii1 #j] 0 set %ar1[#ii #j] %ar1[#ii1 #j] set %ar1[#ii1 #j] 0
end_for end_if end_for end_for
log убрали 0, опустили вниз
log %ar [1 1] %ar [1 2] %ar [1 3] %ar [1 4] %ar [1 5] %ar [1 6] log %ar [2 1] %ar [2 2] %ar [2 3] %ar [2 4] %ar [2 5] %ar [2 6] log %ar [3 1] %ar [3 2] %ar [3 3] %ar [3 4] %ar [3 5] %ar [3 6] log %ar [4 1] %ar [4 2] %ar [4 3] %ar [4 4] %ar [4 5] %ar [4 6] log %ar [5 1] %ar [5 2] %ar [5 3] %ar [5 4] %ar [5 5] %ar [5 6] log %ar [6 1] %ar [6 2] %ar [6 3] %ar [6 4] %ar [6 5] %ar [6 6]
return
Признаюсь, на самом деле, на первый взгляд, казалось все это дело, намного проще))) (IMG: style_emoticons/default/smile.gif) Ну что же, если уже взялся, не бросать же на пол-пути))) (IMG: style_emoticons/default/sad.gif) Расчитываю на посильную помощь (IMG: style_emoticons/default/rolleyes.gif) Следующим шагом, должно было бы быть, поиск возможных вариантов хода. Тут нам проще всего найти комбинацию из двух одинаковых элементов и проверить на совпадение, с возможным для замены третьим (IMG: http://c2n.me/3wYjSiQ.jpg) Если позиции находятся рядом, условно возьмем координаты [0 0] и [0 1] то проверять надо [-1][-1], [-2][0] или [-1][1]. А также с другой стороны [2][-1], [2][1] и [3][0]. Таким образом нужно обработать 6 возможных позиций (IMG: http://c2n.me/3wYmV59.jpg) Можно попробовать сделать это, путем замены в исходном массиве, затем просчете в следующей вкладке, после, обратная замена и поиск другой комбинации. Но вот, как организовать, что бы дождаться ответа от каждой из вкладок и в каком виде получать результат? в виде кол-ва убранных элементов? или в виде образовавшегося массива?
|
|
|
|
DarkMaster |
15.4.2016, 18:14
|
Модератор UOPilot
Сообщений: 9.460
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 27708
Пользователь №: 11.279
|
А прошлый код был разве не по поиску? Мде. Тяжело втыкать в такой код, когда думаешь, что он о другом) Это ты заполнение делал что ли?
По поводу как лучше делать - я рекомендую пробежать те несчастные страницы. Там посты короткие, 90% быстро отметешь. Я старался подвести все под математику и там были интересные выкладки. В частности точно помню наличие куска который был выдан с идеей "засунь в код и не заморачивайся". В общем смысле - смотри суммы координат, дели суммы координат, смотри остаток, смотри целую часть, анализируй это.
Вкладки тебе не нужны. Ну имхо не нужны. Распараллелить оно конечно круто, все такое, но как минимум на этапе первого поиска тебе точно не надо этого делать. Делить поле на куски будет очень тяжело, т.к. надо будет учитывать возможнось сбора фигуры с соседним полем. Т.е. придется перекрытия диапазонов корячить. В поле 6 на 6 имхо не актуально, хотя какой-то небольшой прирост при правильной реализации(тут есть тонкости) может дать. А вот для просчета возможных последствий и просчета получившейся ситуации при различных вариантах сбора линий - можно.
// Ты забыл диагонали.
убери код под спойлеры, а то форум растягивает.
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|