Форум «Всё о Паскале» _ Конкурсы _ Предложение по конкурсу на тему Калах
Автор: andriano 11.12.2009 13:17
Кстати, Калах - хороший пример игры для конкурса. В отличие от предлагавшегося Морского боя. При этом "игрока" можно было бы реализовать как dll, имеющую стандартный интерфейс: инициализация, финализация (нужны, если алгоритм требует чтения с диска какой-либо базы) и ход. Последний можно реализовать как функцию, принимающую два массива - лунки игрока и соперника и возвращающую номер лунки-хода. Тогда такие dll можно использовать как для игры против человека, так и друг с другом.
Автор: andriano 15.12.2009 19:38
Цитата(RathaR @ 14.12.2009 19:52)
andriano, я почти ничего не понял...
Обидно. Все-таки рискну редложить на обсуждение некоторое описание программы, которую можно использовать для проведения конкурса и простейший пример программы-конкурсанта.
Цитата
Игра Калах
Программная реализация. Предназначена для проведения турниров программистов. Состоит из основного управляющего модуля (дальше - Доска) и двух динамически присоединяемых библиотек DLL (дальше такая DLL будет именоваться Игрок). Игроки имеют предопределенные имена KlPayer1.dll и KlPayer2.dll. Эти файлы должны располагаться в одной папке с Доской. В игре предусмотрено возможное изменение интерфейса между Доской и Ироками. Для этого вводится номер версии интерфейса. Игроки должны поддерживать все версии с 1 до их текущей. Игра происходит с интерфейсом самой старшей версии, которую поддерживают оба Игрока и Доска. Т.е, если версии игроков 2 и 4, а доски 3, то игра будет происходить по интерфейсу версии 2.
Описание интерфпейса версии 1. Игрок содержит следующие процедуцры и функции:
function KlInit(var KlInfo : tKlInfo) : boolean; - инициализация. Для версий 2 и выше допускается повторный вызов этой функции.
структура tKlInfo = record size : longint; // (i) длина структуры в байтах ver_B : longint; // (i) версия интерфейса Доски ver_P : longint; // (o) версия интерфейса Игрока. Обязательна к заполнению, должна быть не больше, чем версия Доски. Num_P : longint; // (i) номер игрока - 1 или 2. В принципе, нужно лишь для информации, внутреннего протоколирования игрока и алгоритмов, основанных на протоколировании игры. Nholes : longint; // (i) количество лунок у каждого из игроков Nbones : longint; // (i) первоначальное колитчество камней в каждой лунке name : array[0..31]of char; // (o) имя Игрока (C-строка, заканчивающаяся нулем) creator : array[0..31]of char; // (o) разработчик (C-строка, заканчивающаяся нулем) description : array[0..255]of char; // (o) описание (C-строка, заканчивающаяся нулем) end;
Игрок долже считать пол size и в дальнейшем заполнять только те поля, что не выходят за предел size. Заполение поля ver_P обязательно, при этом если версия Игрока старше версии, переданной в параметре ver_B, должно возвращаться значение ver_B. Если произошла ошибка инициализации и игра невозможно, функциия должна вернуть FALSE, а при успешном завершении TRUE. Инициализация датчика псевдослучайных чисел randomize происходит в dll независимо от основной прогшраммы, поэтому при необходисмости его нужно инициализировать.
в игре используется масив лунок, причем лунки нумеруются с 1 до 6 в направлении хода, т.е. 1-го Игрока слева направо, а 2-го справа налево.
tHoles : array[1..6] of longint;
function KlGetTurn(MyHoles, OppHoles : tHoles; MyKalah, OppKalah, OppTurn : longint) : longint; - очередной ход. все параметры: свои лунки, лунки противника, свой Калах, калах противника, предыдущий ход противника - входные.
выход - номер лунки, с которой начинается очередной ход, от 1 до Nholes. Если произошла ошибка, то 0. OppTurn - предыдущий ход противника от 1 до Nholes. Если это повторный ход, то 0. Может пригодиться, если стратегия игры основана на протоколировании.
procedure OppTurnRepeat(OppTurn : longint); - в случае повторного хода противника информирует о нем, т.е. если противник делает 3 хода подряд, между KlGetTurn будет дважды вызвана OppTurnRepeat. При одиночном ходе противника не вызывается.
procedure KlEndRound(MyBones, OppBones, NumTurns : longint); - вызывается при завершении текущего раунда. Информирует игрока о количестве камней у него и у противника на момент окончания игры, также о количестве ходов. Если последним был ход текущего игрока, то последний ход противника - 0.
procedure KlDone; - вызывается при завершении программы для аккуратного освобождения памяти и, если нужно, сохранении статистики на диск.
И простейший вариант "Игрока". Даже слишком "простейший" - делающий случайные ходы.
library KlPlRnd; // игрок в калах со случайным выбором хода uses KlComm;
const NumVer = 1; // версия интерфейса Игрока _name : string = 'Dumb Player'; _creator : string = 'Sergey Andrianov'; _description : string = 'Random Turn Player'; var CurrVer : longint; // версия, с которой будет работать программа Player : longint; // номер игрока (1 bkb 2) NumHoles : longint; // количество лунок (3-6) NumBones : longint; // первоначальное количество камней в лунке (3-6) t : text; // файл протокола данного игрока Nturn : longint; // счетчик щагов
procedure MoveString(var s : string; var p : array of char; size : longint); // пересылка Паскль-строки в С-строку var l : longint; begin l := length(s); if l > (size-1) then l := size-1; move(s[1], p, l); p[l] := #0; end;
function KlInit conv arg_stdcall(var KlInfo : tKlInfo) : boolean; // инициализация. Для версий 2 и выше допускается повторный вызов этой функции. begin if KlInfo.Num_P = 1 then assign(t,'Player1.out') else assign(t,'Player2.out'); rewrite(t); randomize; with KlInfo do begin if size >= 24 then begin // заполняем только те поля, о которых знает вызывающаяч программа if NumVer <= ver_B then ver_P := NumVer else ver_P := ver_B; CurrVer := ver_P; Player := Num_P; NumHoles := Nholes; NumBones := Nbones; if size >= 344 then begin MoveString(_name, name, 32); MoveString(_creator, creator, 32); MoveString(_description, description, 256); end; end; end; Nturn := 0; KlInit := TRUE; end;
function KlGetTurn conv arg_stdcall(MyHoles, OppHoles : tHoles; MyKalah, OppKalah, OppTurn : longint) : longint; // очередной ход. все параметры: // свои лунки, лунки противника, свой Калах, калах противника, предыдущий ход противника - входные. var i,j,n : longint; begin if OppTurn = 0 then begin // повторный ход write(t,'KlGetTurn Turn: ',Nturn,' Opp: ',OppTurn); // учитываем ход противника и собственный inc(Nturn,1); end else begin // write(t,'KlGetTurn Turn: ',Nturn,' - ',Nturn+1,' Opp: ',OppTurn); // учитываем ход противника и собственный inc(Nturn,2); end; n := 0; for i := 1 to NumHoles do if MyHoles[i] > 0 then inc(n); // вычисляем количество непустых лунок if n = 0 then begin // если ходить неоткуда - ошибка writeln(t,'KlGetTurn *3*'); KlGetTurn := 0; end else begin j := random(n) + 1; write(t,' Num: ',n,' Rnd: ',j); i := 0; repeat inc(i); if MyHoles[i] > 0 then dec(j); until j = 0; writeln(t,' Out: ',i); KlGetTurn := i; end; end;
procedure OppTurnRepeat conv arg_stdcall(OppTurn : longint); // в случае повторного хода противника информирует о нем begin writeln(t,'OppTurnRp Turn: ',Nturn,' Opp: ',OppTurn); inc(Nturn); end;
procedure KlEndRound conv arg_stdcall(MyBones, OppBones, NumTurns : longint); // В конце раунда информирует игрока о количестве камней у него и у противника на момент окончания игры. begin writeln(t,' EndRound My: ',MyBones,' Opp: ',OppBones,' Turns: ',NumTurns,'/',Nturn); Nturn := 0; end;
procedure KlDone conv arg_stdcall; // вызывается при завершении программы для аккуратного освобождения памяти и, // если нужно, сохранении статистики на диск. begin close(t); end;
exports KlInit name 'KlInit', KlInit index 1, KlGetTurn name 'KlGetTurn', KlGetTurn index 2, KlEndRound name 'KlEndRound', KlEndRound index 3, KlDone name 'KlDone', KlDone index 4, OppTurnRepeat name 'OppTurnRepeat', OppTurnRepeat index 5;
end.
Автор: cameron 20.12.2009 23:40
andriano, то есть протестировать твою прогамму-конкурсанта мы можем, только самостоятельно написав модуль KlComm и библиотеку KlPlRnd...
Автор: andriano 21.12.2009 11:06
Цитата(cameron @ 20.12.2009 23:40)
andriano, то есть протестировать твою прогамму-конкурсанта мы можем, только самостоятельно написав модуль KlComm и библиотеку KlPlRnd...
Это, конечно, тоже вариант , но я подразумевал несколько иной. В данной теме содержится лишь предложение о создании подобного конкурса и в неявном виде вопрос - а интересно ли это будет хоть кому-то. Описание и текст DLL-ки приведены лишь затем, чтобы можно было понять, о чем идет речь. Коль скоро это вызвало интерес хоть у кого-то, все необходимые материалы будут выложены в разделе "Конкурсы" в теме !"Предложения...". Собственно, все готово, мне осталось лишь проверить компилируемость в Delphi и работоспособность полученной DLL. Единственное, есть предположение, что сейчас далеко не лучший момент для объявления конкурса в связи с начавшейся у студентов зачетной сессией.
Автор: volvo 21.12.2009 11:21
Цитата
При этом "игрока" можно было бы реализовать как dll, имеющую стандартный интерфейс: инициализация, финализация (нужны, если алгоритм требует чтения с диска какой-либо базы) и ход. Последний можно реализовать как функцию, принимающую два массива - лунки игрока и соперника и возвращающую номер лунки-хода. Тогда такие dll можно использовать как для игры против человека, так и друг с другом.
А также для форматирования жесткого диска (ну, или других подобных шалостей) тому, кто рискнет положить DLL-ку себе на диск и вызывать оттуда функции. То есть, организатору конкурса... Это так, на всякий случай, чтоб потом не было претензий...
Автор: Lapp 21.12.2009 13:00
Я выделил разговор на тему о предложении использовать Калах для конкурсного задания в отдельную тему.
Кроме этого, andriano инициировал переписку со мной в личке на эту тему. Возможно, она также представляет интерес. Если Сергей не против и кто-то проявит желание ее увидеть - я могу выложить ее тут.
Автор: andriano 23.12.2009 13:08
Kalah_Test.zip ( 83.54 килобайт )
Кол-во скачиваний: 474 Предлагаю конкурс несколько необычного формата (возможно, кто-то даже сочтет, что предлагаемое не имеет права называться конкурсом). Итак: - никаких ограничений по срокам, - никаких ограничений на используемый язык программирования, - никаких ограничений на количество файлов проекта, - никаких ограницений на содержимое файлови и набор используемых функций, - отсутствие исчерпывающего набора допустимых компиляторов, - независимость от организаторов конкурса, - возможность отладки и настройки алгоритмов в "настоящем" окружении, а не в собственной реализации, которую нужно писать самому, и которая может отличаться от той, что используют органмизаторы,
Ограничения: - только Windows, - используемый компилятор должен уметь делать Windows DLL, - все конкурсные соревнования проводятся на пользовательском компьютере, - при публикации конкурсной программы в виде DLL ОБЯЗАТЕЛЬНО размещение исходников (п.9 Правил форума), а также указание используемого компилятора, его версии и настроек. Если программа использует внешние файлы, необходимо описание структуры этих файлов.
Основные положения. Предмет: разработка алгоритмов для игры в Калах. Способ: алгоритм оформляется в виде Windows DLL, после чего управляющая программа подключает две DLL и проводит между ними соревнование, помещая отчет в файл.
Правила проведения. Организатор размещает: - исполняемый файл: kalah.exe - консольное приложение (TMT Pascal 4.01, Windows Console, настройки по умолчанию), исходники прилагаются. - пример игрока, делающего случайные ходы, файл KlPlRnd.dll, (TMT Pascal 4.01, Windows DLL, настройки по умолчанию), исходники прилагаются. - то же самое, файл Kalah_D.dll, (Turbo Delphi, Windows DLL, настройки по умолчанию), исходники прилагаются. - исходники дополнительных модулей, необходимых для компиляции управляющей программы и DLL. - пример командного файла для проведения конкурса run.bat - поочередно запускает два раунда соревнований, меняя игроков местами (первого со вторым). - описание требований, предъявляемых к DLL, файл readme.txt. Организатор осуществляет поддержку управляющей программы, исправляя в ней найденные пользователями ошибки, и выполняя некоторые из пожеланий пользователей. Организатор НЕ запускает DLL пользователей на своем компьютере - все тестирования проводит конкурсант. Организатор обещает, что он не включил в состав программы вредоносного кода, но не гарантирует отсутствие каких-либо проблем у пользователя вследствие ошибок в программе либо заражения ее вирусами после публикации (организатор рекомендует проверять на наличие вирусов все скачиваемые из И-нета программы). Конкурсант проводит разработку алгоритма, его отладку, тестирование и проведение своей локальной части конкурса на своем компьютере, после чего размещает отчет о результатах тестов вместе с DLL и исходником на форуме.
Управляющая программа позволяет проводить разработку, отладку и тестирование алгоритмов пользователя, в частности протоколирование работы как управляющей программы, так и алгоритмов пользователей с различной степенью подробности, проведение многократных игр для набора статистики, настройки управляющих коэффициентов, обучения НС и т.п. Ключи командной строки: /h:N (N - десятичное число, default = 6) - количество лунок в игре (3-6), /b:N (N - десятичное число, default = 6) - начальное количество камней в каждой лунке (3-6), /r:N (N - десятичное число, default = 1) - количество раундов (для подсчета статистики), /t:N (N - десятичное число, default = 300) - количество ходов, после которого фиксируется ничья (во избежание зацикливания), /f:xxxxxx.txt (строка без пробелов, default = 'KlLog.txt') - файл протокола, /l:NM, где N и M - цифры: N=0 для "Доски", N=1 или N=2 для "Игрока", default = 3 - уровень подробности лог-файла. M - от 0 до 5: (0 - лог-файл не создается, 1 - только интегральная по игре (KlDone), 2 - только интегральная по раунду (KlEndRound), 3 - краткая на каждом ходе, 4 - средняя на каждом ходе, 5 - самая подробная) /p:N=M (N - 1 или 2 (номер игрока), M - десятичное или 16-чное число) - настроечные параметры, передаются "Игрокам" в 10-чном /p:1=12345 или 16-чном /p:2:$12ab или /p=1:12abh виде
Для участия в конкурсе достаточно: 1. Открыть один из приведенных примеров (если используется Паскаль). 2. Заменить строки, содержащие название алгоритма, имя автора и описание. 3. Заменить несколько строк в функции KlGetTurn на собственный алгоритм. 4. Сохранить под новым самостоятельно придуманным именем. 5. Откомпилировать файл, получив DLL. 6. Скопировать файл в KlPlayer1.dll или KlPlayer2.dll по своему выбору либо видоизменить командный файл run.bat под свое имя библиотеки. 7. Запустить kalah.exe или run.bat, получив протокол работы программы (точнее, три протокола: управляющей программы и по одному от игроков). 8. Разместить на форуме результат работы программы (необходимо два варианта счета: при игре 1-м и 2-м игроком) вместе с указанием, против кого она играла, исходник, саму DLL, указание компилятора и настроек.
Автор: Lapp 28.12.2009 0:32
Цитата(andriano @ 23.12.2009 13:08)
8. Разместить на форуме результат работы программы (необходимо два варианта счета: при игре 1-м и 2-м игроком) вместе с указанием, против кого она играла, исходник, саму DLL, указание компилятора и настроек.
andriano, ситуация, когда каждый участник имеет доступ к сорсам соперников, не может рассматриваться как честная. Ты можешь говорить о добросовестности сколько угодно - напрасно. Размещать же только DLL без сорса - непозволительно (аксиома). И даже если dll размещается с сорсом, все равно должна осуществляться проверка соответствия, и эта проверка должна делаться не пользователем (участником). Значит, должно быть выделенное ответственное лицо, и мы приходим опять к стандартной процедуре. А тогда, прости, зачем все эти ухищрения?..
Кроме того, результат должен кодироваться с асимметричным ключом, чтобы ему можно было доверять. А это значит, в частности, что все dll-участницы должны иметь свою цифровую подпись.. продолжать?
Я понимаю, что эти вопросы не могли ускользнуть от твоего внимания при разработке предложения. Тем самым,я прихожу к выводу, что ты заложился таки на добросовестность участников и, вероятно, приготовился спорить на эту тему. Так вот, я говорю, что я с тобой в корне не согласен и вряд ли соглашусь. И вот тогда становится понятным, что ты имел в виду под фразой
Цитата
возможно, кто-то даже сочтет, что предлагаемое не имеет права называться конкурсом
И вот с этой-то твоей фразой (а точнее - с ее второй половиной) я как раз согласен в полной мере )).
Автор: Lapp 28.12.2009 2:21
я подредактировал свой предыдущий пост, а теперь просто обновляю время.
Автор: andriano 28.12.2009 11:36
Цитата(Lapp @ 28.12.2009 0:32)
andriano, ситуация, когда каждый участник имеет доступ к сорсам соперников, не может рассматриваться как честная.
Согласись, что она симметричная. Так откуда берется бесчестность?
Цитата
Ты можешь говорить о добросовестности сколько угодно - напрасно. Размещать же только DLL без сорса - непозволительно (аксиома).
В данном случае согласен.
Цитата
И даже если dll размещается с сорсом, все равно должна осуществляться проверка соответствия, и эта проверка должна делаться не пользователем (участником). Значит, должно быть выделенное ответственное лицо, и мы приходим опять к стандартной процедуре.
Если результат конкурса - приобретение участниками (победителями) каких-либо материальных либо нематериальных благ, то - безусловно. Если же не предполагается не только раздача призов, но даже подведение итогов (кстати, именно поэтому я оговорился насчет возможности отнесения данного мероприятия к конкурсам), то какой в этом смысл?
Цитата
А тогда, прости, зачем все эти ухищрения?..
Честно говоря, я рассматриваю предложенное не как ухищрения, а как упрощение.
Цитата
Кроме того, результат должен кодироваться с асимметричным ключом, чтобы ему можно было доверять. А это значит, в частности, что все dll-участницы должны иметь свою цифровую подпись.. продолжать?
Кроме того, каждый результат должен быть размещен на двух носителях, основанных на разных физических принципах (например, магнитный и оптический), и в запаянных контейнерах сдан на хранение в швейцарский банк. Нет, продолжать не нужно.
Цитата
Я понимаю, что эти вопросы не могли ускользнуть от твоего внимания при разработке предложения. Тем самым,я прихожу к выводу, что ты заложился таки на добросовестность участников и, вероятно, приготовился спорить на эту тему. Так вот, я говорю, что я с тобой в корне не согласен и вряд ли соглашусь.
Если честно, я буду считать свою затею удавшейся даже в том случае, если кто-то попытается что-то сделать исключительно у себя и решит не выкладывать результаты на всеобщее обозрение. Кстати, для этого я еще выложу 1-2 варианта реально играющих DLL. Ты ведь выложил исходники программы, играющей в калах, при том, что ее вряд ли можно использовать без накопленных баз. В конце концов интересна сама идея.
Цитата
И вот тогда становится понятным, что ты имел в виду под фразой И вот с этой-то твоей фразой (а точнее - с ее второй половиной) я как раз согласен в полной мере )).
Ну, тогда можешь перенести эту тему из "Конкурсов" в "Игры".
Автор: Lapp 29.12.2009 2:40
Цитата(andriano @ 28.12.2009 11:36)
Согласись, что она симметричная. Так откуда берется бесчестность?
Хороший вопрос . Думаю, она берется из окружающей социологической обстанвки и не имеет никакого отношения к таким фундаментальным понятиям, как симметрия )). Вася выложил свою конкурсную работу. Петя скачал ее, раскурочил и использовал полученную информацию с целью выигрыша в конкурсе. Согласен, что Вася после этого также будет иметь шанс сделать то же самое, но ему могут помешать принципы..
Цитата
Если результат конкурса - приобретение участниками (победителями) каких-либо материальных либо нематериальных благ, то - безусловно. Если же не предполагается не только раздача призов, но даже подведение итогов (кстати, именно поэтому я оговорился насчет возможности отнесения данного мероприятия к конкурсам), то какой в этом смысл?
Смысл - в почете и уважении. А может - в потирании рук под столом. Какой смысл в писании вирусов? Я не знаю. Я знаю только, что возможность, если она есть, будет использована рано или поздно. Да, ничего СТРАШНОГО не произойдет, но неприятное ощущение будет. А главное - сама по себе эта самая возможность внесет коррективы в виде чьего-то аргумента не участвовать. Ну, и последнее: призы, хотя бы в виде тех же открыток с афтографом - совсем не такая уж и лишняя вещь.
Цитата
Честно говоря, я рассматриваю предложенное не как ухищрения, а как упрощение.
Упрощений я не усмотрел. Если хочешь, проведи опрос.
Цитата
Кроме того, каждый результат должен быть размещен на двух носителях, основанных на разных физических принципах (например, магнитный и оптический), и в запаянных контейнерах сдан на хранение в швейцарский банк.
Цитата
Если честно, я буду считать свою затею удавшейся даже в том случае, если кто-то попытается что-то сделать исключительно у себя и решит не выкладывать результаты на всеобщее обозрение. Кстати, для этого я еще выложу 1-2 варианта реально играющих DLL.
Заслуживает уважения.
Цитата
Ты ведь выложил исходники программы, играющей в калах, при том, что ее вряд ли можно использовать без накопленных баз.
Это ты зря. Накопление осуществляется той же программой, так что она self consistent. И там объектом внимания является сам механизм обучения.
Цитата
В конце концов интересна сама идея.Ну, тогда можешь перенести эту тему из "Конкурсов" в "Игры".
Все, сказанное мной - всего лишь мнение. Проверить есть только один способ . Предлагаю создать тему типа "Постоянно действующий конкурс Калах", а andriano назначить ответственным (с месячным жалованием в 0.084 спасибо и 31 плевок в душу, а также единовременной выплатой +1 в репу лично от меня в качестве подъемных)). Свистни мне, когда ты будешь готов окончательно. Я думаю, что не нужно упускать любую возможность активизировать жизнь на Форуме. Если я что-то не учитываю - продолжай обсуждение здесь или пиши мне в личку.
Автор: Rian 31.05.2010 8:06
а почему бы не завести мини сервер, через кторый проги смогут биться между собой? я думаю веберы тут тож найдутся
а команды для простоты можно даже через get отсылать, в текстовом режиме
Автор: Lapp 3.06.2010 23:29
Цитата(Rian @ 31.05.2010 9:06)
а почему бы не завести мини сервер, через кторый проги смогут биться между собой? я думаю веберы тут тож найдутся
Rian, все в твоих руках. Делай. Нужна помощь - пиши тут.
Автор: Rian 10.06.2010 10:07
хорошо, после 15-го освобожусь и постараюсь занятся основательно и написать несколько скриптиков. На этой странице так сказать общие правила:
http://rian.ho.ua/?page_id=33
там и будут биться проги пока, так сказать, оцениваем концепцию, пишем воинов....
предварительное время начала дуэлей 15.07.2010
ЗЫ. сам в суть калаха не вник так что ориентировался на правила шахмат ...ага там еще пропуск хода есть...
Автор: Lapp 10.06.2010 10:40
Цитата(Rian @ 10.06.2010 11:07)
предварительное время начала дуэлей 15.07.2010
Гуд, заметано! ))
Цитата
ЗЫ. сам в суть калаха не вник так что ориентировался на правила шахмат ...ага там еще пропуск хода есть...
Где пропуск хода? к калахе?? или в шахматах???
Откуда такой сдвиг терминологии? игра -> битва игроки -> воины.. а?.. из тяжелого детства?
Автор: Rian 10.06.2010 10:55
холивар, останется только один
"Если при раскладывании последний камень попал в калах, то игрок ходит еще раз. "
это решается передачей нескольких ходов в одном запросе, т.е. программа делет свои ходы пока может, а когда ходы закончились передает свои решения за раз да и ход то сводится к выбору лунки например: a1+a4+a2
Автор: Lapp 10.06.2010 11:28
Цитата(Rian @ 10.06.2010 11:55)
... это решается ...
Все решается, безусловно )). Короче, ты не торопись. Продумай все. И реши )).
Автор: Rian 30.06.2010 7:04
думаю уже пора подавать заявки, проходить квалификацию;)
Автор: Lapp 1.07.2010 2:32
Цитата(Rian @ 30.06.2010 8:04)
думаю уже пора подавать заявки, проходить квалификацию;)
Опиши всю процедуру в деталях, пожалуйста: что должен делать участник, как он это должен делать и чего он должен не делать. Пришли мне и volvo в личку. Жду.
Автор: Lapp 1.07.2010 9:37
Rian получил от меня +1 за инициативность ) Дело двигается. Следим за новостями!..