X конкурс по програмиране PC Magazine Bulgaria и Musala Soft Ltd.

Категория: Интернет
Етикети:
10.2.2004

Дойде мигът за голямото интерпланетарно парти. Естествено Мечо Пух също е поканен, но за нещастие претърпя авария при кацането и се озова на неизвестно за него място на планетата на Малкия Принц. За негова радост той има карта на планетата и знае точно къде ще се проведе партито. Мечо Пух иска да стигне там колкото се може по-бързо, преди да е свършил медът и подаръците от Майкрософт.
Картата на планетата на Малкия Принц представлява таблица N x M, като всяко квадратче е зелена полянка, която бързо и лесно се прекосява, хълм или рекичка, които се преодоляват по-бавно, или дълбоко езеро, през което той изобщо не може да премине.
Единственият проблем на Мечо Пух е, че не знае къде се намира, но той може да види околността и да се придвижва в желаната от него посока.
След много мислене и премисляне на него му се сторило, че този проблем е доста сложен и няма да може да се справи сам. Майкрософт ще възнагради този, който помогне най-успешно на Мечо Пух.
Напишете програма, която по зададена карта и позиция на партито намира възможно най-бързо път до него. Тя трябва да е Windows конзолно приложение, базирано на платформата .NET на Microsoft. То ще комуникира със сървър чрез технологията Web Services. Адресът на сървъра, към който трябва да се свързва вашата програма, е http://konkurs.musala.com/webservices/gift/GiftGame.asmx.
Web интерфейсът, който предлага Web Service-а GiftGame, е както следва:
int StartGame(
out string sessionId,
out int sizeX,
out int sizeY,
out int partyX,
out int partyY,
out string statusText
);
int MapXY(
string sessionId,
int x,
int y,
out int type,
out string statusText
);
int ViewXY(
string sessionId,
int offsetX,
int offsetY,
out int type,
out string statusText
);
int MakeMove(
string sessionId,
int direction,
out string statusText
);
Всички функции връщат резултат от тип int, който показва моментния статус. Също така чрез параметърa statusText всяка функция връща пояснителна информация на статуса. Възможните стойности за статуса са както следва:
0 - играта продължава (е започнала успешно).
1 - играта е завършила успешно - достигната е крайната позиция.
2 - невалиден ход - играта завършва неуспешно.
3 - невъзможност за игра поради технически причини.
Играта трябва да започне с извикване на функцията StartGame. В параметъра sessionId ще получите идентификационен код, който трябва да предавате на другите функции в продължение на текущата играта. Параметрите sizeX и sizeY ще зададат големината на картата. Те са естествени числа между 5 и 128. Параметрите partyX и partyY ще окажат координатите на позицията, в която трябва да пристигне Мечо Пух. partyX ще e естественo число между 1 и sizeX, a partyY ще е естествено число между 1 и sizeY. Функцията StartGame трябва да бъде извикана точно веднъж от вашата програма. Извикването и повече от един път ще доведе до неуспешно завършване на играта.
Чрез функцията MapXY вие може да разберете съдържанието на картата, която притежава Мечо Пух. Параметърът sessionId трябва да съдържа идентификатора на текущата игра, получен при извикването на StartGame. Числата x и y трябва да са валидни координати в рамката на картата (от 1 до sizeX и от 1 до sizeY съответно). Параметърът type връща типа на терена в оказаната позиция. Възможните стойности са следните:
0 - теренът е непроходим. Опит за стъпване в такова квадратче е невалиден ход и ще доведе до неуспешно приключване на играта.
Цяло число от 1 до 3 - теренът отнема съответния брой време за преминаване. По-конкретно Мечо Пух губи зададения брой време, за да излезе от квадратчето (самото влизане не отнема време).
Функцията MapXY не трябва да бъде извиквана два пъти за едни и същи координати в рамките на една игра. Това би довело до неуспешно приключване на играта.
Използвайки функцията ViewXY, вие може да “оглеждате” заобикалящия ви терен. Параметърът sessionId трябва да съдържа идентификатора на текущата игра. offsetX и offsetY трябва да съдържат едно от числата -1, 0 или 1. С тяхна помощ може да научите какъв е теренът в текущото квадратче (offsetX = 0 и offsetY = 0) или в съседните 8 квадратчета. Ако текущата ви позиция е (x,y), вие ще получите в параметъра type вида на терена в позиция (x+offsetX,y+offsetY). Възможните стойности на type са същите, както описаните по-горе. Функцията ViewXY не трябва да бъде извиквана повече от девет пъти между две последователни извиквания на функцията MakeMove. Това би довело до неуспешно приключване на играта.
Чрез функцията MakeMove вие може да правите ход по картата. Възможните посоки за движение са четири. Посоката на движение се задава чрез параметъра direction, който е цяло число между 1 и 4 и променя текущата позиция от (x,y) както следва:
1 - (x-1,y)
2 - (x+1,y)
3 - (x,y-1)
4 - (x,y+1)
Ако квадратчето, в което се опитвате да отидете е терен, тип 0 (непроходимо), то играта ще приключи неуспешно. В противен случай вие ще бъдете преместени в съответното квадратче. След всяко извикване на MakeMove към общото изминало време ще се прибавя времето, необходимо за преминаване на текущото квадратче.
Всички функции ще връщат стойност на статуса нула, докато играта продължава успешно. Функцията MakeMove ще върне стойност едно при успешно достигане на крайната позиция. След това играта се счита за приключила и вашата програма трябва да прекрати изпълнение. Същото се отнася, ако някоя функция върне стойност, различна от нула.
Всички карти ще бъдат заобиколени с непроходими квадратчета (тип 0), така напускането на картата без правене на невалиден ход ще е невъзможно.
Времето за протичане на една игра ще бъде не повече от една минута. Игра, която продължава повече от една минута, ще бъде прекъсната и ще се счита за неуспешно приключила.
При неуспешно приключване на играта вие ще получите нула точки за съответната карта. При успешно достигане до крайната цел, ще получите точки, пропорционални на изминалото време в играта, натрупано при преминаването през различните квадратчета. Участникът, постигнал най-малко време за съответната карта, ще получи пълен брой точки за нея.
Актуална информация както и примерни реализации на решения може да намерите на сайта на конкурса http://konkurs.musala.com .




Очакваме решенията на задача 3 не по-късно от 28.01.2005 г. на адрес konkurs@sagabg.net или konkurs@musala.com. На www.konkurs.musala.com и www.pcmagbg.net ще публикуваме съдържанието на задачите от текущия кръг 20 дни преди крайния срок за изпращане на решението, както и всички промени, актуализации, резултати и временното класиране. Там можете да намерите и правилата за участие в нашия конкурс.