Задача 5

Категория: Интернет
Етикети: игра
вторник, 10 Февруари 2004 0:00ч

“E-ХО”
Играта на “кръстчета и нули”, наричана още “ХО” е добре известна. На квадратна дъска, разделена с вертикални и хоризонтални линии на мрежа от 100 еднакви квадратчета, разположени в 10 реда и 10 стълба, играят двама играчи А и В. Всеки от двамата играчи разполага с 50 пула, като тези на играча А са маркирани с кръстче (Х), а тези на играча В - с нула (О). Играчите се редуват да правят ходове, като играчът А започва пръв. Играчът, който е на ход, трябва да постави един от своите пулове на празно квадратче. Този от играчите, който пръв успее да постави свои пулове в 5 последователни квадратчета на един ред, един стълб или по диагонал - печели. Ако след 100-те хода на двамата играчи никой от тях не е успял да спечели - играта завършва наравно.
Нашият герой - младият програмист Пиер - е между майсторите на играта “ХО”. С присъщото си любопитство един ден той се запитал: а какво ще стане, ако игралното поле не е разположено хоризонтално, а вертикално (вж. фигурата) и пуловете не се поставят свободно в квадратчетата на полето, а се “пускат” в колоните на игралното поле? Ако игралното поле е кутия, отворена само отгоре, а колоните са оформени така, че пулът да не може да напуска колоната в която е пуснат, тогава той ще спре, когато достигне най-високо стоящият пул в колоната или ще падне на дъното й, ако до момента на хода в колоната няма други пулове. Новата игра, да я наречем “E-ХО”, ако не по-трудна, е доста различна по характер и изисквала от Пиер да разработи нови стратегии. За да може да тренира, той написал програма, която да му замести липсващия противник и в нейната компания прекарал незабравими часове (в извънработно време, разбира се). Скоро и колегите му от фирмата се заразили от новата игра и разработили свои програми, които играят “Е-ХО”.
Искате ли и вие да се включите в битката? Напишете своя компютърен играч. Той трябва да е Windows конзолно приложение, базирано на платформата .NET на Microsoft. То ще комуникира със сървър чрез технологията Web Services. Адресът на сървъра, към който трябва да се свързва вашата програма, е http://konkurs.
musala.com/webservices/eho/EhoGame.asmx. Всеки желаещ да участва в конкурса ще получи уникално потребителско име, с което неговата програма трябва да се идентифицира. За да получите потребителско име, пишете на адрес: konkurs@musala.com. На този адрес изпращайте трите си имена, e-mail, телефон за контакти. “Сървърът ще бъде активен и достъпен по Интернет преди крайния срок на задачата, така че ще може да срещнете вашите компютърни играчи online.”
Web интерфейсът, който предлага Web Service-а EhoGame е както следва.

int StartGame(
string userName,
string opUserName,
out string sessionID,
out int opMove,
out string statusText
);
int MakeMove(
string sessionID,
int pos,
out int opMove,
out string statusText
);

И двете функции връщат резултат от тип int, който показва статуса на играта. Възможните стойности са както следва:
0 - Играта продължава (е започнала) успешно.
1 - Грешка или невъзможност за игра поради технически причини.
2 - Играта е приключила на равно.
3 - Играта е приключила с победа на вашата програма.
4 - Играта е приключила със загуба на вашата програма.
Повече информация за статуса на играта ще бъде връщана от функциите в параметъра statusText.
В началото на своето изпълнение програмата ви трябва да извиква метода StartGame. Параметърът userName трябва да задава потребителското ви име, получено при заявка за участие в конкурса. Параметърът opUserName предава потребителско име на играч, с когото вашата програма желае да играе. Ако параметърът съдържа празен низ, програмата ви ще играе срещу случайно избран играч. В крайната версия на програмата, която предавате за оценяване от журито, този параметър трябва да бъде празен. До 30 секунди вашата програма ще получи отговор от сървъра дали програмата ви може да играе или причина, поради която не може. При невъзможност за игра startGame ще върне 1, при успешно започване на игра, функцията ще върне 0. Ако сте подали заявка за игра с определен потребител и той не извика в рамките на 30 секунди startGame със заявка да играе срещу вас, вие ще получите отказ за игра. Потребителят, който направи пръв заявка за игра, ще играе като 1-ви играч. Функцията startGame връща още няколко параметъра. Параметърът sessionID указва уникален идентификационен низ за конкретната игра, който трябва да подавате на функцията MakeMove, докато не завърши текущата игра. Ако вашата програма извика MakeMove с друга стойност на sessionID параметъра, вие ще загубите служебно играта. Параметърът opMove на функцията StartGame е 0, ако вашата програма трябва да играе 1-ва или е число от 1 до 10, указващо първия ход на вашия опонент, който играе като играч А за конкретната игра.
Функцията MakeMove приема като параметри sessionID и параметъра pos, който указва вашия пореден ход. Функцията връща резултат от тип int, който указва статуса на играта, както беше описано по-горе. Освен това, ако играта не е свършила, връща поредния ход на вашия опонент в параметъра opMove, както и текстово описание на статуса в параметъра statusText. Докато играта е активна, времето, което вашата програма има за работа между връщане от някоя от функциите до следващото извикване на MakeMove, е 1 секунда. При просрочване на това ограничение програмата ви губи служебно.
Получените програми ще бъдат противопоставени една срещу друга в турнир по системата “всеки срещу всеки”, като всяка програма ще изиграе по две игри с всяка друга програма - веднъж като играч А и веднъж като играч В. За спечелена игра ще се присъжда 1 точка, за загубена - 0 точки, а за игра завършила наравно - 0.5 точки. Победител в кръга ще бъде програмата, спечелила най-много точки. При равен брой спечелени точки от няколко програми, по-напред ще се класира този състезател, чиято програма има по-добър резултат срещу програмите, спечелили същия брой точки. Ако и по този показател има равенство, класирането ще става според изразходваното от програмите време. На победителя и на всички състезатели, спечелили равен брой точки с победителя, ще се присъждат по 100 точки за конкурса. Точките на останалите състезатели за конкурса ще се определят по формулата 100 * “спечелени точки” / “точки спечелени от победителя”.
Указания за вграждане на WebService интерфейс в .NET приложение чрез Visual Studio .NET:
1. Създайте нов Windows Console Application проект, базиран на платформата .NET.
2. От менюто Projects изберете Add Web Reference.
3. В полето URL напишете адреса на Web Service-а: http://konkurs.musala.
com/webservices/eho/EhoGame.asmx.
4. Натиснете клавиша Enter на клавиатурата или бутона Go в диалоговия прозорец.
5. В полето Web Reference Name въведете желано от вас име, например: EhoWebService.
6. Натиснете бутона AddReference.
След изпълнението на тези стъпки Studio .NET прибавя към вашия проект пространство с имена (namespace) с името зададено в точка 5, което съдържа класът EhoGame. Вие трябва да създадете обект представител на този клас и да извиквате методите му StartGame и MakeMove, както беше описано по-горе в съответствие с всички изисквания.
На сайта на конкурса (http://konkurs.
musala.com) може да намерите примерни сорсове.

Конкурсът се провежда със съдействието на доц. д-р Красимир Манев

Коментари

Добави коментар

Име:

Коментар: