You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

player4.cpp 241 kB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656
  1. #include <vector>
  2. #include <thread>
  3. #include <chrono>
  4. #include <array>
  5. #include<utility>
  6. #include<queue>
  7. #include<string>
  8. #include <stdlib.h>
  9. #include "AI.h"
  10. #include "constants.h"
  11. #include <atomic>
  12. #include <mutex>
  13. #include <condition_variable>
  14. std::atomic<bool> running(true);
  15. std::mutex mtx;
  16. std::condition_variable cv;
  17. // עⲻҪʹconio.hWindows.hȷDZ׼
  18. // Ϊplay()ڼȷϷ״̬£Ϊֻ֤Ϸ״̬ڵطʱ
  19. extern const bool asynchronous = false;
  20. // ѡҪνplayer0player4ְҵﶨ
  21. extern const std::array<THUAI6::StudentType, 4> studentType = {
  22. THUAI6::StudentType::StraightAStudent,
  23. THUAI6::StudentType::StraightAStudent,
  24. THUAI6::StudentType::Sunshine,
  25. THUAI6::StudentType::Sunshine };
  26. extern const THUAI6::TrickerType trickerType = THUAI6::TrickerType::ANoisyPerson;
  27. // AI.cppڲ뺯
  28. // ѡֿﶨԼıͺ
  29. #define PI 3.1415926535897932384626433832795
  30. double getDistance(int x1, int y1, int x2, int y2)
  31. {
  32. return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
  33. }
  34. double getRadian(int x1, int y1, int x2, int y2)
  35. {
  36. int dx = x2 - x1;
  37. int dy = y2 - y1;
  38. if (dx == 0)
  39. {
  40. if (dy > 0)
  41. return PI / 2;
  42. else
  43. return PI * 3 / 2;
  44. }
  45. else if (dx > 0)
  46. {
  47. if (dy == 0)
  48. return 0;
  49. else if (dy > 0)
  50. return atan(dy / dx);
  51. else
  52. return atan(dy / dx) + PI * 2;
  53. }
  54. else
  55. {
  56. if (dy == 0)
  57. return PI;
  58. else
  59. return atan(dy / dx) + PI;
  60. }
  61. }
  62. double getGraident(int delta_Z_on_X, int delta_Z_on_Y)
  63. {
  64. // XYǰ1Zϵı仯
  65. // ZλƷĻ
  66. double delta_Z = sqrt(delta_Z_on_X * delta_Z_on_X + delta_Z_on_Y * delta_Z_on_Y);
  67. if (delta_Z == 0)
  68. return 0;
  69. double ans = acos(delta_Z_on_X / delta_Z);
  70. if (delta_Z_on_Y < 0)
  71. ans = 2 * PI - ans;
  72. return ans;
  73. }
  74. int BFS(int startX, int startY, std::vector<std::vector<THUAI6::PlaceType>>& mapinfo, THUAI6::PlaceType targetType)
  75. {
  76. // return the first step to the target
  77. int visited[50][50];
  78. memset(visited, -1, sizeof(visited));//ʼΪ-1
  79. std::queue<std::tuple<int, int, int>> q;//q
  80. q.push(std::make_tuple(startX, startY, -1));
  81. visited[startX][startY] = 0;
  82. while (!q.empty())
  83. {
  84. std::tuple<int, int, int> now = q.front();
  85. q.pop();
  86. int x = std::get<0>(now);
  87. int y = std::get<1>(now);
  88. int direction = std::get<2>(now);
  89. if (mapinfo[x][y] == targetType)
  90. return direction;
  91. // ĸҪ
  92. if (x > 0 && visited[x - 1][y] == -1 && (mapinfo[x - 1][y] == THUAI6::PlaceType::Land) || (mapinfo[x - 1][y] == THUAI6::PlaceType::Grass))
  93. {
  94. if (direction == -1)
  95. q.push(std::make_tuple(x - 1, y, 2));
  96. else
  97. q.push(std::make_tuple(x - 1, y, direction));
  98. visited[x - 1][y] = visited[x][y] + 1;
  99. }
  100. if (x < 49 && visited[x + 1][y] == -1 && (mapinfo[x + 1][y] == THUAI6::PlaceType::Land) || (mapinfo[x + 1][y] == THUAI6::PlaceType::Grass))
  101. {
  102. if (direction == -1)
  103. q.push(std::make_tuple(x + 1, y, 0));
  104. else
  105. q.push(std::make_tuple(x + 1, y, direction));
  106. visited[x + 1][y] = visited[x][y] + 1;
  107. }
  108. if (y > 0 && visited[x][y - 1] == -1 && (mapinfo[x][y - 1] == THUAI6::PlaceType::Land) || (mapinfo[x][y - 1] == THUAI6::PlaceType::Grass))
  109. {
  110. if (direction == -1)
  111. q.push(std::make_tuple(x, y - 1, 3));
  112. else
  113. q.push(std::make_tuple(x, y - 1, direction));
  114. visited[x][y - 1] = visited[x][y] + 1;
  115. }
  116. if (y < 49 && visited[x][y + 1] == -1 && (mapinfo[x][y + 1] == THUAI6::PlaceType::Land) || (mapinfo[x][y + 1] == THUAI6::PlaceType::Grass))
  117. {
  118. if (direction == -1)
  119. q.push(std::make_tuple(x, y + 1, 1));
  120. else
  121. q.push(std::make_tuple(x, y + 1, direction));
  122. visited[x][y + 1] = visited[x][y] + 1;
  123. }
  124. }
  125. return -1;
  126. }
  127. void func(IStudentAPI& api, short speed, short life, short hp, short shield, short rec, int* c, int* g, int* d3, int* d5, int* d6)
  128. {
  129. bool skill;
  130. double direction, angle, movetime;
  131. std::vector<std::vector<THUAI6::PlaceType>> mapinfo = api.GetFullMap();
  132. std::shared_ptr<const THUAI6::Student> selfinfo = api.GetSelfInfo();
  133. std::vector<std::shared_ptr<const THUAI6::Tricker>> trickerinfo = api.GetTrickers();
  134. int dir[2], i = 0, flag = 0, flag1 = 0;
  135. while (api.HaveMessage() == true)
  136. {
  137. std::pair<int64_t, std::string> s = api.GetMessage();
  138. if (selfinfo->playerID == 0 && s.first == 2)
  139. {
  140. dir[i] = std::stoi(s.second);
  141. }
  142. else if (selfinfo->playerID == 1 && s.first == 3)
  143. {
  144. dir[i] = std::stoi(s.second);
  145. }
  146. i++;
  147. flag = 1;
  148. }
  149. if (dir[0] == 3)
  150. {
  151. if (dir[1] == 1)
  152. {
  153. while (1)
  154. {
  155. DOR31:
  156. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door3 || mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door3 || mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door3 || mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door3)//дص֪Dz
  157. {
  158. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door3) != -1;
  159. angle = direction * PI / 2;
  160. movetime = 1000 / api.GetSelfInfo()->speed;
  161. api.Move(movetime, angle);
  162. }
  163. DOR3:
  164. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door3 || mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door3 || mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door3 || mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door3)
  165. {
  166. api.ThrowProp(THUAI6::PropType::Key3);
  167. if (api.MoveRight(1 / selfinfo->speed).get() == true)
  168. {
  169. while (api.IsDoorOpen(selfinfo->x, selfinfo->y + 1) == false && api.IsDoorOpen(selfinfo->x, selfinfo->y - 1) == false && api.IsDoorOpen(selfinfo->x + 1, selfinfo->y) == false && api.IsDoorOpen(selfinfo->x - 1, selfinfo->y) == false);
  170. api.MoveLeft(1 / selfinfo->speed);
  171. }
  172. else
  173. {
  174. if (api.MoveLeft(1 / selfinfo->speed).get() == true)
  175. {
  176. while (api.IsDoorOpen(selfinfo->x, selfinfo->y + 1) == false && api.IsDoorOpen(selfinfo->x, selfinfo->y - 1) == false && api.IsDoorOpen(selfinfo->x + 1, selfinfo->y) == false && api.IsDoorOpen(selfinfo->x - 1, selfinfo->y) == false);
  177. api.MoveRight(1 / selfinfo->speed);
  178. }
  179. else
  180. {
  181. if (api.MoveUp(1 / selfinfo->speed).get() == true)
  182. {
  183. while (api.IsDoorOpen(selfinfo->x, selfinfo->y + 1) == false && api.IsDoorOpen(selfinfo->x, selfinfo->y - 1) == false && api.IsDoorOpen(selfinfo->x + 1, selfinfo->y) == false && api.IsDoorOpen(selfinfo->x - 1, selfinfo->y) == false);
  184. api.MoveDown(1 / selfinfo->speed);
  185. }
  186. else
  187. {
  188. if (api.MoveDown(1 / selfinfo->speed).get() == true)
  189. {
  190. while (api.IsDoorOpen(selfinfo->x, selfinfo->y + 1) == false && api.IsDoorOpen(selfinfo->x, selfinfo->y - 1) == false && api.IsDoorOpen(selfinfo->x + 1, selfinfo->y) == false && api.IsDoorOpen(selfinfo->x - 1, selfinfo->y) == false);
  191. api.MoveUp(1 / selfinfo->speed);
  192. }
  193. }
  194. }
  195. }
  196. AGAIN11:
  197. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::ClassRoom || mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::ClassRoom || mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::ClassRoom || mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::ClassRoom)
  198. {
  199. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::ClassRoom) != -1;
  200. angle = direction * PI / 2;
  201. movetime = 1000 / api.GetSelfInfo()->speed;
  202. api.Move(movetime, angle);
  203. }
  204. while (api.UseSkill(0).get() == false && (api.GetClassroomProgress(selfinfo->x + 1, selfinfo->y) != 1) && api.GetClassroomProgress(selfinfo->x - 1, selfinfo->y) != 1 && api.GetClassroomProgress(selfinfo->x, selfinfo->y + 1) != 1 && api.GetClassroomProgress(selfinfo->x, selfinfo->y - 1) != 1)
  205. {
  206. api.StartLearning();
  207. api.Wait();
  208. api.EndAllAction();
  209. //Ƿbgm4
  210. //½mzܺ
  211. }
  212. if (api.GetClassroomProgress(selfinfo->x - 1, selfinfo->y) == 1 || api.GetClassroomProgress(selfinfo->x + 1, selfinfo->y) == 1 || api.GetClassroomProgress(selfinfo->x, selfinfo->y + 1) == 1 || api.GetClassroomProgress(selfinfo->x, selfinfo->y - 1) == 1)
  213. {
  214. mapinfo[selfinfo->x][selfinfo->y] = THUAI6::PlaceType::Wall;
  215. goto AGAIN11;
  216. flag1++;
  217. }
  218. if (flag1 == 3)
  219. {
  220. //ܺ2
  221. if (api.GetDoorProgress(d5[0], d5[1]) == 1)
  222. {
  223. mapinfo[d5[2]][d5[3]] = THUAI6::PlaceType::Wall;
  224. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door5 || mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door5 || mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door5 || mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door5)//дص֪Dz
  225. {
  226. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door3) != -1;
  227. angle = direction * PI / 2;
  228. movetime = 1000 / api.GetSelfInfo()->speed;
  229. api.Move(movetime, angle);
  230. }
  231. if (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door5 || mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door5 || mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door5 || mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door5)
  232. {
  233. api.OpenDoor();
  234. goto DOR5;
  235. }
  236. mapinfo[d5[2]][d5[3]] == THUAI6::PlaceType::Door5;
  237. }
  238. if (api.GetDoorProgress(d5[2], d5[3]) == 1)
  239. {
  240. mapinfo[d5[0]][d5[1]] == THUAI6::PlaceType::Wall;
  241. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door5 && mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door5 && mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door5 && mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door5)//дص֪Dz
  242. {
  243. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door5) != -1;
  244. angle = direction * PI / 2;
  245. movetime = 1000 / api.GetSelfInfo()->speed;
  246. api.Move(movetime, angle);
  247. }
  248. if (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door5 || mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door5 || mapinfo[selfinfo->x + 1][selfinfo->y + 1] == THUAI6::PlaceType::Door5 || mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door5)
  249. {
  250. api.OpenDoor();
  251. goto DOR5;
  252. }
  253. mapinfo[d5[2]][d5[3]] == THUAI6::PlaceType::Door5;
  254. }
  255. if (api.GetDoorProgress(d6[0], d6[1]) == 1)
  256. {
  257. mapinfo[d6[2]][d6[3]] == THUAI6::PlaceType::Wall;
  258. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))//дص֪Dz
  259. {
  260. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  261. angle = direction * PI / 2;
  262. movetime = 1000 / api.GetSelfInfo()->speed;
  263. api.Move(movetime, angle);
  264. }
  265. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door6 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door6))
  266. {
  267. api.OpenDoor();
  268. goto DOR6;
  269. }
  270. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))//дص֪Dz
  271. {
  272. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  273. angle = direction * PI / 2;
  274. movetime = 1000 / api.GetSelfInfo()->speed;
  275. api.Move(movetime, angle);
  276. }
  277. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door6 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door6))
  278. {
  279. api.OpenDoor();
  280. goto DOR6;
  281. }
  282. mapinfo[d6[2]][d6[3]] == THUAI6::PlaceType::Door6;
  283. }
  284. if (api.GetDoorProgress(d6[2], d6[3]) == 1)
  285. {
  286. mapinfo[d6[0]][d6[1]] == THUAI6::PlaceType::Wall;
  287. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6)) {
  288. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  289. angle = direction * PI / 2;
  290. movetime = 1000 / api.GetSelfInfo()->speed;
  291. api.Move(movetime, angle);
  292. }
  293. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door6 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door6)) {
  294. api.OpenDoor();
  295. goto DOR6;
  296. }
  297. mapinfo[d6[2]][d6[3]] == THUAI6::PlaceType::Door6;
  298. }
  299. }
  300. }
  301. }
  302. }
  303. }
  304. else
  305. {
  306. while (1)
  307. {
  308. DOR32:
  309. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door3 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door3))
  310. {
  311. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door3) != -1;
  312. angle = direction * PI / 2;
  313. movetime = 1000 / api.GetSelfInfo()->speed;
  314. api.Move(movetime, angle);
  315. }
  316. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door3 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door3)) {
  317. api.ThrowProp(THUAI6::PropType::Key3);
  318. if (api.MoveRight(1 / selfinfo->speed).get() == true)
  319. {
  320. while (api.IsDoorOpen(selfinfo->x, selfinfo->y + 1) == false && api.IsDoorOpen(selfinfo->x, selfinfo->y - 1) == false && api.IsDoorOpen(selfinfo->x + 1, selfinfo->y) == false && api.IsDoorOpen(selfinfo->x - 1, selfinfo->y) == false);
  321. api.MoveLeft(1 / selfinfo->speed);
  322. }
  323. else
  324. {
  325. if (api.MoveLeft(1 / selfinfo->speed).get() == true)
  326. {
  327. while (api.IsDoorOpen(selfinfo->x, selfinfo->y + 1) == false && api.IsDoorOpen(selfinfo->x, selfinfo->y - 1) == false && api.IsDoorOpen(selfinfo->x + 1, selfinfo->y) == false && api.IsDoorOpen(selfinfo->x - 1, selfinfo->y) == false);
  328. api.MoveRight(1 / selfinfo->speed);
  329. }
  330. else
  331. {
  332. if (api.MoveUp(1 / selfinfo->speed).get() == true)
  333. {
  334. while (api.IsDoorOpen(selfinfo->x, selfinfo->y + 1) == false && api.IsDoorOpen(selfinfo->x, selfinfo->y - 1) == false && api.IsDoorOpen(selfinfo->x + 1, selfinfo->y) == false && api.IsDoorOpen(selfinfo->x - 1, selfinfo->y) == false);
  335. api.MoveDown(1 / selfinfo->speed);
  336. }
  337. else
  338. {
  339. if (api.MoveDown(1 / selfinfo->speed).get() == true)
  340. {
  341. while (api.IsDoorOpen(selfinfo->x, selfinfo->y + 1) == false && api.IsDoorOpen(selfinfo->x, selfinfo->y - 1) == false && api.IsDoorOpen(selfinfo->x + 1, selfinfo->y) == false && api.IsDoorOpen(selfinfo->x - 1, selfinfo->y) == false);
  342. api.MoveUp(1 / selfinfo->speed);
  343. }
  344. }
  345. }
  346. }
  347. AGAIN12:
  348. while (mapinfo[selfinfo->x][selfinfo->y] != THUAI6::PlaceType::ClassRoom)
  349. {
  350. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::ClassRoom) != -1;
  351. angle = direction * PI / 2;
  352. movetime = 1000 / api.GetSelfInfo()->speed;
  353. api.Move(movetime, angle);
  354. }
  355. while (api.UseSkill(0).get() == false && api.GetClassroomProgress(selfinfo->x, selfinfo->y) != 1)
  356. {
  357. api.StartLearning();
  358. api.Wait();
  359. api.EndAllAction();
  360. //Ƿbgm4
  361. //½mzܺ
  362. }
  363. int flag3 = 0;
  364. if (api.GetClassroomProgress(selfinfo->x, selfinfo->y) == 1)
  365. {
  366. mapinfo[selfinfo->x][selfinfo->y] = THUAI6::PlaceType::Wall;
  367. flag3++;
  368. goto AGAIN12;
  369. }
  370. if (flag3 == 3)
  371. {
  372. if (api.GetDoorProgress(d5[0], d5[1]) == 1)
  373. {
  374. mapinfo[d5[2]][d5[3]] == THUAI6::PlaceType::Wall;
  375. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door5 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door5) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door5) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door5)) {
  376. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door3) != -1;
  377. angle = direction * PI / 2;
  378. movetime = 1000 / api.GetSelfInfo()->speed;
  379. api.Move(movetime, angle);
  380. }
  381. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door5 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door5) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door5) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door5)) {
  382. api.OpenDoor();
  383. goto DOR5;
  384. }
  385. mapinfo[d5[2]][d5[3]] == THUAI6::PlaceType::Door5;
  386. }
  387. if (api.GetDoorProgress(d5[2], d5[3]) == 1)
  388. {
  389. mapinfo[d5[0]][d5[1]] == THUAI6::PlaceType::Wall;
  390. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door5 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door5) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door5) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door5)) {
  391. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door5) != -1;
  392. angle = direction * PI / 2;
  393. movetime = 1000 / api.GetSelfInfo()->speed;
  394. api.Move(movetime, angle);
  395. }
  396. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door5 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door5) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door5) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door5)) {
  397. api.OpenDoor();
  398. goto DOR5;
  399. }
  400. mapinfo[d5[2]][d5[3]] == THUAI6::PlaceType::Door5;
  401. }
  402. if (api.GetDoorProgress(d6[0], d6[1]) == 1)
  403. {
  404. mapinfo[d6[2]][d6[3]] == THUAI6::PlaceType::Wall;
  405. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))//дص֪Dz
  406. {
  407. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  408. angle = direction * PI / 2;
  409. movetime = 1000 / api.GetSelfInfo()->speed;
  410. api.Move(movetime, angle);
  411. }
  412. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door6 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door6))
  413. {
  414. api.OpenDoor();
  415. goto DOR6;
  416. }
  417. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))//дص֪Dz
  418. {
  419. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  420. angle = direction * PI / 2;
  421. movetime = 1000 / api.GetSelfInfo()->speed;
  422. api.Move(movetime, angle);
  423. }
  424. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door6 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door6))
  425. {
  426. api.OpenDoor();
  427. goto DOR6;
  428. }
  429. mapinfo[d6[2]][d6[3]] == THUAI6::PlaceType::Door6;
  430. }
  431. if (api.GetDoorProgress(d6[2], d6[3]) == 1)
  432. {
  433. mapinfo[d6[0]][d6[1]] == THUAI6::PlaceType::Wall;
  434. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))//дص֪Dz
  435. {
  436. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  437. angle = direction * PI / 2;
  438. movetime = 1000 / api.GetSelfInfo()->speed;
  439. api.Move(movetime, angle);
  440. }
  441. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door6 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door6))
  442. {
  443. api.OpenDoor();
  444. goto DOR6;
  445. }
  446. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))//дص֪Dz
  447. {
  448. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  449. angle = direction * PI / 2;
  450. movetime = 1000 / api.GetSelfInfo()->speed;
  451. api.Move(movetime, angle);
  452. }
  453. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door6 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door6))
  454. {
  455. api.OpenDoor();
  456. goto DOR6;
  457. }
  458. mapinfo[d6[2]][d6[3]] == THUAI6::PlaceType::Door6;
  459. }
  460. }
  461. }
  462. }
  463. }
  464. if (dir[0] == 5)
  465. {
  466. if (dir[1] == 0)
  467. {
  468. while (1)
  469. {
  470. DOR51:
  471. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door5 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door5) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door5) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door5))//дص֪Dz
  472. {
  473. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door5) != -1;
  474. angle = direction * PI / 2;
  475. movetime = 1000 / api.GetSelfInfo()->speed;
  476. api.Move(movetime, angle);
  477. }
  478. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door5 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door5) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door5) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door5))
  479. {
  480. api.ThrowProp(THUAI6::PropType::Key5);
  481. //˿һ2
  482. while (api.IsDoorOpen(selfinfo->x, selfinfo->y - 1000) == false);
  483. //ϱߵ涯3
  484. AGAIN13:
  485. while (mapinfo[selfinfo->x][selfinfo->y] != THUAI6::PlaceType::ClassRoom)
  486. {
  487. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::ClassRoom) != -1;
  488. angle = direction * PI / 2;
  489. movetime = 1000 / api.GetSelfInfo()->speed;
  490. api.Move(movetime, angle);
  491. }
  492. while (api.UseSkill(0).get() == false && api.GetClassroomProgress(selfinfo->x, selfinfo->y) != 1)
  493. {
  494. api.StartLearning();
  495. api.Wait();
  496. api.EndAllAction();
  497. //Ƿbgm4
  498. //½mzܺ
  499. }
  500. int flag4 = 0;
  501. if (api.GetClassroomProgress(selfinfo->x, selfinfo->y) == 1)
  502. {
  503. mapinfo[selfinfo->x][selfinfo->y] = THUAI6::PlaceType::Wall;
  504. flag4++;
  505. goto AGAIN13;
  506. }
  507. if (flag4 == 3)
  508. {
  509. if (api.GetDoorProgress(d3[0], d3[1]) == 1)
  510. {
  511. mapinfo[d3[2]][d3[3]] == THUAI6::PlaceType::Wall;
  512. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door3 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door3))//дص֪Dz
  513. {
  514. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door5) != -1;
  515. angle = direction * PI / 2;
  516. movetime = 1000 / api.GetSelfInfo()->speed;
  517. api.Move(movetime, angle);
  518. }
  519. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door3 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door3))
  520. {
  521. api.OpenDoor();
  522. goto DOR3;
  523. }
  524. mapinfo[d3[2]][d3[3]] == THUAI6::PlaceType::Door3;
  525. }
  526. if (api.GetDoorProgress(d3[2], d3[3]) == 1)
  527. {
  528. mapinfo[d3[0]][d3[1]] == THUAI6::PlaceType::Wall;
  529. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door3 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door3))//дص֪Dz
  530. {
  531. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door3) != -1;
  532. angle = direction * PI / 2;
  533. movetime = 1000 / api.GetSelfInfo()->speed;
  534. api.Move(movetime, angle);
  535. }
  536. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door3 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door3))
  537. {
  538. api.OpenDoor();
  539. goto DOR3;
  540. }
  541. mapinfo[d3[2]][d3[3]] == THUAI6::PlaceType::Door3;
  542. }
  543. if (api.GetDoorProgress(d6[0], d6[1]) == 1)
  544. {
  545. mapinfo[d6[2]][d6[3]] == THUAI6::PlaceType::Wall;
  546. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))//дص֪Dz
  547. {
  548. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  549. angle = direction * PI / 2;
  550. movetime = 1000 / api.GetSelfInfo()->speed;
  551. api.Move(movetime, angle);
  552. }
  553. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door6 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door6))
  554. {
  555. api.OpenDoor();
  556. goto DOR6;
  557. }
  558. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))
  559. //дص֪Dz
  560. {
  561. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  562. angle = direction * PI / 2;
  563. movetime = 1000 / api.GetSelfInfo()->speed;
  564. api.Move(movetime, angle);
  565. }
  566. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door6 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door6))
  567. {
  568. api.OpenDoor();
  569. goto DOR6;
  570. }
  571. mapinfo[d3[2]][d3[3]] == THUAI6::PlaceType::Door6;
  572. }
  573. if (api.GetDoorProgress(d6[2], d6[3]) == 1)
  574. {
  575. mapinfo[d6[0]][d6[1]] == THUAI6::PlaceType::Wall;
  576. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))
  577. //дص֪Dz
  578. {
  579. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  580. angle = direction * PI / 2;
  581. movetime = 1000 / api.GetSelfInfo()->speed;
  582. api.Move(movetime, angle);
  583. }
  584. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door6 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door6))
  585. {
  586. api.OpenDoor();
  587. goto DOR6;
  588. }
  589. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))
  590. //дص֪Dz
  591. {
  592. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  593. angle = direction * PI / 2;
  594. movetime = 1000 / api.GetSelfInfo()->speed;
  595. api.Move(movetime, angle);
  596. }
  597. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door6 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door6))
  598. {
  599. api.OpenDoor();
  600. goto DOR6;
  601. }
  602. mapinfo[d3[0]][d3[1]] == THUAI6::PlaceType::Door6;
  603. }
  604. }
  605. }
  606. }
  607. }
  608. else
  609. {
  610. while (1)
  611. {
  612. DOR52:
  613. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door5 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door5) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door5) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door5))//дص֪Dz
  614. {
  615. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door5) != -1;
  616. angle = direction * PI / 2;
  617. movetime = 1000 / api.GetSelfInfo()->speed;
  618. api.Move(movetime, angle);
  619. }
  620. DOR5:
  621. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door5 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door5) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door5) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door5))
  622. {
  623. api.ThrowProp(THUAI6::PropType::Key5);
  624. if (api.MoveRight(1 / selfinfo->speed).get() == true)
  625. {
  626. while (api.IsDoorOpen(selfinfo->x, selfinfo->y + 1) == false && api.IsDoorOpen(selfinfo->x, selfinfo->y - 1) == false && api.IsDoorOpen(selfinfo->x + 1, selfinfo->y) == false && api.IsDoorOpen(selfinfo->x - 1, selfinfo->y) == false);
  627. api.MoveLeft(1 / selfinfo->speed);
  628. }
  629. else
  630. {
  631. if (api.MoveLeft(1 / selfinfo->speed).get() == true)
  632. {
  633. while (api.IsDoorOpen(selfinfo->x, selfinfo->y + 1) == false && api.IsDoorOpen(selfinfo->x, selfinfo->y - 1) == false && api.IsDoorOpen(selfinfo->x + 1, selfinfo->y) == false && api.IsDoorOpen(selfinfo->x - 1, selfinfo->y) == false);
  634. api.MoveRight(1 / selfinfo->speed);
  635. }
  636. else
  637. {
  638. if (api.MoveUp(1 / selfinfo->speed).get() == true)
  639. {
  640. while (api.IsDoorOpen(selfinfo->x, selfinfo->y + 1) == false && api.IsDoorOpen(selfinfo->x, selfinfo->y - 1) == false && api.IsDoorOpen(selfinfo->x + 1, selfinfo->y) == false && api.IsDoorOpen(selfinfo->x - 1, selfinfo->y) == false);
  641. api.MoveDown(1 / selfinfo->speed);
  642. }
  643. else
  644. {
  645. if (api.MoveDown(1 / selfinfo->speed).get() == true)
  646. {
  647. while (api.IsDoorOpen(selfinfo->x, selfinfo->y + 1) == false && api.IsDoorOpen(selfinfo->x, selfinfo->y - 1) == false && api.IsDoorOpen(selfinfo->x + 1, selfinfo->y) == false && api.IsDoorOpen(selfinfo->x - 1, selfinfo->y) == false);
  648. api.MoveUp(1 / selfinfo->speed);
  649. }
  650. }
  651. }
  652. }
  653. AGAIN14:
  654. while (mapinfo[selfinfo->x][selfinfo->y] != THUAI6::PlaceType::ClassRoom)
  655. {
  656. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::ClassRoom) != -1;
  657. angle = direction * PI / 2;
  658. movetime = 1000 / api.GetSelfInfo()->speed;
  659. api.Move(movetime, angle);
  660. }
  661. while (api.UseSkill(0).get() == false && api.GetClassroomProgress(selfinfo->x, selfinfo->y) != 1)
  662. {
  663. api.StartLearning();
  664. api.Wait();
  665. api.EndAllAction();
  666. //Ƿbgm4
  667. //½mzܺ
  668. }
  669. int flag5 = 0;
  670. if (api.GetClassroomProgress(selfinfo->x, selfinfo->y) == 1)
  671. {
  672. mapinfo[selfinfo->x][selfinfo->y] = THUAI6::PlaceType::Wall;
  673. flag5++;
  674. goto AGAIN14;
  675. }
  676. if (flag5 == 3)
  677. {
  678. if (api.GetDoorProgress(d3[0], d3[1]) == 1)
  679. {
  680. mapinfo[d3[2]][d3[3]] == THUAI6::PlaceType::Wall;
  681. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door3 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door3))//дص֪Dz
  682. {
  683. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door5) != -1;
  684. angle = direction * PI / 2;
  685. movetime = 1000 / api.GetSelfInfo()->speed;
  686. api.Move(movetime, angle);
  687. }
  688. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door3 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door3))
  689. {
  690. api.OpenDoor();
  691. goto DOR3;
  692. }
  693. mapinfo[d3[2]][d3[3]] == THUAI6::PlaceType::Door3;
  694. }
  695. if (api.GetDoorProgress(d3[2], d3[3]) == 1)
  696. {
  697. mapinfo[d3[0]][d3[1]] == THUAI6::PlaceType::Wall;
  698. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door3 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door3))//дص֪Dz
  699. {
  700. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door3) != -1;
  701. angle = direction * PI / 2;
  702. movetime = 1000 / api.GetSelfInfo()->speed;
  703. api.Move(movetime, angle);
  704. }
  705. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door3 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door3))
  706. {
  707. api.OpenDoor();
  708. goto DOR3;
  709. }
  710. mapinfo[d3[2]][d3[3]] == THUAI6::PlaceType::Door3;
  711. }
  712. if (api.GetDoorProgress(d6[0], d6[1]) == 1)
  713. {
  714. mapinfo[d6[2]][d6[3]] == THUAI6::PlaceType::Wall;
  715. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))//дص֪Dz
  716. {
  717. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  718. angle = direction * PI / 2;
  719. movetime = 1000 / api.GetSelfInfo()->speed;
  720. api.Move(movetime, angle);
  721. }
  722. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door6 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door6))
  723. {
  724. api.OpenDoor();
  725. goto DOR6;
  726. }
  727. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))//дص֪Dz
  728. {
  729. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  730. angle = direction * PI / 2;
  731. movetime = 1000 / api.GetSelfInfo()->speed;
  732. api.Move(movetime, angle);
  733. }
  734. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door6 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door6))
  735. {
  736. api.OpenDoor();
  737. goto DOR6;
  738. }
  739. mapinfo[d3[2]][d3[3]] == THUAI6::PlaceType::Door6;
  740. }
  741. if (api.GetDoorProgress(d6[2], d6[3]) == 1)
  742. {
  743. mapinfo[d6[0]][d6[1]] == THUAI6::PlaceType::Wall;
  744. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))
  745. //дص֪Dz
  746. {
  747. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  748. angle = direction * PI / 2;
  749. movetime = 1000 / api.GetSelfInfo()->speed;
  750. api.Move(movetime, angle);
  751. }
  752. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door6 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door6))
  753. {
  754. api.OpenDoor();
  755. goto DOR6;
  756. }
  757. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))
  758. //дص֪Dz
  759. {
  760. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  761. angle = direction * PI / 2;
  762. movetime = 1000 / api.GetSelfInfo()->speed;
  763. api.Move(movetime, angle);
  764. }
  765. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door6 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door6))
  766. {
  767. api.OpenDoor();
  768. goto DOR6;
  769. }
  770. mapinfo[d3[0]][d3[1]] == THUAI6::PlaceType::Door6;
  771. }
  772. }
  773. }
  774. }
  775. }
  776. }
  777. if (dir[0] == 6)
  778. {
  779. if (dir[1] == 0)
  780. {
  781. while (1)
  782. {
  783. DOR61:
  784. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))//дص֪Dz
  785. {
  786. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  787. angle = direction * PI / 2;
  788. movetime = 1000 / api.GetSelfInfo()->speed;
  789. api.Move(movetime, angle);
  790. }
  791. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door6 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door6))
  792. {
  793. api.ThrowProp(THUAI6::PropType::Key6);
  794. //˿һ2
  795. while (api.IsDoorOpen(selfinfo->x, selfinfo->y - 1000) == false);
  796. //ϱߵ涯3
  797. AGAIN15:
  798. while (mapinfo[selfinfo->x][selfinfo->y] != THUAI6::PlaceType::ClassRoom)
  799. {
  800. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::ClassRoom) != -1;
  801. angle = direction * PI / 2;
  802. movetime = 1000 / api.GetSelfInfo()->speed;
  803. api.Move(movetime, angle);
  804. }
  805. while (api.UseSkill(0).get() == false && api.GetClassroomProgress(selfinfo->x, selfinfo->y) != 1)
  806. {
  807. api.StartLearning();
  808. api.Wait();
  809. api.EndAllAction();
  810. //Ƿbgm4
  811. //½mzܺ
  812. }
  813. int flag6 = 0;
  814. if (api.GetClassroomProgress(selfinfo->x, selfinfo->y) == 1)
  815. {
  816. mapinfo[selfinfo->x][selfinfo->y] = THUAI6::PlaceType::Wall;
  817. flag6++;
  818. goto AGAIN15;
  819. }
  820. if (flag6 == 3)
  821. {
  822. if (api.GetDoorProgress(d6[0], d6[1]) == 1)
  823. {
  824. mapinfo[d6[2]][d6[3]] == THUAI6::PlaceType::Wall;
  825. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))
  826. //дص֪Dz
  827. {
  828. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door5) != -1;
  829. angle = direction * PI / 2;
  830. movetime = 1000 / api.GetSelfInfo()->speed;
  831. api.Move(movetime, angle);
  832. }
  833. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door6 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door6))
  834. {
  835. api.OpenDoor();
  836. goto DOR6;
  837. }
  838. mapinfo[d6[2]][d6[3]] == THUAI6::PlaceType::Door6;
  839. }
  840. if (api.GetDoorProgress(d6[2], d6[3]) == 1)
  841. {
  842. mapinfo[d6[0]][d6[1]] == THUAI6::PlaceType::Wall;
  843. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))//дص֪Dz
  844. {
  845. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  846. angle = direction * PI / 2;
  847. movetime = 1000 / api.GetSelfInfo()->speed;
  848. api.Move(movetime, angle);
  849. }
  850. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door6 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door6))
  851. {
  852. api.OpenDoor();
  853. goto DOR6;
  854. }
  855. mapinfo[d3[2]][d3[3]] == THUAI6::PlaceType::Door6;
  856. }
  857. if (api.GetDoorProgress(d3[0], d3[1]) == 1)
  858. {
  859. mapinfo[d3[2]][d3[3]] == THUAI6::PlaceType::Wall;
  860. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door3 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door3))//дص֪Dz
  861. {
  862. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door3) != -1;
  863. angle = direction * PI / 2;
  864. movetime = 1000 / api.GetSelfInfo()->speed;
  865. api.Move(movetime, angle);
  866. }
  867. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door3 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door3))
  868. {
  869. api.OpenDoor();
  870. goto DOR3;
  871. }
  872. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door3 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door3))//дص֪Dz
  873. {
  874. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door3) != -1;
  875. angle = direction * PI / 2;
  876. movetime = 1000 / api.GetSelfInfo()->speed;
  877. api.Move(movetime, angle);
  878. }
  879. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door3 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door3))
  880. {
  881. api.OpenDoor();
  882. goto DOR3;
  883. }
  884. mapinfo[d6[2]][d6[3]] == THUAI6::PlaceType::Door3;
  885. }
  886. if (api.GetDoorProgress(d3[2], d3[3]) == 1)
  887. {
  888. mapinfo[d3[0]][d3[1]] == THUAI6::PlaceType::Wall;
  889. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door3 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door3))//дص֪Dz
  890. {
  891. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door3) != -1;
  892. angle = direction * PI / 2;
  893. movetime = 1000 / api.GetSelfInfo()->speed;
  894. api.Move(movetime, angle);
  895. }
  896. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door3 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door3))
  897. {
  898. api.OpenDoor();
  899. goto DOR3;
  900. }
  901. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door3 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door3))//дص֪Dz
  902. {
  903. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door3) != -1;
  904. angle = direction * PI / 2;
  905. movetime = 1000 / api.GetSelfInfo()->speed;
  906. api.Move(movetime, angle);
  907. }
  908. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door3 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door3))
  909. {
  910. api.OpenDoor();
  911. goto DOR3;
  912. }
  913. mapinfo[d6[0]][d6[1]] == THUAI6::PlaceType::Door3;
  914. }
  915. }
  916. }
  917. }
  918. }
  919. else
  920. {
  921. while (1)
  922. {
  923. DOR62:
  924. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))//дص֪Dz
  925. {
  926. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  927. angle = direction * PI / 2;
  928. movetime = 1000 / api.GetSelfInfo()->speed;
  929. api.Move(movetime, angle);
  930. }
  931. DOR6:
  932. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door6 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door6))
  933. {
  934. api.ThrowProp(THUAI6::PropType::Key6);
  935. if (api.MoveRight(1 / selfinfo->speed).get() == true)
  936. {
  937. while (api.IsDoorOpen(selfinfo->x, selfinfo->y + 1) == false && api.IsDoorOpen(selfinfo->x, selfinfo->y - 1) == false && api.IsDoorOpen(selfinfo->x + 1, selfinfo->y) == false && api.IsDoorOpen(selfinfo->x - 1, selfinfo->y) == false);
  938. api.MoveLeft(1 / selfinfo->speed);
  939. }
  940. else
  941. {
  942. if (api.MoveLeft(1 / selfinfo->speed).get() == true)
  943. {
  944. while (api.IsDoorOpen(selfinfo->x, selfinfo->y + 1) == false && api.IsDoorOpen(selfinfo->x, selfinfo->y - 1) == false && api.IsDoorOpen(selfinfo->x + 1, selfinfo->y) == false && api.IsDoorOpen(selfinfo->x - 1, selfinfo->y) == false);
  945. api.MoveRight(1 / selfinfo->speed);
  946. }
  947. else
  948. {
  949. if (api.MoveUp(1 / selfinfo->speed).get() == true)
  950. {
  951. while (api.IsDoorOpen(selfinfo->x, selfinfo->y + 1) == false && api.IsDoorOpen(selfinfo->x, selfinfo->y - 1) == false && api.IsDoorOpen(selfinfo->x + 1, selfinfo->y) == false && api.IsDoorOpen(selfinfo->x - 1, selfinfo->y) == false);
  952. api.MoveDown(1 / selfinfo->speed);
  953. }
  954. else
  955. {
  956. if (api.MoveDown(1 / selfinfo->speed).get() == true)
  957. {
  958. while (api.IsDoorOpen(selfinfo->x, selfinfo->y + 1) == false && api.IsDoorOpen(selfinfo->x, selfinfo->y - 1) == false && api.IsDoorOpen(selfinfo->x + 1, selfinfo->y) == false && api.IsDoorOpen(selfinfo->x - 1, selfinfo->y) == false);
  959. api.MoveUp(1 / selfinfo->speed);
  960. }
  961. }
  962. }
  963. }
  964. AGAIN16:
  965. while (mapinfo[selfinfo->x][selfinfo->y] != THUAI6::PlaceType::ClassRoom)
  966. {
  967. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::ClassRoom) != -1;
  968. angle = direction * PI / 2;
  969. movetime = 1000 / api.GetSelfInfo()->speed;
  970. api.Move(movetime, angle);
  971. }
  972. while (api.UseSkill(0).get() == false && api.GetClassroomProgress(selfinfo->x, selfinfo->y) != 1)
  973. {
  974. api.StartLearning();
  975. api.Wait();
  976. api.EndAllAction();
  977. //Ƿbgm4
  978. //½mzܺ
  979. }
  980. int flag7 = 0;
  981. if (api.GetClassroomProgress(selfinfo->x, selfinfo->y) == 1)
  982. {
  983. mapinfo[selfinfo->x][selfinfo->y] = THUAI6::PlaceType::Wall;
  984. flag7++;
  985. goto AGAIN16;
  986. }
  987. if (flag7 == 3)
  988. {
  989. if (api.GetDoorProgress(d6[0], d6[1]) == 1)
  990. {
  991. mapinfo[d6[2]][d6[3]] == THUAI6::PlaceType::Wall;
  992. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))
  993. //дص֪Dz
  994. {
  995. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door5) != -1;
  996. angle = direction * PI / 2;
  997. movetime = 1000 / api.GetSelfInfo()->speed;
  998. api.Move(movetime, angle);
  999. }
  1000. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door6 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door6))
  1001. {
  1002. api.OpenDoor();
  1003. goto DOR6;
  1004. }
  1005. mapinfo[d6[2]][d6[3]] == THUAI6::PlaceType::Door6;
  1006. }
  1007. if (api.GetDoorProgress(d6[2], d6[3]) == 1)
  1008. {
  1009. mapinfo[d6[0]][d6[1]] == THUAI6::PlaceType::Wall;
  1010. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))//дص֪Dz
  1011. {
  1012. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  1013. angle = direction * PI / 2;
  1014. movetime = 1000 / api.GetSelfInfo()->speed;
  1015. api.Move(movetime, angle);
  1016. }
  1017. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door6 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door6))
  1018. {
  1019. api.OpenDoor();
  1020. goto DOR6;
  1021. }
  1022. mapinfo[d3[2]][d3[3]] == THUAI6::PlaceType::Door6;
  1023. }
  1024. if (api.GetDoorProgress(d3[0], d3[1]) == 1)
  1025. {
  1026. mapinfo[d3[2]][d3[3]] == THUAI6::PlaceType::Wall;
  1027. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door3 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door3))//дص֪Dz
  1028. {
  1029. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door3) != -1;
  1030. angle = direction * PI / 2;
  1031. movetime = 1000 / api.GetSelfInfo()->speed;
  1032. api.Move(movetime, angle);
  1033. }
  1034. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door3 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door3))
  1035. {
  1036. api.OpenDoor();
  1037. goto DOR3;
  1038. }
  1039. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door3 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door3))//дص֪Dz
  1040. {
  1041. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door3) != -1;
  1042. angle = direction * PI / 2;
  1043. movetime = 1000 / api.GetSelfInfo()->speed;
  1044. api.Move(movetime, angle);
  1045. }
  1046. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door3 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door3))
  1047. {
  1048. api.OpenDoor();
  1049. goto DOR3;
  1050. }
  1051. mapinfo[d6[2]][d6[3]] == THUAI6::PlaceType::Door3;
  1052. }
  1053. if (api.GetDoorProgress(d3[2], d3[3]) == 1)
  1054. {
  1055. mapinfo[d3[0]][d3[1]] == THUAI6::PlaceType::Wall;
  1056. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door3 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door3))//дص֪Dz
  1057. {
  1058. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door3) != -1;
  1059. angle = direction * PI / 2;
  1060. movetime = 1000 / api.GetSelfInfo()->speed;
  1061. api.Move(movetime, angle);
  1062. }
  1063. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door3 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door3))
  1064. {
  1065. api.OpenDoor();
  1066. goto DOR3;
  1067. }
  1068. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door3 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door3))//дص֪Dz
  1069. {
  1070. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door3) != -1;
  1071. angle = direction * PI / 2;
  1072. movetime = 1000 / api.GetSelfInfo()->speed;
  1073. api.Move(movetime, angle);
  1074. }
  1075. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door3 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door3))
  1076. {
  1077. api.OpenDoor();
  1078. goto DOR3;
  1079. }
  1080. mapinfo[d6[0]][d6[1]] = THUAI6::PlaceType::Door3;
  1081. }
  1082. }
  1083. }
  1084. }
  1085. }
  1086. }
  1087. if (trickerinfo[0]->trickerType == THUAI6::TrickerType::ANoisyPerson)
  1088. {
  1089. while (trickerinfo[0]->trickDesire > 0)
  1090. {
  1091. int firstAlert = trickerinfo[0]->trickDesire;
  1092. // õdangerAlertı仯
  1093. int movetime = 100 / api.GetSelfInfo()->speed;
  1094. api.Move(movetime, 0);
  1095. int secondAlert = api.GetSelfInfo()->dangerAlert;
  1096. // õdangerAlertı仯
  1097. api.Move(movetime, PI / 2);
  1098. int thirdAlert = api.GetSelfInfo()->dangerAlert;
  1099. // dangerAlertݶȣΪķ
  1100. double gradient = getGraident(secondAlert - firstAlert, thirdAlert - secondAlert);
  1101. // ݶȷ
  1102. movetime *= 10;
  1103. api.Move(movetime, gradient);
  1104. if (api.GetSelfInfo()->dangerAlert == 0) break;
  1105. if (speed == 1 && trickerinfo[0]->trickDesire != 0)
  1106. {
  1107. api.UseProp(THUAI6::PropType::AddSpeed);
  1108. }
  1109. if (life == 1 && selfinfo->determination < 1500000)
  1110. {
  1111. api.UseProp(THUAI6::PropType::AddLifeOrClairaudience);
  1112. }
  1113. if (hp == 1 && selfinfo->determination < 1500000)
  1114. {
  1115. api.UseProp(THUAI6::PropType::AddHpOrAp);
  1116. }
  1117. std::vector<std::shared_ptr<const THUAI6::Bullet>> danger = api.GetBullets();
  1118. if (shield == 1 && getDistance(danger[0]->x, danger[0]->y, selfinfo->x, selfinfo->y) < 0.1)
  1119. {
  1120. api.UseProp(THUAI6::PropType::ShieldOrSpear);
  1121. }
  1122. if (rec == 1 && selfinfo->playerState == THUAI6::PlayerState::Stunned)
  1123. {
  1124. api.UseProp(THUAI6::PropType::RecoveryFromDizziness);
  1125. }//daoju
  1126. }
  1127. }
  1128. while (selfinfo->dangerAlert > 0)
  1129. {
  1130. int firstAlert = selfinfo->dangerAlert;
  1131. // õdangerAlertı仯
  1132. int movetime = 100 / api.GetSelfInfo()->speed;
  1133. api.Move(movetime, 0);
  1134. int secondAlert = api.GetSelfInfo()->dangerAlert;
  1135. // õdangerAlertı仯
  1136. api.Move(movetime, PI / 2);
  1137. int thirdAlert = api.GetSelfInfo()->dangerAlert;
  1138. // dangerAlertݶȣΪķ
  1139. double gradient = getGraident(secondAlert - firstAlert, thirdAlert - secondAlert);
  1140. // ݶȷ
  1141. movetime *= 10;
  1142. api.Move(movetime, gradient);
  1143. if (api.GetSelfInfo()->dangerAlert == 0) break;
  1144. if (speed == 1 && selfinfo->dangerAlert != 0)
  1145. {
  1146. api.UseProp(THUAI6::PropType::AddSpeed);
  1147. }
  1148. if (life == 1 && selfinfo->determination < 1500000)
  1149. {
  1150. api.UseProp(THUAI6::PropType::AddLifeOrClairaudience);
  1151. }
  1152. if (hp == 1 && selfinfo->determination < 1500000)
  1153. {
  1154. api.UseProp(THUAI6::PropType::AddHpOrAp);
  1155. }
  1156. std::vector<std::shared_ptr<const THUAI6::Bullet>> danger = api.GetBullets();
  1157. if (shield == 1 && getDistance(danger[0]->x, danger[0]->y, selfinfo->x, selfinfo->y) < 0.1)
  1158. {
  1159. api.UseProp(THUAI6::PropType::ShieldOrSpear);
  1160. }
  1161. if (rec == 1 && selfinfo->playerState == THUAI6::PlayerState::Stunned)
  1162. {
  1163. api.UseProp(THUAI6::PropType::RecoveryFromDizziness);
  1164. }//daoju
  1165. }
  1166. if (api.GetClassroomProgress(c[0], c[1]) + api.GetClassroomProgress(c[3], c[2]) + api.GetClassroomProgress(c[5], c[4]) + api.GetClassroomProgress(c[7], c[6]) + api.GetClassroomProgress(c[9], c[8]) + api.GetClassroomProgress(c[11], c[10]) + api.GetClassroomProgress(c[13], c[12]) + api.GetClassroomProgress(c[15], c[14]) + api.GetClassroomProgress(c[17], c[16]) + api.GetClassroomProgress(c[19], c[18]) >= 7)
  1167. {
  1168. while (mapinfo[selfinfo->x][selfinfo->y] != THUAI6::PlaceType::Gate)
  1169. {
  1170. double direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Gate) != -1;
  1171. double angle = direction * PI / 2;
  1172. double movetime = 1000 / api.GetSelfInfo()->speed;
  1173. api.Move(movetime, angle);
  1174. }
  1175. if (mapinfo[selfinfo->x][selfinfo->y] == THUAI6::PlaceType::Gate)
  1176. api.StartOpenGate();
  1177. if (api.GetGateProgress(g[0], g[1]) == 1 || api.GetGateProgress(g[2], g[3]) == 1) api.Graduate();
  1178. }//biye
  1179. std::vector<std::shared_ptr<const THUAI6::Student>> stuinfo = api.GetStudents();
  1180. if (selfinfo->playerID == 2 || selfinfo->playerID == 3)
  1181. {
  1182. if (stuinfo[0]->determination <= 1800000 || selfinfo->determination <= 1800000)
  1183. {
  1184. api.UseSkill(1);//ѧԵѪͣʹ
  1185. if (stuinfo[0]->determination <= 1800000 || selfinfo->determination <= 1800000)
  1186. {
  1187. if (stuinfo[0]->determination < selfinfo->determination)
  1188. {
  1189. if (selfinfo->playerID == 2) api.StartEncourageMate(0);
  1190. else api.StartEncourageMate(1);
  1191. }
  1192. }
  1193. }
  1194. if (stuinfo[0]->determination == 0 || selfinfo->determination == 0)
  1195. {
  1196. api.UseSkill(0);
  1197. if (stuinfo[0]->determination == 0)
  1198. {
  1199. if (selfinfo->playerID == 2) api.StartRouseMate(0);
  1200. else api.StartRouseMate(1);
  1201. }
  1202. }
  1203. if (selfinfo->dangerAlert > 0)
  1204. {
  1205. api.UseSkill(1);
  1206. }
  1207. }
  1208. else
  1209. {
  1210. if (stuinfo[0]->determination <= 1800000 || selfinfo->determination <= 1800000)
  1211. {
  1212. if (stuinfo[0]->determination < selfinfo->determination)
  1213. {
  1214. if (selfinfo->playerID == 0) api.StartEncourageMate(2);
  1215. else api.StartEncourageMate(3);
  1216. }
  1217. }
  1218. if (stuinfo[0]->determination == 0 || selfinfo->determination == 0)
  1219. {
  1220. if (selfinfo->playerID == 0) api.StartRouseMate(2);
  1221. else api.StartRouseMate(3);
  1222. }
  1223. }
  1224. }
  1225. void AI::play(IStudentAPI& api)
  1226. {
  1227. std::vector<std::vector<THUAI6::PlaceType>> mapinfo = api.GetFullMap();
  1228. std::shared_ptr<const THUAI6::Student> selfinfo = api.GetSelfInfo();
  1229. short has_3 = 0, has_5 = 0, has_6 = 0, speed = 0, life = 0, hp = 0, shield = 0, rec = 0;//
  1230. int chests[Constants::numOfChest * 2]; int* c = chests;
  1231. int dor3[4], dor5[4], dor6[4], gate[4];
  1232. int* d3 = dor3, * d5 = dor5, * d6 = dor6, * g = gate;
  1233. double tran, d1, d2;
  1234. int id = this->playerID;
  1235. int flag = 0, goal = 0, flag1 = 0, flag2 = 0, flag3 = 0, flag4 = 0, flag5 = 0, flag6 = 0, flag7 = 0, flag8 = 0, flag9 = 0, flag10 = 0, flag11 = 0, flag12 = 0, flag13 = 0, flag14 = 0;
  1236. std::string s1, s2, s3, s4, sd0, sd1, sd2, sd3;
  1237. double direction, angle;
  1238. int movetime;
  1239. int i = 0, j = 0, NUM = 0;//ѭ
  1240. if (this->playerID == 0 || this->playerID == 1)
  1241. {
  1242. for (i = 0; i < 50; i++)
  1243. {
  1244. for (j = 0; j < 50; j++)
  1245. {
  1246. if (mapinfo[i][j] == THUAI6::PlaceType::Chest)
  1247. {
  1248. *c = i; c++; *c = j; c++;
  1249. }
  1250. if (mapinfo[i][j] == THUAI6::PlaceType::Door3)
  1251. {
  1252. *d3 = i; d3++; *d3 = j;
  1253. }
  1254. if (mapinfo[i][j] == THUAI6::PlaceType::Door5)
  1255. {
  1256. *d5 = i; d5++; *d5 = j;
  1257. }
  1258. if (mapinfo[i][j] == THUAI6::PlaceType::Door6)
  1259. {
  1260. *d6 = i; d6++; *d6 = j;
  1261. }
  1262. if (mapinfo[i][j] == THUAI6::PlaceType::Gate)
  1263. {
  1264. *g = i; g++; *g = j;
  1265. }
  1266. }
  1267. }
  1268. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  1269. for (int i = 0; i < Constants::numOfChest * 2; i += 2)
  1270. {
  1271. for (int j = i + 2; j < Constants::numOfChest * 2; j += 2)
  1272. {
  1273. d1 = getDistance(selfinfo->x, selfinfo->y, c[i], c[i + 1]);
  1274. d2 = getDistance(selfinfo->x, selfinfo->y, c[j], c[j + 1]);
  1275. if (d2 < d1)
  1276. {
  1277. tran = c[j]; c[j] = c[i]; c[i] = tran;
  1278. tran = c[j + 1]; c[j + 1] = c[i + 1]; c[i + 1] = tran;
  1279. }
  1280. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  1281. }
  1282. }
  1283. while (1)
  1284. {
  1285. std::string sc1 = std::to_string(c[NUM]), sc2 = std::to_string(c[NUM + 1]);
  1286. goal = NUM;
  1287. if (NUM == Constants::numOfChest * 2) break;
  1288. else NUM++;
  1289. if (api.GetChestProgress(c[goal], c[goal + 1]) != 1) flag = 1;//̽Ƿ񱻿
  1290. //ûҵԿ,Уֱ1->interrupt
  1291. while (flag == 1 && api.GetChestProgress(c[goal], c[goal + 1]) != 1 && flag2 != 1)
  1292. {
  1293. if (mapinfo[selfinfo->x][selfinfo->y] == THUAI6::PlaceType::Chest)
  1294. {
  1295. flag2 = 1;//
  1296. }
  1297. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Chest) != -1;
  1298. angle = direction * PI / 2;
  1299. movetime = 1000 / api.GetSelfInfo()->speed;
  1300. api.Move(movetime, angle);
  1301. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  1302. }//
  1303. if (flag2 == 1)
  1304. {
  1305. while (api.GetChestProgress(c[goal], c[goal + 1]) != 1) api.StartOpenChest();//
  1306. mapinfo[i][j] = THUAI6::PlaceType::Wall;
  1307. flag = 0;
  1308. if (api.PickProp(THUAI6::PropType::Key3).get()) has_3 = 1;
  1309. if (api.PickProp(THUAI6::PropType::Key5).get()) has_5 = 1;
  1310. if (api.PickProp(THUAI6::PropType::Key6).get()) has_6 = 1;
  1311. if (api.PickProp(THUAI6::PropType::AddSpeed).get()) speed = 1;
  1312. if (api.PickProp(THUAI6::PropType::AddLifeOrClairaudience).get()) life = 1;
  1313. if (api.PickProp(THUAI6::PropType::AddHpOrAp).get()) hp = 1;
  1314. if (api.PickProp(THUAI6::PropType::ShieldOrSpear).get()) shield = 1;
  1315. if (api.PickProp(THUAI6::PropType::RecoveryFromDizziness).get()) rec = 1;
  1316. if ((has_3 + has_5 + has_6 + speed + life + hp + shield + rec) == 3) break;//
  1317. }
  1318. if (has_3 == 1)
  1319. {
  1320. d1 = getDistance(selfinfo->x, selfinfo->y, d3[0], d3[1]);
  1321. d2 = getDistance(selfinfo->x, selfinfo->y, d3[2], d3[3]);
  1322. if (d1 >= d2)
  1323. {
  1324. if (id == 0)
  1325. {
  1326. api.SendTextMessage(2, "2");
  1327. api.SendTextMessage(2, "3");
  1328. }
  1329. else
  1330. {
  1331. api.SendTextMessage(3, "2");
  1332. api.SendTextMessage(3, "3");
  1333. }
  1334. DOR31:
  1335. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door3 || mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door3 || mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door3 || mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door3)//дص֪Dz
  1336. {
  1337. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door3) != -1;
  1338. angle = direction * PI / 2;
  1339. movetime = 1000 / api.GetSelfInfo()->speed;
  1340. api.Move(movetime, angle);
  1341. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  1342. }
  1343. DOR3:
  1344. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door3 || mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door3 || mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door3 || mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door3)
  1345. {
  1346. api.ThrowProp(THUAI6::PropType::Key3);
  1347. if (api.MoveRight(1 / selfinfo->speed).get() == true)
  1348. {
  1349. while (api.IsDoorOpen(selfinfo->x, selfinfo->y + 1) == false && api.IsDoorOpen(selfinfo->x, selfinfo->y - 1) == false && api.IsDoorOpen(selfinfo->x + 1, selfinfo->y) == false && api.IsDoorOpen(selfinfo->x - 1, selfinfo->y) == false);
  1350. api.MoveLeft(1 / selfinfo->speed);
  1351. }
  1352. else
  1353. {
  1354. if (api.MoveLeft(1 / selfinfo->speed).get() == true)
  1355. {
  1356. while (api.IsDoorOpen(selfinfo->x, selfinfo->y + 1) == false && api.IsDoorOpen(selfinfo->x, selfinfo->y - 1) == false && api.IsDoorOpen(selfinfo->x + 1, selfinfo->y) == false && api.IsDoorOpen(selfinfo->x - 1, selfinfo->y) == false);
  1357. api.MoveRight(1 / selfinfo->speed);
  1358. }
  1359. else
  1360. {
  1361. if (api.MoveUp(1 / selfinfo->speed).get() == true)
  1362. {
  1363. while (api.IsDoorOpen(selfinfo->x, selfinfo->y + 1) == false && api.IsDoorOpen(selfinfo->x, selfinfo->y - 1) == false && api.IsDoorOpen(selfinfo->x + 1, selfinfo->y) == false && api.IsDoorOpen(selfinfo->x - 1, selfinfo->y) == false);
  1364. api.MoveDown(1 / selfinfo->speed);
  1365. }
  1366. else
  1367. {
  1368. if (api.MoveDown(1 / selfinfo->speed).get() == true)
  1369. {
  1370. while (api.IsDoorOpen(selfinfo->x, selfinfo->y + 1) == false && api.IsDoorOpen(selfinfo->x, selfinfo->y - 1) == false && api.IsDoorOpen(selfinfo->x + 1, selfinfo->y) == false && api.IsDoorOpen(selfinfo->x - 1, selfinfo->y) == false);
  1371. api.MoveUp(1 / selfinfo->speed);
  1372. }
  1373. }
  1374. }
  1375. }
  1376. AGAIN11:
  1377. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::ClassRoom || mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::ClassRoom || mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::ClassRoom || mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::ClassRoom)
  1378. {
  1379. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::ClassRoom) != -1;
  1380. angle = direction * PI / 2;
  1381. movetime = 1000 / api.GetSelfInfo()->speed;
  1382. api.Move(movetime, angle);
  1383. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  1384. }
  1385. while (api.UseSkill(0).get() == false && (api.GetClassroomProgress(selfinfo->x + 1, selfinfo->y) != 1) && api.GetClassroomProgress(selfinfo->x - 1, selfinfo->y) != 1 && api.GetClassroomProgress(selfinfo->x, selfinfo->y + 1) != 1 && api.GetClassroomProgress(selfinfo->x, selfinfo->y - 1) != 1)
  1386. {
  1387. api.StartLearning();
  1388. api.Wait();
  1389. api.EndAllAction();
  1390. //Ƿbgm4
  1391. //½mzܺ
  1392. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  1393. }
  1394. if (api.GetClassroomProgress(selfinfo->x - 1, selfinfo->y) == 1 || api.GetClassroomProgress(selfinfo->x + 1, selfinfo->y) == 1 || api.GetClassroomProgress(selfinfo->x, selfinfo->y + 1) == 1 || api.GetClassroomProgress(selfinfo->x, selfinfo->y - 1) == 1)
  1395. {
  1396. mapinfo[selfinfo->x][selfinfo->y] = THUAI6::PlaceType::Wall;
  1397. goto AGAIN11;
  1398. flag1++;
  1399. }
  1400. if (flag1 == 3)
  1401. {
  1402. //ܺ2
  1403. if (api.GetDoorProgress(d5[0], d5[1]) == 1)
  1404. {
  1405. mapinfo[d5[2]][d5[3]] == THUAI6::PlaceType::Wall;
  1406. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door5 || mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door5 || mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door5 || mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door5)//дص֪Dz
  1407. {
  1408. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door3) != -1;
  1409. angle = direction * PI / 2;
  1410. movetime = 1000 / api.GetSelfInfo()->speed;
  1411. api.Move(movetime, angle);
  1412. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  1413. }
  1414. if (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door5 || mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door5 || mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door5 || mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door5)
  1415. {
  1416. api.OpenDoor();
  1417. goto DOR5;
  1418. }
  1419. mapinfo[d5[2]][d5[3]] == THUAI6::PlaceType::Door5;
  1420. }
  1421. if (api.GetDoorProgress(d5[2], d5[3]) == 1)
  1422. {
  1423. mapinfo[d5[0]][d5[1]] == THUAI6::PlaceType::Wall;
  1424. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door5 && mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door5 && mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door5 && mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door5)//дص֪Dz
  1425. {
  1426. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door5) != -1;
  1427. angle = direction * PI / 2;
  1428. movetime = 1000 / api.GetSelfInfo()->speed;
  1429. api.Move(movetime, angle);
  1430. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  1431. }
  1432. if (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door5 || mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door5 || mapinfo[selfinfo->x + 1][selfinfo->y + 1] == THUAI6::PlaceType::Door5 || mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door5)
  1433. {
  1434. api.OpenDoor();
  1435. goto DOR5;
  1436. }
  1437. mapinfo[d5[2]][d5[3]] == THUAI6::PlaceType::Door5;
  1438. }
  1439. if (api.GetDoorProgress(d6[0], d6[1]) == 1)
  1440. {
  1441. mapinfo[d6[2]][d6[3]] == THUAI6::PlaceType::Wall;
  1442. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))//дص֪Dz
  1443. {
  1444. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  1445. angle = direction * PI / 2;
  1446. movetime = 1000 / api.GetSelfInfo()->speed;
  1447. api.Move(movetime, angle);
  1448. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  1449. }
  1450. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door6 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door6))
  1451. {
  1452. api.OpenDoor();
  1453. goto DOR6;
  1454. }
  1455. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))//дص֪Dz
  1456. {
  1457. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  1458. angle = direction * PI / 2;
  1459. movetime = 1000 / api.GetSelfInfo()->speed;
  1460. api.Move(movetime, angle);
  1461. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  1462. }
  1463. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door6 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door6))
  1464. {
  1465. api.OpenDoor();
  1466. goto DOR6;
  1467. }
  1468. mapinfo[d6[2]][d6[3]] == THUAI6::PlaceType::Door6;
  1469. }
  1470. if (api.GetDoorProgress(d6[2], d6[3]) == 1)
  1471. {
  1472. mapinfo[d6[0]][d6[1]] == THUAI6::PlaceType::Wall;
  1473. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6)) {
  1474. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  1475. angle = direction * PI / 2;
  1476. movetime = 1000 / api.GetSelfInfo()->speed;
  1477. api.Move(movetime, angle);
  1478. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  1479. }
  1480. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door6 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door6)) {
  1481. api.OpenDoor();
  1482. goto DOR6;
  1483. }
  1484. mapinfo[d6[2]][d6[3]] == THUAI6::PlaceType::Door6;
  1485. }
  1486. }
  1487. }
  1488. }
  1489. else
  1490. {
  1491. if (id == 0)
  1492. {
  1493. api.SendTextMessage(2, "1");
  1494. api.SendTextMessage(2, "3");
  1495. }
  1496. else
  1497. {
  1498. api.SendTextMessage(3, "1");
  1499. api.SendTextMessage(3, "3");
  1500. }
  1501. DOR32:
  1502. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door3 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door3))
  1503. {
  1504. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door3) != -1;
  1505. angle = direction * PI / 2;
  1506. movetime = 1000 / api.GetSelfInfo()->speed;
  1507. api.Move(movetime, angle);
  1508. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  1509. }
  1510. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door3 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door3)) {
  1511. api.ThrowProp(THUAI6::PropType::Key3);
  1512. if (api.MoveRight(1 / selfinfo->speed).get() == true)
  1513. {
  1514. while (api.IsDoorOpen(selfinfo->x, selfinfo->y + 1) == false && api.IsDoorOpen(selfinfo->x, selfinfo->y - 1) == false && api.IsDoorOpen(selfinfo->x + 1, selfinfo->y) == false && api.IsDoorOpen(selfinfo->x - 1, selfinfo->y) == false);
  1515. api.MoveLeft(1 / selfinfo->speed);
  1516. }
  1517. else
  1518. {
  1519. if (api.MoveLeft(1 / selfinfo->speed).get() == true)
  1520. {
  1521. while (api.IsDoorOpen(selfinfo->x, selfinfo->y + 1) == false && api.IsDoorOpen(selfinfo->x, selfinfo->y - 1) == false && api.IsDoorOpen(selfinfo->x + 1, selfinfo->y) == false && api.IsDoorOpen(selfinfo->x - 1, selfinfo->y) == false);
  1522. api.MoveRight(1 / selfinfo->speed);
  1523. }
  1524. else
  1525. {
  1526. if (api.MoveUp(1 / selfinfo->speed).get() == true)
  1527. {
  1528. while (api.IsDoorOpen(selfinfo->x, selfinfo->y + 1) == false && api.IsDoorOpen(selfinfo->x, selfinfo->y - 1) == false && api.IsDoorOpen(selfinfo->x + 1, selfinfo->y) == false && api.IsDoorOpen(selfinfo->x - 1, selfinfo->y) == false);
  1529. api.MoveDown(1 / selfinfo->speed);
  1530. }
  1531. else
  1532. {
  1533. if (api.MoveDown(1 / selfinfo->speed).get() == true)
  1534. {
  1535. while (api.IsDoorOpen(selfinfo->x, selfinfo->y + 1) == false && api.IsDoorOpen(selfinfo->x, selfinfo->y - 1) == false && api.IsDoorOpen(selfinfo->x + 1, selfinfo->y) == false && api.IsDoorOpen(selfinfo->x - 1, selfinfo->y) == false);
  1536. api.MoveUp(1 / selfinfo->speed);
  1537. }
  1538. }
  1539. }
  1540. }
  1541. AGAIN12:
  1542. while (mapinfo[selfinfo->x][selfinfo->y] != THUAI6::PlaceType::ClassRoom)
  1543. {
  1544. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::ClassRoom) != -1;
  1545. angle = direction * PI / 2;
  1546. movetime = 1000 / api.GetSelfInfo()->speed;
  1547. api.Move(movetime, angle);
  1548. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  1549. }
  1550. while (api.UseSkill(0).get() == false && api.GetClassroomProgress(selfinfo->x, selfinfo->y) != 1)
  1551. {
  1552. api.StartLearning();
  1553. api.Wait();
  1554. api.EndAllAction();
  1555. //Ƿbgm4
  1556. //½mzܺ
  1557. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  1558. }
  1559. int flag3 = 0;
  1560. if (api.GetClassroomProgress(selfinfo->x, selfinfo->y) == 1)
  1561. {
  1562. mapinfo[selfinfo->x][selfinfo->y] = THUAI6::PlaceType::Wall;
  1563. flag3++;
  1564. goto AGAIN12;
  1565. }
  1566. if (flag3 == 3)
  1567. {
  1568. if (api.GetDoorProgress(d5[0], d5[1]) == 1)
  1569. {
  1570. mapinfo[d5[2]][d5[3]] == THUAI6::PlaceType::Wall;
  1571. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door5 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door5) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door5) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door5)) {
  1572. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door3) != -1;
  1573. angle = direction * PI / 2;
  1574. movetime = 1000 / api.GetSelfInfo()->speed;
  1575. api.Move(movetime, angle);
  1576. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  1577. }
  1578. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door5 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door5) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door5) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door5)) {
  1579. api.OpenDoor();
  1580. goto DOR5;
  1581. }
  1582. mapinfo[d5[2]][d5[3]] == THUAI6::PlaceType::Door5;
  1583. }
  1584. if (api.GetDoorProgress(d5[2], d5[3]) == 1)
  1585. {
  1586. mapinfo[d5[0]][d5[1]] == THUAI6::PlaceType::Wall;
  1587. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door5 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door5) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door5) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door5)) {
  1588. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door5) != -1;
  1589. angle = direction * PI / 2;
  1590. movetime = 1000 / api.GetSelfInfo()->speed;
  1591. api.Move(movetime, angle);
  1592. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  1593. }
  1594. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door5 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door5) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door5) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door5)) {
  1595. api.OpenDoor();
  1596. goto DOR5;
  1597. }
  1598. mapinfo[d5[2]][d5[3]] == THUAI6::PlaceType::Door5;
  1599. }
  1600. if (api.GetDoorProgress(d6[0], d6[1]) == 1)
  1601. {
  1602. mapinfo[d6[2]][d6[3]] == THUAI6::PlaceType::Wall;
  1603. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))//дص֪Dz
  1604. {
  1605. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  1606. angle = direction * PI / 2;
  1607. movetime = 1000 / api.GetSelfInfo()->speed;
  1608. api.Move(movetime, angle);
  1609. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  1610. }
  1611. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door6 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door6))
  1612. {
  1613. api.OpenDoor();
  1614. goto DOR6;
  1615. }
  1616. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))//дص֪Dz
  1617. {
  1618. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  1619. angle = direction * PI / 2;
  1620. movetime = 1000 / api.GetSelfInfo()->speed;
  1621. api.Move(movetime, angle);
  1622. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  1623. }
  1624. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door6 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door6))
  1625. {
  1626. api.OpenDoor();
  1627. goto DOR6;
  1628. }
  1629. mapinfo[d6[2]][d6[3]] == THUAI6::PlaceType::Door6;
  1630. }
  1631. if (api.GetDoorProgress(d6[2], d6[3]) == 1)
  1632. {
  1633. mapinfo[d6[0]][d6[1]] == THUAI6::PlaceType::Wall;
  1634. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))//дص֪Dz
  1635. {
  1636. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  1637. angle = direction * PI / 2;
  1638. movetime = 1000 / api.GetSelfInfo()->speed;
  1639. api.Move(movetime, angle);
  1640. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  1641. }
  1642. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door6 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door6))
  1643. {
  1644. api.OpenDoor();
  1645. goto DOR6;
  1646. }
  1647. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))//дص֪Dz
  1648. {
  1649. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  1650. angle = direction * PI / 2;
  1651. movetime = 1000 / api.GetSelfInfo()->speed;
  1652. api.Move(movetime, angle);
  1653. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  1654. }
  1655. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door6 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door6))
  1656. {
  1657. api.OpenDoor();
  1658. goto DOR6;
  1659. }
  1660. mapinfo[d6[2]][d6[3]] == THUAI6::PlaceType::Door6;
  1661. }
  1662. }
  1663. }
  1664. }
  1665. }
  1666. if (has_5 == 1)
  1667. {
  1668. d1 = getDistance(selfinfo->x, selfinfo->y, d5[0], d5[1]);
  1669. d2 = getDistance(selfinfo->x, selfinfo->y, d5[2], d5[3]);
  1670. if (d1 >= d2)
  1671. {
  1672. if (id == 0)
  1673. {
  1674. api.SendTextMessage(2, "2");
  1675. api.SendTextMessage(2, "5");
  1676. }
  1677. else
  1678. {
  1679. api.SendTextMessage(3, "2");
  1680. api.SendTextMessage(3, "5");
  1681. }
  1682. DOR51:
  1683. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door5 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door5) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door5) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door5))//дص֪Dz
  1684. {
  1685. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door5) != -1;
  1686. angle = direction * PI / 2;
  1687. movetime = 1000 / api.GetSelfInfo()->speed;
  1688. api.Move(movetime, angle);
  1689. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  1690. }
  1691. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door5 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door5) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door5) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door5))
  1692. {
  1693. api.ThrowProp(THUAI6::PropType::Key5);
  1694. //˿һ2
  1695. while (api.IsDoorOpen(selfinfo->x, selfinfo->y - 1000) == false);
  1696. //ϱߵ涯3
  1697. AGAIN13:
  1698. while (mapinfo[selfinfo->x][selfinfo->y] != THUAI6::PlaceType::ClassRoom)
  1699. {
  1700. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::ClassRoom) != -1;
  1701. angle = direction * PI / 2;
  1702. movetime = 1000 / api.GetSelfInfo()->speed;
  1703. api.Move(movetime, angle);
  1704. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  1705. }
  1706. while (api.UseSkill(0).get() == false && api.GetClassroomProgress(selfinfo->x, selfinfo->y) != 1)
  1707. {
  1708. api.StartLearning();
  1709. api.Wait();
  1710. api.EndAllAction();
  1711. //Ƿbgm4
  1712. //½mzܺ
  1713. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  1714. }
  1715. int flag4 = 0;
  1716. if (api.GetClassroomProgress(selfinfo->x, selfinfo->y) == 1)
  1717. {
  1718. mapinfo[selfinfo->x][selfinfo->y] = THUAI6::PlaceType::Wall;
  1719. flag4++;
  1720. goto AGAIN13;
  1721. }
  1722. if (flag4 == 3)
  1723. {
  1724. if (api.GetDoorProgress(d3[0], d3[1]) == 1)
  1725. {
  1726. mapinfo[d3[2]][d3[3]] == THUAI6::PlaceType::Wall;
  1727. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door3 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door3))//дص֪Dz
  1728. {
  1729. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door5) != -1;
  1730. angle = direction * PI / 2;
  1731. movetime = 1000 / api.GetSelfInfo()->speed;
  1732. api.Move(movetime, angle);
  1733. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  1734. }
  1735. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door3 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door3))
  1736. {
  1737. api.OpenDoor();
  1738. goto DOR3;
  1739. }
  1740. mapinfo[d3[2]][d3[3]] == THUAI6::PlaceType::Door3;
  1741. }
  1742. if (api.GetDoorProgress(d3[2], d3[3]) == 1)
  1743. {
  1744. mapinfo[d3[0]][d3[1]] == THUAI6::PlaceType::Wall;
  1745. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door3 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door3))//дص֪Dz
  1746. {
  1747. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door3) != -1;
  1748. angle = direction * PI / 2;
  1749. movetime = 1000 / api.GetSelfInfo()->speed;
  1750. api.Move(movetime, angle);
  1751. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  1752. }
  1753. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door3 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door3))
  1754. {
  1755. api.OpenDoor();
  1756. goto DOR3;
  1757. }
  1758. mapinfo[d3[2]][d3[3]] == THUAI6::PlaceType::Door3;
  1759. }
  1760. if (api.GetDoorProgress(d6[0], d6[1]) == 1)
  1761. {
  1762. mapinfo[d6[2]][d6[3]] == THUAI6::PlaceType::Wall;
  1763. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))//дص֪Dz
  1764. {
  1765. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  1766. angle = direction * PI / 2;
  1767. movetime = 1000 / api.GetSelfInfo()->speed;
  1768. api.Move(movetime, angle);
  1769. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  1770. }
  1771. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door6 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door6))
  1772. {
  1773. api.OpenDoor();
  1774. goto DOR6;
  1775. }
  1776. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))
  1777. //дص֪Dz
  1778. {
  1779. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  1780. angle = direction * PI / 2;
  1781. movetime = 1000 / api.GetSelfInfo()->speed;
  1782. api.Move(movetime, angle);
  1783. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  1784. }
  1785. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door6 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door6))
  1786. {
  1787. api.OpenDoor();
  1788. goto DOR6;
  1789. }
  1790. mapinfo[d3[2]][d3[3]] == THUAI6::PlaceType::Door6;
  1791. }
  1792. if (api.GetDoorProgress(d6[2], d6[3]) == 1)
  1793. {
  1794. mapinfo[d6[0]][d6[1]] == THUAI6::PlaceType::Wall;
  1795. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))
  1796. //дص֪Dz
  1797. {
  1798. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  1799. angle = direction * PI / 2;
  1800. movetime = 1000 / api.GetSelfInfo()->speed;
  1801. api.Move(movetime, angle);
  1802. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  1803. }
  1804. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door6 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door6))
  1805. {
  1806. api.OpenDoor();
  1807. goto DOR6;
  1808. }
  1809. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))
  1810. //дص֪Dz
  1811. {
  1812. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  1813. angle = direction * PI / 2;
  1814. movetime = 1000 / api.GetSelfInfo()->speed;
  1815. api.Move(movetime, angle);
  1816. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  1817. }
  1818. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door6 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door6))
  1819. {
  1820. api.OpenDoor();
  1821. goto DOR6;
  1822. }
  1823. mapinfo[d3[0]][d3[1]] == THUAI6::PlaceType::Door6;
  1824. }
  1825. }
  1826. }
  1827. }
  1828. else
  1829. {
  1830. if (id == 0)
  1831. {
  1832. api.SendTextMessage(2, "1");
  1833. api.SendTextMessage(2, "5");
  1834. }
  1835. else
  1836. {
  1837. api.SendTextMessage(3, "1");
  1838. api.SendTextMessage(3, "5");
  1839. }
  1840. DOR52:
  1841. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door5 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door5) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door5) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door5))//дص֪Dz
  1842. {
  1843. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door5) != -1;
  1844. angle = direction * PI / 2;
  1845. movetime = 1000 / api.GetSelfInfo()->speed;
  1846. api.Move(movetime, angle);
  1847. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  1848. }
  1849. DOR5:
  1850. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door5 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door5) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door5) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door5))
  1851. {
  1852. api.ThrowProp(THUAI6::PropType::Key5);
  1853. if (api.MoveRight(1 / selfinfo->speed).get() == true)
  1854. {
  1855. while (api.IsDoorOpen(selfinfo->x, selfinfo->y + 1) == false && api.IsDoorOpen(selfinfo->x, selfinfo->y - 1) == false && api.IsDoorOpen(selfinfo->x + 1, selfinfo->y) == false && api.IsDoorOpen(selfinfo->x - 1, selfinfo->y) == false);
  1856. api.MoveLeft(1 / selfinfo->speed);
  1857. }
  1858. else
  1859. {
  1860. if (api.MoveLeft(1 / selfinfo->speed).get() == true)
  1861. {
  1862. while (api.IsDoorOpen(selfinfo->x, selfinfo->y + 1) == false && api.IsDoorOpen(selfinfo->x, selfinfo->y - 1) == false && api.IsDoorOpen(selfinfo->x + 1, selfinfo->y) == false && api.IsDoorOpen(selfinfo->x - 1, selfinfo->y) == false);
  1863. api.MoveRight(1 / selfinfo->speed);
  1864. }
  1865. else
  1866. {
  1867. if (api.MoveUp(1 / selfinfo->speed).get() == true)
  1868. {
  1869. while (api.IsDoorOpen(selfinfo->x, selfinfo->y + 1) == false && api.IsDoorOpen(selfinfo->x, selfinfo->y - 1) == false && api.IsDoorOpen(selfinfo->x + 1, selfinfo->y) == false && api.IsDoorOpen(selfinfo->x - 1, selfinfo->y) == false);
  1870. api.MoveDown(1 / selfinfo->speed);
  1871. }
  1872. else
  1873. {
  1874. if (api.MoveDown(1 / selfinfo->speed).get() == true)
  1875. {
  1876. while (api.IsDoorOpen(selfinfo->x, selfinfo->y + 1) == false && api.IsDoorOpen(selfinfo->x, selfinfo->y - 1) == false && api.IsDoorOpen(selfinfo->x + 1, selfinfo->y) == false && api.IsDoorOpen(selfinfo->x - 1, selfinfo->y) == false);
  1877. api.MoveUp(1 / selfinfo->speed);
  1878. }
  1879. }
  1880. }
  1881. }
  1882. AGAIN14:
  1883. while (mapinfo[selfinfo->x][selfinfo->y] != THUAI6::PlaceType::ClassRoom)
  1884. {
  1885. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::ClassRoom) != -1;
  1886. angle = direction * PI / 2;
  1887. movetime = 1000 / api.GetSelfInfo()->speed;
  1888. api.Move(movetime, angle);
  1889. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  1890. }
  1891. while (api.UseSkill(0).get() == false && api.GetClassroomProgress(selfinfo->x, selfinfo->y) != 1)
  1892. {
  1893. api.StartLearning();
  1894. api.Wait();
  1895. api.EndAllAction();
  1896. //Ƿbgm4
  1897. //½mzܺ
  1898. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  1899. }
  1900. if (api.GetClassroomProgress(selfinfo->x, selfinfo->y) == 1)
  1901. {
  1902. mapinfo[selfinfo->x][selfinfo->y] = THUAI6::PlaceType::Wall;
  1903. flag5++;
  1904. goto AGAIN14;
  1905. }
  1906. if (flag5 == 3)
  1907. {
  1908. if (api.GetDoorProgress(d3[0], d3[1]) == 1)
  1909. {
  1910. mapinfo[d3[2]][d3[3]] == THUAI6::PlaceType::Wall;
  1911. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door3 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door3))//дص֪Dz
  1912. {
  1913. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door5) != -1;
  1914. angle = direction * PI / 2;
  1915. movetime = 1000 / api.GetSelfInfo()->speed;
  1916. api.Move(movetime, angle);
  1917. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  1918. }
  1919. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door3 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door3))
  1920. {
  1921. api.OpenDoor();
  1922. goto DOR3;
  1923. }
  1924. mapinfo[d3[2]][d3[3]] == THUAI6::PlaceType::Door3;
  1925. }
  1926. if (api.GetDoorProgress(d3[2], d3[3]) == 1)
  1927. {
  1928. mapinfo[d3[0]][d3[1]] == THUAI6::PlaceType::Wall;
  1929. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door3 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door3))//дص֪Dz
  1930. {
  1931. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door3) != -1;
  1932. angle = direction * PI / 2;
  1933. movetime = 1000 / api.GetSelfInfo()->speed;
  1934. api.Move(movetime, angle);
  1935. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  1936. }
  1937. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door3 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door3))
  1938. {
  1939. api.OpenDoor();
  1940. goto DOR3;
  1941. }
  1942. mapinfo[d3[2]][d3[3]] == THUAI6::PlaceType::Door3;
  1943. }
  1944. if (api.GetDoorProgress(d6[0], d6[1]) == 1)
  1945. {
  1946. mapinfo[d6[2]][d6[3]] == THUAI6::PlaceType::Wall;
  1947. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))//дص֪Dz
  1948. {
  1949. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  1950. angle = direction * PI / 2;
  1951. movetime = 1000 / api.GetSelfInfo()->speed;
  1952. api.Move(movetime, angle);
  1953. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  1954. }
  1955. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door6 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door6))
  1956. {
  1957. api.OpenDoor();
  1958. goto DOR6;
  1959. }
  1960. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))//дص֪Dz
  1961. {
  1962. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  1963. angle = direction * PI / 2;
  1964. movetime = 1000 / api.GetSelfInfo()->speed;
  1965. api.Move(movetime, angle);
  1966. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  1967. }
  1968. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door6 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door6))
  1969. {
  1970. api.OpenDoor();
  1971. goto DOR6;
  1972. }
  1973. mapinfo[d3[2]][d3[3]] == THUAI6::PlaceType::Door6;
  1974. }
  1975. if (api.GetDoorProgress(d6[2], d6[3]) == 1)
  1976. {
  1977. mapinfo[d6[0]][d6[1]] == THUAI6::PlaceType::Wall;
  1978. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))
  1979. //дص֪Dz
  1980. {
  1981. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  1982. angle = direction * PI / 2;
  1983. movetime = 1000 / api.GetSelfInfo()->speed;
  1984. api.Move(movetime, angle);
  1985. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  1986. }
  1987. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door6 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door6))
  1988. {
  1989. api.OpenDoor();
  1990. goto DOR6;
  1991. }
  1992. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))
  1993. //дص֪Dz
  1994. {
  1995. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  1996. angle = direction * PI / 2;
  1997. movetime = 1000 / api.GetSelfInfo()->speed;
  1998. api.Move(movetime, angle);
  1999. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2000. }
  2001. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door6 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door6))
  2002. {
  2003. api.OpenDoor();
  2004. goto DOR6;
  2005. }
  2006. mapinfo[d3[0]][d3[1]] == THUAI6::PlaceType::Door6;
  2007. }
  2008. }
  2009. }
  2010. }
  2011. }
  2012. if (has_6 == 1)
  2013. {
  2014. d1 = getDistance(selfinfo->x, selfinfo->y, d6[0], d6[1]);
  2015. d2 = getDistance(selfinfo->x, selfinfo->y, d6[2], d6[3]);
  2016. if (d1 >= d2)
  2017. {
  2018. if (id == 0)
  2019. {
  2020. api.SendTextMessage(2, "2");
  2021. api.SendTextMessage(2, "6");
  2022. }
  2023. else
  2024. {
  2025. api.SendTextMessage(3, "2");
  2026. api.SendTextMessage(3, "6");
  2027. }
  2028. DOR61:
  2029. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))//дص֪Dz
  2030. {
  2031. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  2032. angle = direction * PI / 2;
  2033. movetime = 1000 / api.GetSelfInfo()->speed;
  2034. api.Move(movetime, angle);
  2035. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2036. }
  2037. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door6 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door6))
  2038. {
  2039. api.ThrowProp(THUAI6::PropType::Key6);
  2040. //˿һ2
  2041. while (api.IsDoorOpen(selfinfo->x, selfinfo->y - 1000) == false);
  2042. //ϱߵ涯3
  2043. AGAIN15:
  2044. while (mapinfo[selfinfo->x][selfinfo->y] != THUAI6::PlaceType::ClassRoom)
  2045. {
  2046. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::ClassRoom) != -1;
  2047. angle = direction * PI / 2;
  2048. movetime = 1000 / api.GetSelfInfo()->speed;
  2049. api.Move(movetime, angle);
  2050. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2051. }
  2052. while (api.UseSkill(0).get() == false && api.GetClassroomProgress(selfinfo->x, selfinfo->y) != 1)
  2053. {
  2054. api.StartLearning();
  2055. api.Wait();
  2056. api.EndAllAction();
  2057. //Ƿbgm4
  2058. //½mzܺ
  2059. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2060. }
  2061. int flag6 = 0;
  2062. if (api.GetClassroomProgress(selfinfo->x, selfinfo->y) == 1)
  2063. {
  2064. mapinfo[selfinfo->x][selfinfo->y] = THUAI6::PlaceType::Wall;
  2065. flag6++;
  2066. goto AGAIN15;
  2067. }
  2068. if (flag6 == 3)
  2069. {
  2070. if (api.GetDoorProgress(d6[0], d6[1]) == 1)
  2071. {
  2072. mapinfo[d6[2]][d6[3]] == THUAI6::PlaceType::Wall;
  2073. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))
  2074. //дص֪Dz
  2075. {
  2076. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door5) != -1;
  2077. angle = direction * PI / 2;
  2078. movetime = 1000 / api.GetSelfInfo()->speed;
  2079. api.Move(movetime, angle);
  2080. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2081. }
  2082. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door6 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door6))
  2083. {
  2084. api.OpenDoor();
  2085. goto DOR6;
  2086. }
  2087. mapinfo[d6[2]][d6[3]] == THUAI6::PlaceType::Door6;
  2088. }
  2089. if (api.GetDoorProgress(d6[2], d6[3]) == 1)
  2090. {
  2091. mapinfo[d6[0]][d6[1]] == THUAI6::PlaceType::Wall;
  2092. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))//дص֪Dz
  2093. {
  2094. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  2095. angle = direction * PI / 2;
  2096. movetime = 1000 / api.GetSelfInfo()->speed;
  2097. api.Move(movetime, angle);
  2098. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2099. }
  2100. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door6 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door6))
  2101. {
  2102. api.OpenDoor();
  2103. goto DOR6;
  2104. }
  2105. mapinfo[d3[2]][d3[3]] == THUAI6::PlaceType::Door6;
  2106. }
  2107. if (api.GetDoorProgress(d3[0], d3[1]) == 1)
  2108. {
  2109. mapinfo[d3[2]][d3[3]] == THUAI6::PlaceType::Wall;
  2110. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door3 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door3))//дص֪Dz
  2111. {
  2112. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door3) != -1;
  2113. angle = direction * PI / 2;
  2114. movetime = 1000 / api.GetSelfInfo()->speed;
  2115. api.Move(movetime, angle);
  2116. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2117. }
  2118. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door3 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door3))
  2119. {
  2120. api.OpenDoor();
  2121. goto DOR3;
  2122. }
  2123. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door3 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door3))//дص֪Dz
  2124. {
  2125. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door3) != -1;
  2126. angle = direction * PI / 2;
  2127. movetime = 1000 / api.GetSelfInfo()->speed;
  2128. api.Move(movetime, angle);
  2129. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2130. }
  2131. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door3 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door3))
  2132. {
  2133. api.OpenDoor();
  2134. goto DOR3;
  2135. }
  2136. mapinfo[d6[2]][d6[3]] == THUAI6::PlaceType::Door3;
  2137. }
  2138. if (api.GetDoorProgress(d3[2], d3[3]) == 1)
  2139. {
  2140. mapinfo[d3[0]][d3[1]] == THUAI6::PlaceType::Wall;
  2141. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door3 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door3))//дص֪Dz
  2142. {
  2143. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door3) != -1;
  2144. angle = direction * PI / 2;
  2145. movetime = 1000 / api.GetSelfInfo()->speed;
  2146. api.Move(movetime, angle);
  2147. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2148. }
  2149. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door3 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door3))
  2150. {
  2151. api.OpenDoor();
  2152. goto DOR3;
  2153. }
  2154. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door3 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door3))//дص֪Dz
  2155. {
  2156. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door3) != -1;
  2157. angle = direction * PI / 2;
  2158. movetime = 1000 / api.GetSelfInfo()->speed;
  2159. api.Move(movetime, angle);
  2160. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2161. }
  2162. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door3 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door3))
  2163. {
  2164. api.OpenDoor();
  2165. goto DOR3;
  2166. }
  2167. mapinfo[d6[0]][d6[1]] == THUAI6::PlaceType::Door3;
  2168. }
  2169. }
  2170. }
  2171. }
  2172. else
  2173. {
  2174. if (id == 0)
  2175. {
  2176. api.SendTextMessage(2, "1");
  2177. api.SendTextMessage(2, "6");
  2178. }
  2179. else
  2180. {
  2181. api.SendTextMessage(3, "1");
  2182. api.SendTextMessage(3, "6");
  2183. }
  2184. DOR62:
  2185. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))//дص֪Dz
  2186. {
  2187. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  2188. angle = direction * PI / 2;
  2189. movetime = 1000 / api.GetSelfInfo()->speed;
  2190. api.Move(movetime, angle);
  2191. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2192. }
  2193. DOR6:
  2194. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door6 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door6))
  2195. {
  2196. api.ThrowProp(THUAI6::PropType::Key6);
  2197. if (api.MoveRight(1 / selfinfo->speed).get() == true)
  2198. {
  2199. while (api.IsDoorOpen(selfinfo->x, selfinfo->y + 1) == false && api.IsDoorOpen(selfinfo->x, selfinfo->y - 1) == false && api.IsDoorOpen(selfinfo->x + 1, selfinfo->y) == false && api.IsDoorOpen(selfinfo->x - 1, selfinfo->y) == false);
  2200. api.MoveLeft(1 / selfinfo->speed);
  2201. }
  2202. else
  2203. {
  2204. if (api.MoveLeft(1 / selfinfo->speed).get() == true)
  2205. {
  2206. while (api.IsDoorOpen(selfinfo->x, selfinfo->y + 1) == false && api.IsDoorOpen(selfinfo->x, selfinfo->y - 1) == false && api.IsDoorOpen(selfinfo->x + 1, selfinfo->y) == false && api.IsDoorOpen(selfinfo->x - 1, selfinfo->y) == false);
  2207. api.MoveRight(1 / selfinfo->speed);
  2208. }
  2209. else
  2210. {
  2211. if (api.MoveUp(1 / selfinfo->speed).get() == true)
  2212. {
  2213. while (api.IsDoorOpen(selfinfo->x, selfinfo->y + 1) == false && api.IsDoorOpen(selfinfo->x, selfinfo->y - 1) == false && api.IsDoorOpen(selfinfo->x + 1, selfinfo->y) == false && api.IsDoorOpen(selfinfo->x - 1, selfinfo->y) == false);
  2214. api.MoveDown(1 / selfinfo->speed);
  2215. }
  2216. else
  2217. {
  2218. if (api.MoveDown(1 / selfinfo->speed).get() == true)
  2219. {
  2220. while (api.IsDoorOpen(selfinfo->x, selfinfo->y + 1) == false && api.IsDoorOpen(selfinfo->x, selfinfo->y - 1) == false && api.IsDoorOpen(selfinfo->x + 1, selfinfo->y) == false && api.IsDoorOpen(selfinfo->x - 1, selfinfo->y) == false);
  2221. api.MoveUp(1 / selfinfo->speed);
  2222. }
  2223. }
  2224. }
  2225. }
  2226. AGAIN16:
  2227. while (mapinfo[selfinfo->x][selfinfo->y] != THUAI6::PlaceType::ClassRoom)
  2228. {
  2229. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::ClassRoom) != -1;
  2230. angle = direction * PI / 2;
  2231. movetime = 1000 / api.GetSelfInfo()->speed;
  2232. api.Move(movetime, angle);
  2233. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2234. }
  2235. while (api.UseSkill(0).get() == false && api.GetClassroomProgress(selfinfo->x, selfinfo->y) != 1)
  2236. {
  2237. api.StartLearning();
  2238. api.Wait();
  2239. api.EndAllAction();
  2240. //Ƿbgm4
  2241. //½mzܺ
  2242. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2243. }
  2244. int flag7 = 0;
  2245. if (api.GetClassroomProgress(selfinfo->x, selfinfo->y) == 1)
  2246. {
  2247. mapinfo[selfinfo->x][selfinfo->y] = THUAI6::PlaceType::Wall;
  2248. flag7++;
  2249. goto AGAIN16;
  2250. }
  2251. if (flag7 == 3)
  2252. {
  2253. if (api.GetDoorProgress(d6[0], d6[1]) == 1)
  2254. {
  2255. mapinfo[d6[2]][d6[3]] == THUAI6::PlaceType::Wall;
  2256. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))
  2257. //дص֪Dz
  2258. {
  2259. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door5) != -1;
  2260. angle = direction * PI / 2;
  2261. movetime = 1000 / api.GetSelfInfo()->speed;
  2262. api.Move(movetime, angle);
  2263. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2264. }
  2265. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door6 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door6))
  2266. {
  2267. api.OpenDoor();
  2268. goto DOR6;
  2269. }
  2270. mapinfo[d6[2]][d6[3]] == THUAI6::PlaceType::Door6;
  2271. }
  2272. if (api.GetDoorProgress(d6[2], d6[3]) == 1)
  2273. {
  2274. mapinfo[d6[0]][d6[1]] == THUAI6::PlaceType::Wall;
  2275. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))//дص֪Dz
  2276. {
  2277. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  2278. angle = direction * PI / 2;
  2279. movetime = 1000 / api.GetSelfInfo()->speed;
  2280. api.Move(movetime, angle);
  2281. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2282. }
  2283. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door6 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door6) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door6))
  2284. {
  2285. api.OpenDoor();
  2286. goto DOR6;
  2287. }
  2288. mapinfo[d3[2]][d3[3]] == THUAI6::PlaceType::Door6;
  2289. }
  2290. if (api.GetDoorProgress(d3[0], d3[1]) == 1)
  2291. {
  2292. mapinfo[d3[2]][d3[3]] == THUAI6::PlaceType::Wall;
  2293. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door3 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door3))//дص֪Dz
  2294. {
  2295. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door3) != -1;
  2296. angle = direction * PI / 2;
  2297. movetime = 1000 / api.GetSelfInfo()->speed;
  2298. api.Move(movetime, angle);
  2299. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2300. }
  2301. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door3 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door3))
  2302. {
  2303. api.OpenDoor();
  2304. goto DOR3;
  2305. }
  2306. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door3 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door3))//дص֪Dz
  2307. {
  2308. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door3) != -1;
  2309. angle = direction * PI / 2;
  2310. movetime = 1000 / api.GetSelfInfo()->speed;
  2311. api.Move(movetime, angle);
  2312. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2313. }
  2314. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door3 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door3))
  2315. {
  2316. api.OpenDoor();
  2317. goto DOR3;
  2318. }
  2319. mapinfo[d6[2]][d6[3]] == THUAI6::PlaceType::Door3;
  2320. }
  2321. if (api.GetDoorProgress(d3[2], d3[3]) == 1)
  2322. {
  2323. mapinfo[d3[0]][d3[1]] == THUAI6::PlaceType::Wall;
  2324. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door3 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door3))//дص֪Dz
  2325. {
  2326. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door3) != -1;
  2327. angle = direction * PI / 2;
  2328. movetime = 1000 / api.GetSelfInfo()->speed;
  2329. api.Move(movetime, angle);
  2330. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2331. }
  2332. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door3 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door3))
  2333. {
  2334. api.OpenDoor();
  2335. goto DOR3;
  2336. }
  2337. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door3 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door3))//дص֪Dz
  2338. {
  2339. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door3) != -1;
  2340. angle = direction * PI / 2;
  2341. movetime = 1000 / api.GetSelfInfo()->speed;
  2342. api.Move(movetime, angle);
  2343. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2344. }
  2345. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Door3 || (mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Door3) || (mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Door3))
  2346. {
  2347. api.OpenDoor();
  2348. goto DOR3;
  2349. }
  2350. mapinfo[d6[0]][d6[1]] = THUAI6::PlaceType::Door3;
  2351. }
  2352. }
  2353. }
  2354. }
  2355. }
  2356. }
  2357. //˳׶Σλս
  2358. }
  2359. if (this->playerID == 2 || this->playerID == 3)
  2360. {
  2361. for (i = 0; i < 50; i++)
  2362. {
  2363. for (j = 0; j < 50; j++)
  2364. {
  2365. if (mapinfo[i][j] == THUAI6::PlaceType::Chest)
  2366. {
  2367. *c = i; c++; *c = j; c++;
  2368. }
  2369. if (mapinfo[i][j] == THUAI6::PlaceType::Door3)
  2370. {
  2371. *d3 = i; d3++; *d3 = j;
  2372. }
  2373. if (mapinfo[i][j] == THUAI6::PlaceType::Door5)
  2374. {
  2375. *d5 = i; d5++; *d5 = j;
  2376. }
  2377. if (mapinfo[i][j] == THUAI6::PlaceType::Door6)
  2378. {
  2379. *d6 = i; d6++; *d6 = j;
  2380. }
  2381. }
  2382. }
  2383. for (int i = 0; i < Constants::numOfChest * 2; i += 2)
  2384. {
  2385. for (int j = i + 2; j < Constants::numOfChest * 2; j += 2)
  2386. {
  2387. d1 = getDistance(selfinfo->x, selfinfo->y, c[i], c[i + 1]);
  2388. d2 = getDistance(selfinfo->x, selfinfo->y, c[j], c[j + 1]);
  2389. if (d2 < d1)
  2390. {
  2391. tran = c[j]; c[j] = c[i]; c[i] = tran;
  2392. tran = c[j + 1]; c[j + 1] = c[i + 1]; c[i + 1] = tran;
  2393. }
  2394. }
  2395. }
  2396. while (1)
  2397. {
  2398. std::string sc1 = std::to_string(c[NUM]), sc2 = std::to_string(c[NUM + 1]);
  2399. goal = NUM;
  2400. if (NUM == (Constants::numOfChest * 2 + 1)) break;
  2401. if ((NUM == goal) && (api.GetChestProgress(c[goal], c[goal + 1]) != 1)) flag = 1;//̽Ƿ񱻿
  2402. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2403. //ûҵԿ,Уֱ1->interrupt
  2404. while (flag == 1 && api.GetChestProgress(c[goal], c[goal + 1]) != 1 && flag2 != 1)
  2405. {
  2406. if (mapinfo[selfinfo->x][selfinfo->y] == THUAI6::PlaceType::Chest)
  2407. {
  2408. flag2 = 1;//
  2409. }
  2410. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Chest) != -1;
  2411. angle = direction * PI / 2;
  2412. movetime = 1000 / api.GetSelfInfo()->speed;
  2413. api.Move(movetime, angle);
  2414. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2415. }//
  2416. if (flag2 == 1)
  2417. {
  2418. while (api.GetChestProgress(c[goal], c[goal + 1]) != 1) api.StartOpenChest();//
  2419. mapinfo[c[goal]][c[goal + 1]] = THUAI6::PlaceType::Wall;
  2420. flag = 0;
  2421. if (api.PickProp(THUAI6::PropType::Key3).get()) has_3 = 1;
  2422. if (api.PickProp(THUAI6::PropType::Key5).get()) has_5 = 1;
  2423. if (api.PickProp(THUAI6::PropType::Key6).get()) has_6 = 1;
  2424. if (api.PickProp(THUAI6::PropType::AddSpeed).get()) speed = 1;
  2425. if (api.PickProp(THUAI6::PropType::AddLifeOrClairaudience).get()) life = 1;
  2426. if (api.PickProp(THUAI6::PropType::AddHpOrAp).get()) hp = 1;
  2427. if (api.PickProp(THUAI6::PropType::ShieldOrSpear).get()) shield = 1;
  2428. if (api.PickProp(THUAI6::PropType::RecoveryFromDizziness).get()) rec = 1;
  2429. if ((has_3 + has_5 + has_6 + speed + life + hp + shield + rec) == 3) break;//ҵԿ/
  2430. }
  2431. if (has_3 == 1)
  2432. {
  2433. d1 = getDistance(selfinfo->x, selfinfo->y, d3[0], d3[1]);
  2434. d2 = getDistance(selfinfo->x, selfinfo->y, d3[2], d3[3]);
  2435. if (d1 >= d2)
  2436. {
  2437. if (id == 2)
  2438. {
  2439. api.SendTextMessage(0, "2");
  2440. api.SendTextMessage(0, "3");
  2441. }
  2442. else
  2443. {
  2444. api.SendTextMessage(1, "2");
  2445. api.SendTextMessage(1, "3");
  2446. }
  2447. // DOR31:
  2448. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door3 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door3))
  2449. {
  2450. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door3) != -1;
  2451. angle = direction * PI / 2;
  2452. movetime = 1000 / api.GetSelfInfo()->speed;
  2453. api.Move(movetime, angle);
  2454. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2455. }
  2456. //DOR3:
  2457. if (mapinfo[selfinfo->x][selfinfo->y] == THUAI6::PlaceType::Door3)
  2458. while (api.IsDoorOpen(selfinfo->x, selfinfo->y) == false) api.OpenDoor();
  2459. AGAIN21:
  2460. while (mapinfo[selfinfo->x][selfinfo->y] != THUAI6::PlaceType::ClassRoom)
  2461. {
  2462. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::ClassRoom) != -1;
  2463. angle = direction * PI / 2;
  2464. movetime = 1000 / api.GetSelfInfo()->speed;
  2465. api.Move(movetime, angle);
  2466. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2467. }
  2468. while (api.GetClassroomProgress(selfinfo->x, selfinfo->y) != 1)
  2469. {
  2470. api.StartLearning();
  2471. api.Wait();
  2472. api.EndAllAction();
  2473. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2474. }
  2475. if (api.GetClassroomProgress(selfinfo->x, selfinfo->y) == 1)
  2476. {
  2477. mapinfo[selfinfo->x][selfinfo->y] = THUAI6::PlaceType::Wall;
  2478. flag9++;
  2479. goto AGAIN21;
  2480. }
  2481. if (flag9 == 3)
  2482. {
  2483. if (api.GetDoorProgress(d5[0], d5[1]) == 1)
  2484. {
  2485. mapinfo[d5[2]][d5[3]] == THUAI6::PlaceType::Wall;
  2486. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door5 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door5) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door5) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door5))
  2487. {
  2488. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door3) != -1;
  2489. angle = direction * PI / 2;
  2490. movetime = 1000 / api.GetSelfInfo()->speed;
  2491. api.Move(movetime, angle);
  2492. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2493. }
  2494. if (mapinfo[selfinfo->x][selfinfo->y] == THUAI6::PlaceType::Door5)
  2495. {
  2496. api.OpenDoor();
  2497. mapinfo[d5[2]][d5[3]] == THUAI6::PlaceType::Door5;
  2498. //goto DOR5;
  2499. }
  2500. }
  2501. if (api.GetDoorProgress(d5[2], d5[3]) == 1)
  2502. {
  2503. mapinfo[d5[0]][d5[1]] == THUAI6::PlaceType::Wall;
  2504. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door5 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door5) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door5) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door5))
  2505. {
  2506. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door5) != -1;
  2507. angle = direction * PI / 2;
  2508. movetime = 1000 / api.GetSelfInfo()->speed;
  2509. api.Move(movetime, angle);
  2510. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2511. }
  2512. if (mapinfo[selfinfo->x][selfinfo->y] == THUAI6::PlaceType::Door5)
  2513. {
  2514. api.OpenDoor();
  2515. //goto DOR5;
  2516. }
  2517. mapinfo[d5[2]][d5[3]] == THUAI6::PlaceType::Door5;
  2518. }
  2519. if (api.GetDoorProgress(d6[0], d6[1]) == 1)
  2520. {
  2521. mapinfo[d6[2]][d6[3]] == THUAI6::PlaceType::Wall;
  2522. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))
  2523. {
  2524. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  2525. angle = direction * PI / 2;
  2526. movetime = 1000 / api.GetSelfInfo()->speed;
  2527. api.Move(movetime, angle);
  2528. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2529. }
  2530. if (mapinfo[selfinfo->x][selfinfo->y] == THUAI6::PlaceType::Door6)
  2531. {
  2532. api.OpenDoor();
  2533. //goto DOR6;
  2534. }
  2535. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))
  2536. {
  2537. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  2538. angle = direction * PI / 2;
  2539. movetime = 1000 / api.GetSelfInfo()->speed;
  2540. api.Move(movetime, angle);
  2541. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2542. }
  2543. if (mapinfo[selfinfo->x][selfinfo->y] == THUAI6::PlaceType::Door6)
  2544. {
  2545. api.OpenDoor();
  2546. //goto DOR6;
  2547. }
  2548. mapinfo[d6[2]][d6[3]] == THUAI6::PlaceType::Door6;
  2549. }
  2550. if (api.GetDoorProgress(d6[2], d6[3]) == 1)
  2551. {
  2552. mapinfo[d6[0]][d6[1]] == THUAI6::PlaceType::Wall;
  2553. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))
  2554. {
  2555. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  2556. angle = direction * PI / 2;
  2557. movetime = 1000 / api.GetSelfInfo()->speed;
  2558. api.Move(movetime, angle);
  2559. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2560. }
  2561. if (mapinfo[selfinfo->x][selfinfo->y] == THUAI6::PlaceType::Door6)
  2562. {
  2563. api.OpenDoor();
  2564. //goto DOR6;
  2565. }
  2566. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))
  2567. {
  2568. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  2569. angle = direction * PI / 2;
  2570. movetime = 1000 / api.GetSelfInfo()->speed;
  2571. api.Move(movetime, angle);
  2572. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2573. }
  2574. if (mapinfo[selfinfo->x][selfinfo->y] == THUAI6::PlaceType::Door6)
  2575. {
  2576. api.OpenDoor();
  2577. //goto DOR6;
  2578. }
  2579. mapinfo[d6[2]][d6[3]] == THUAI6::PlaceType::Door6;
  2580. }
  2581. }
  2582. }
  2583. }
  2584. else
  2585. {
  2586. if (id == 0)
  2587. {
  2588. api.SendTextMessage(2, "1");
  2589. api.SendTextMessage(2, "3");
  2590. }
  2591. else
  2592. {
  2593. api.SendTextMessage(3, "1");
  2594. api.SendTextMessage(3, "3");
  2595. }
  2596. //DOR32:
  2597. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door3 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door3))
  2598. {
  2599. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door3) != -1;
  2600. angle = direction * PI / 2;
  2601. movetime = 1000 / api.GetSelfInfo()->speed;
  2602. api.Move(movetime, angle);
  2603. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2604. }
  2605. if (mapinfo[selfinfo->x][selfinfo->y] == THUAI6::PlaceType::Door3)
  2606. {
  2607. api.OpenDoor();
  2608. while (api.IsDoorOpen(selfinfo->x, selfinfo->y - 1000) == false);
  2609. AGAIN22:
  2610. while (mapinfo[selfinfo->x][selfinfo->y] != THUAI6::PlaceType::ClassRoom)
  2611. {
  2612. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::ClassRoom) != -1;
  2613. angle = direction * PI / 2;
  2614. movetime = 1000 / api.GetSelfInfo()->speed;
  2615. api.Move(movetime, angle);
  2616. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2617. }
  2618. while (api.GetClassroomProgress(selfinfo->x, selfinfo->y) != 1)
  2619. {
  2620. api.StartLearning();
  2621. api.Wait();
  2622. api.EndAllAction();
  2623. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2624. }
  2625. if (api.GetClassroomProgress(selfinfo->x, selfinfo->y) == 1)
  2626. {
  2627. mapinfo[selfinfo->x][selfinfo->y] = THUAI6::PlaceType::Wall;
  2628. flag10++;
  2629. goto AGAIN22;
  2630. }
  2631. if (flag10 == 3)
  2632. {
  2633. if (api.GetDoorProgress(d5[0], d5[1]) == 1)
  2634. {
  2635. mapinfo[d5[2]][d5[3]] == THUAI6::PlaceType::Wall;
  2636. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door5 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door5) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door5) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door5))
  2637. {
  2638. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door3) != -1;
  2639. angle = direction * PI / 2;
  2640. movetime = 1000 / api.GetSelfInfo()->speed;
  2641. api.Move(movetime, angle);
  2642. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2643. }
  2644. if (mapinfo[selfinfo->x][selfinfo->y] == THUAI6::PlaceType::Door5)
  2645. {
  2646. api.OpenDoor();
  2647. //goto DOR5;
  2648. }
  2649. mapinfo[d5[2]][d5[3]] == THUAI6::PlaceType::Door5;
  2650. }
  2651. if (api.GetDoorProgress(d5[2], d5[3]) == 1)
  2652. {
  2653. mapinfo[d5[0]][d5[1]] == THUAI6::PlaceType::Wall;
  2654. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door5 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door5) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door5) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door5))
  2655. {
  2656. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door5) != -1;
  2657. angle = direction * PI / 2;
  2658. movetime = 1000 / api.GetSelfInfo()->speed;
  2659. api.Move(movetime, angle);
  2660. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2661. }
  2662. if (mapinfo[selfinfo->x][selfinfo->y] == THUAI6::PlaceType::Door5)
  2663. {
  2664. api.OpenDoor();
  2665. //goto DOR5;
  2666. }
  2667. mapinfo[d5[2]][d5[3]] == THUAI6::PlaceType::Door5;
  2668. }
  2669. if (api.GetDoorProgress(d6[0], d6[1]) == 1)
  2670. {
  2671. mapinfo[d6[2]][d6[3]] == THUAI6::PlaceType::Wall;
  2672. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))
  2673. {
  2674. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  2675. angle = direction * PI / 2;
  2676. movetime = 1000 / api.GetSelfInfo()->speed;
  2677. api.Move(movetime, angle);
  2678. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2679. }
  2680. if (mapinfo[selfinfo->x][selfinfo->y] == THUAI6::PlaceType::Door6)
  2681. {
  2682. api.OpenDoor();
  2683. //goto DOR6;
  2684. }
  2685. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))
  2686. {
  2687. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  2688. angle = direction * PI / 2;
  2689. movetime = 1000 / api.GetSelfInfo()->speed;
  2690. api.Move(movetime, angle);
  2691. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2692. }
  2693. if (mapinfo[selfinfo->x][selfinfo->y] == THUAI6::PlaceType::Door6)
  2694. {
  2695. api.OpenDoor();
  2696. //goto DOR6;
  2697. }
  2698. mapinfo[d6[2]][d6[3]] == THUAI6::PlaceType::Door6;
  2699. }
  2700. if (api.GetDoorProgress(d6[2], d6[3]) == 1)
  2701. {
  2702. mapinfo[d6[0]][d6[1]] == THUAI6::PlaceType::Wall;
  2703. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))
  2704. {
  2705. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  2706. angle = direction * PI / 2;
  2707. movetime = 1000 / api.GetSelfInfo()->speed;
  2708. api.Move(movetime, angle);
  2709. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2710. }
  2711. if (mapinfo[selfinfo->x][selfinfo->y] == THUAI6::PlaceType::Door6)
  2712. {
  2713. api.OpenDoor();
  2714. //goto DOR6;
  2715. }
  2716. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))
  2717. {
  2718. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  2719. angle = direction * PI / 2;
  2720. movetime = 1000 / api.GetSelfInfo()->speed;
  2721. api.Move(movetime, angle);
  2722. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2723. }
  2724. if (mapinfo[selfinfo->x][selfinfo->y] == THUAI6::PlaceType::Door6)
  2725. {
  2726. api.OpenDoor();
  2727. //goto DOR6;
  2728. }
  2729. mapinfo[d6[2]][d6[3]] == THUAI6::PlaceType::Door6;
  2730. }
  2731. }
  2732. }
  2733. }
  2734. }
  2735. if (has_5 == 1)
  2736. {
  2737. d1 = getDistance(selfinfo->x, selfinfo->y, d5[0], d5[1]);
  2738. d2 = getDistance(selfinfo->x, selfinfo->y, d5[2], d5[3]);
  2739. if (d1 >= d2)
  2740. {
  2741. if (id == 0)
  2742. {
  2743. api.SendTextMessage(2, "2");
  2744. api.SendTextMessage(2, "5");
  2745. }
  2746. else
  2747. {
  2748. api.SendTextMessage(3, "2");
  2749. api.SendTextMessage(3, "5");
  2750. }
  2751. //DOR51:
  2752. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door5 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door5) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door5) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door5))
  2753. {
  2754. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door5) != -1;
  2755. angle = direction * PI / 2;
  2756. movetime = 1000 / api.GetSelfInfo()->speed;
  2757. api.Move(movetime, angle);
  2758. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2759. }
  2760. //DOR5:
  2761. if (mapinfo[selfinfo->x][selfinfo->y] == THUAI6::PlaceType::Door5)
  2762. {
  2763. api.OpenDoor();
  2764. while (api.IsDoorOpen(selfinfo->x, selfinfo->y - 1000) == false);
  2765. AGAIN23:
  2766. while (mapinfo[selfinfo->x][selfinfo->y] != THUAI6::PlaceType::ClassRoom)
  2767. {
  2768. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::ClassRoom) != -1;
  2769. angle = direction * PI / 2;
  2770. movetime = 1000 / api.GetSelfInfo()->speed;
  2771. api.Move(movetime, angle);
  2772. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2773. }
  2774. while (api.GetClassroomProgress(selfinfo->x, selfinfo->y) != 1)
  2775. {
  2776. api.StartLearning();
  2777. api.Wait();
  2778. api.EndAllAction();
  2779. //Ƿbgm4
  2780. //½mzܺ
  2781. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2782. }
  2783. if (api.GetClassroomProgress(selfinfo->x, selfinfo->y) == 1)
  2784. {
  2785. mapinfo[selfinfo->x][selfinfo->y] = THUAI6::PlaceType::Wall;
  2786. flag11++;
  2787. goto AGAIN23;
  2788. }
  2789. if (flag11 == 3)
  2790. {
  2791. if (api.GetDoorProgress(d3[0], d3[1]) == 1)
  2792. {
  2793. mapinfo[d3[2]][d3[3]] == THUAI6::PlaceType::Wall;
  2794. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door3 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door3))
  2795. {
  2796. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door5) != -1;
  2797. angle = direction * PI / 2;
  2798. movetime = 1000 / api.GetSelfInfo()->speed;
  2799. api.Move(movetime, angle);
  2800. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2801. }
  2802. if (mapinfo[selfinfo->x][selfinfo->y] == THUAI6::PlaceType::Door3)
  2803. {
  2804. api.OpenDoor();
  2805. //goto DOR3;
  2806. }
  2807. mapinfo[d3[2]][d3[3]] == THUAI6::PlaceType::Door3;
  2808. }
  2809. if (api.GetDoorProgress(d3[2], d3[3]) == 1)
  2810. {
  2811. mapinfo[d3[0]][d3[1]] == THUAI6::PlaceType::Wall;
  2812. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door3 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door3))
  2813. {
  2814. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door3) != -1;
  2815. angle = direction * PI / 2;
  2816. movetime = 1000 / api.GetSelfInfo()->speed;
  2817. api.Move(movetime, angle);
  2818. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2819. }
  2820. if (mapinfo[selfinfo->x][selfinfo->y] == THUAI6::PlaceType::Door3)
  2821. {
  2822. api.OpenDoor();
  2823. //goto DOR3;
  2824. }
  2825. mapinfo[d3[2]][d3[3]] == THUAI6::PlaceType::Door3;
  2826. }
  2827. if (api.GetDoorProgress(d6[0], d6[1]) == 1)
  2828. {
  2829. mapinfo[d6[2]][d6[3]] == THUAI6::PlaceType::Wall;
  2830. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))
  2831. {
  2832. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  2833. angle = direction * PI / 2;
  2834. movetime = 1000 / api.GetSelfInfo()->speed;
  2835. api.Move(movetime, angle);
  2836. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2837. }
  2838. if (mapinfo[selfinfo->x][selfinfo->y] == THUAI6::PlaceType::Door6)
  2839. {
  2840. api.OpenDoor();
  2841. //goto DOR6;
  2842. }
  2843. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))
  2844. {
  2845. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  2846. angle = direction * PI / 2;
  2847. movetime = 1000 / api.GetSelfInfo()->speed;
  2848. api.Move(movetime, angle);
  2849. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2850. }
  2851. if (mapinfo[selfinfo->x][selfinfo->y] == THUAI6::PlaceType::Door6)
  2852. {
  2853. api.OpenDoor();
  2854. //goto DOR6;
  2855. }
  2856. mapinfo[d3[2]][d3[3]] == THUAI6::PlaceType::Door6;
  2857. }
  2858. if (api.GetDoorProgress(d6[2], d6[3]) == 1)
  2859. {
  2860. mapinfo[d6[0]][d6[1]] == THUAI6::PlaceType::Wall;
  2861. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))
  2862. {
  2863. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  2864. angle = direction * PI / 2;
  2865. movetime = 1000 / api.GetSelfInfo()->speed;
  2866. api.Move(movetime, angle);
  2867. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2868. }
  2869. if (mapinfo[selfinfo->x][selfinfo->y] == THUAI6::PlaceType::Door6)
  2870. {
  2871. api.OpenDoor();
  2872. //goto DOR6;
  2873. }
  2874. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))
  2875. {
  2876. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  2877. angle = direction * PI / 2;
  2878. movetime = 1000 / api.GetSelfInfo()->speed;
  2879. api.Move(movetime, angle);
  2880. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2881. }
  2882. if (mapinfo[selfinfo->x][selfinfo->y] == THUAI6::PlaceType::Door6)
  2883. {
  2884. api.OpenDoor();
  2885. //goto DOR6;
  2886. }
  2887. mapinfo[d3[0]][d3[1]] == THUAI6::PlaceType::Door6;
  2888. }
  2889. }
  2890. }
  2891. }
  2892. else
  2893. {
  2894. if (id == 0)
  2895. {
  2896. api.SendTextMessage(2, "1");
  2897. api.SendTextMessage(2, "5");
  2898. }
  2899. else
  2900. {
  2901. api.SendTextMessage(3, "1");
  2902. api.SendTextMessage(3, "5");
  2903. }
  2904. //DOR52:
  2905. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door5 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door5) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door5) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door5))
  2906. {
  2907. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door5) != -1;
  2908. angle = direction * PI / 2;
  2909. movetime = 1000 / api.GetSelfInfo()->speed;
  2910. api.Move(movetime, angle);
  2911. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2912. }
  2913. if (mapinfo[selfinfo->x][selfinfo->y] == THUAI6::PlaceType::Door5)
  2914. {
  2915. api.OpenDoor();
  2916. while (api.IsDoorOpen(selfinfo->x, selfinfo->y - 1000) == false);
  2917. AGAIN24:
  2918. while (mapinfo[selfinfo->x][selfinfo->y] != THUAI6::PlaceType::ClassRoom)
  2919. {
  2920. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::ClassRoom) != -1;
  2921. angle = direction * PI / 2;
  2922. movetime = 1000 / api.GetSelfInfo()->speed;
  2923. api.Move(movetime, angle);
  2924. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2925. }
  2926. while (api.GetClassroomProgress(selfinfo->x, selfinfo->y) != 1)
  2927. {
  2928. api.StartLearning();
  2929. api.Wait();
  2930. api.EndAllAction();
  2931. //Ƿbgm4
  2932. //½mzܺ
  2933. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2934. }
  2935. if (api.GetClassroomProgress(selfinfo->x, selfinfo->y) == 1)
  2936. {
  2937. mapinfo[selfinfo->x][selfinfo->y] = THUAI6::PlaceType::Wall;
  2938. flag12++;
  2939. goto AGAIN24;
  2940. }
  2941. if (flag12 == 3)
  2942. {
  2943. if (api.GetDoorProgress(d3[0], d3[1]) == 1)
  2944. {
  2945. mapinfo[d3[2]][d3[3]] == THUAI6::PlaceType::Wall;
  2946. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door3 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door3))
  2947. {
  2948. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door5) != -1;
  2949. angle = direction * PI / 2;
  2950. movetime = 1000 / api.GetSelfInfo()->speed;
  2951. api.Move(movetime, angle);
  2952. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2953. }
  2954. if (mapinfo[selfinfo->x][selfinfo->y] == THUAI6::PlaceType::Door3)
  2955. {
  2956. api.OpenDoor();
  2957. //goto DOR3;
  2958. }
  2959. mapinfo[d3[2]][d3[3]] == THUAI6::PlaceType::Door3;
  2960. }
  2961. if (api.GetDoorProgress(d3[2], d3[3]) == 1)
  2962. {
  2963. mapinfo[d3[0]][d3[1]] == THUAI6::PlaceType::Wall;
  2964. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door3 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door3))
  2965. {
  2966. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door3) != -1;
  2967. angle = direction * PI / 2;
  2968. movetime = 1000 / api.GetSelfInfo()->speed;
  2969. api.Move(movetime, angle);
  2970. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2971. }
  2972. if (mapinfo[selfinfo->x][selfinfo->y] == THUAI6::PlaceType::Door3)
  2973. {
  2974. api.OpenDoor();
  2975. }
  2976. //goto DOR3;
  2977. mapinfo[d3[2]][d3[3]] == THUAI6::PlaceType::Door3;
  2978. }
  2979. if (api.GetDoorProgress(d6[0], d6[1]) == 1)
  2980. {
  2981. mapinfo[d6[2]][d6[3]] == THUAI6::PlaceType::Wall;
  2982. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))
  2983. {
  2984. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  2985. angle = direction * PI / 2;
  2986. movetime = 1000 / api.GetSelfInfo()->speed;
  2987. api.Move(movetime, angle);
  2988. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  2989. }
  2990. if (mapinfo[selfinfo->x][selfinfo->y] == THUAI6::PlaceType::Door6)
  2991. {
  2992. api.OpenDoor();
  2993. //goto DOR6;
  2994. }
  2995. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))
  2996. {
  2997. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  2998. angle = direction * PI / 2;
  2999. movetime = 1000 / api.GetSelfInfo()->speed;
  3000. api.Move(movetime, angle);
  3001. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  3002. }
  3003. if (mapinfo[selfinfo->x][selfinfo->y] == THUAI6::PlaceType::Door6)
  3004. {
  3005. api.OpenDoor();
  3006. //goto DOR6;
  3007. }
  3008. mapinfo[d3[2]][d3[3]] == THUAI6::PlaceType::Door6;
  3009. }
  3010. if (api.GetDoorProgress(d6[2], d6[3]) == 1)
  3011. {
  3012. mapinfo[d6[0]][d6[1]] == THUAI6::PlaceType::Wall;
  3013. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))
  3014. {
  3015. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  3016. angle = direction * PI / 2;
  3017. movetime = 1000 / api.GetSelfInfo()->speed;
  3018. api.Move(movetime, angle);
  3019. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  3020. }
  3021. if (mapinfo[selfinfo->x][selfinfo->y] == THUAI6::PlaceType::Door6)
  3022. {
  3023. api.OpenDoor();
  3024. //goto DOR6;
  3025. }
  3026. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))
  3027. {
  3028. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  3029. angle = direction * PI / 2;
  3030. movetime = 1000 / api.GetSelfInfo()->speed;
  3031. api.Move(movetime, angle);
  3032. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  3033. }
  3034. if (mapinfo[selfinfo->x][selfinfo->y] == THUAI6::PlaceType::Door6)
  3035. {
  3036. api.OpenDoor();
  3037. //goto DOR6;
  3038. }
  3039. mapinfo[d3[0]][d3[1]] == THUAI6::PlaceType::Door6;
  3040. }
  3041. }
  3042. }
  3043. }
  3044. }
  3045. if (has_6 == 1)
  3046. {
  3047. d1 = getDistance(selfinfo->x, selfinfo->y, d6[0], d6[1]);
  3048. d2 = getDistance(selfinfo->x, selfinfo->y, d6[2], d6[3]);
  3049. sd0 = std::to_string(d6[0]);
  3050. sd1 = std::to_string(d6[1]);
  3051. sd2 = std::to_string(d6[2]);
  3052. sd3 = std::to_string(d6[3]);
  3053. if (d1 >= d2)
  3054. {
  3055. if (id == 0)
  3056. {
  3057. api.SendTextMessage(2, "2");
  3058. api.SendTextMessage(2, "6");
  3059. }
  3060. else
  3061. {
  3062. api.SendTextMessage(3, "2");
  3063. api.SendTextMessage(3, "6");
  3064. }
  3065. //DOR61:
  3066. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))
  3067. {
  3068. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  3069. angle = direction * PI / 2;
  3070. movetime = 1000 / api.GetSelfInfo()->speed;
  3071. api.Move(movetime, angle);
  3072. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  3073. }
  3074. //DOR6:
  3075. if (mapinfo[selfinfo->x][selfinfo->y] == THUAI6::PlaceType::Door6)
  3076. {
  3077. api.OpenDoor();
  3078. while (api.IsDoorOpen(selfinfo->x, selfinfo->y - 1000) == false);
  3079. AGAIN25:
  3080. while (mapinfo[selfinfo->x][selfinfo->y] != THUAI6::PlaceType::ClassRoom)
  3081. {
  3082. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::ClassRoom) != -1;
  3083. angle = direction * PI / 2;
  3084. movetime = 1000 / api.GetSelfInfo()->speed;
  3085. api.Move(movetime, angle);
  3086. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  3087. }
  3088. while (api.GetClassroomProgress(selfinfo->x, selfinfo->y) != 1)
  3089. {
  3090. api.StartLearning();
  3091. api.Wait();
  3092. api.EndAllAction();
  3093. //Ƿbgm4
  3094. //½mzܺ
  3095. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  3096. }
  3097. if (api.GetClassroomProgress(selfinfo->x, selfinfo->y) == 1)
  3098. {
  3099. mapinfo[selfinfo->x][selfinfo->y] = THUAI6::PlaceType::Wall;
  3100. flag13++;
  3101. goto AGAIN25;
  3102. }
  3103. if (flag13 == 3)
  3104. {
  3105. if (api.GetDoorProgress(d6[0], d6[1]) == 1)
  3106. {
  3107. mapinfo[d6[2]][d6[3]] == THUAI6::PlaceType::Wall;
  3108. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))
  3109. {
  3110. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door5) != -1;
  3111. angle = direction * PI / 2;
  3112. movetime = 1000 / api.GetSelfInfo()->speed;
  3113. api.Move(movetime, angle);
  3114. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  3115. }
  3116. if (mapinfo[selfinfo->x][selfinfo->y] == THUAI6::PlaceType::Door6)
  3117. {
  3118. api.OpenDoor();
  3119. //goto DOR6;
  3120. }
  3121. mapinfo[d6[2]][d6[3]] == THUAI6::PlaceType::Door6;
  3122. }
  3123. if (api.GetDoorProgress(d6[2], d6[3]) == 1)
  3124. {
  3125. mapinfo[d6[0]][d6[1]] == THUAI6::PlaceType::Wall;
  3126. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))
  3127. {
  3128. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  3129. angle = direction * PI / 2;
  3130. movetime = 1000 / api.GetSelfInfo()->speed;
  3131. api.Move(movetime, angle);
  3132. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  3133. }
  3134. if (mapinfo[selfinfo->x][selfinfo->y] == THUAI6::PlaceType::Door6)
  3135. {
  3136. api.OpenDoor();
  3137. //goto DOR6;
  3138. }
  3139. mapinfo[d3[2]][d3[3]] == THUAI6::PlaceType::Door6;
  3140. }
  3141. if (api.GetDoorProgress(d3[0], d3[1]) == 1)
  3142. {
  3143. mapinfo[d3[2]][d3[3]] == THUAI6::PlaceType::Wall;
  3144. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door3 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door3))
  3145. {
  3146. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door3) != -1;
  3147. angle = direction * PI / 2;
  3148. movetime = 1000 / api.GetSelfInfo()->speed;
  3149. api.Move(movetime, angle);
  3150. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  3151. }
  3152. if (mapinfo[selfinfo->x][selfinfo->y] == THUAI6::PlaceType::Door3)
  3153. {
  3154. api.OpenDoor();
  3155. //goto DOR3;
  3156. }
  3157. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door3 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door3))
  3158. {
  3159. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door3) != -1;
  3160. angle = direction * PI / 2;
  3161. movetime = 1000 / api.GetSelfInfo()->speed;
  3162. api.Move(movetime, angle);
  3163. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  3164. }
  3165. if (mapinfo[selfinfo->x][selfinfo->y] == THUAI6::PlaceType::Door3)
  3166. {
  3167. api.OpenDoor();
  3168. //goto DOR3;
  3169. }
  3170. mapinfo[d6[2]][d6[3]] == THUAI6::PlaceType::Door3;
  3171. }
  3172. if (api.GetDoorProgress(d3[2], d3[3]) == 1)
  3173. {
  3174. mapinfo[d3[0]][d3[1]] == THUAI6::PlaceType::Wall;
  3175. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door3 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door3))
  3176. {
  3177. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door3) != -1;
  3178. angle = direction * PI / 2;
  3179. movetime = 1000 / api.GetSelfInfo()->speed;
  3180. api.Move(movetime, angle);
  3181. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  3182. }
  3183. if (mapinfo[selfinfo->x][selfinfo->y] == THUAI6::PlaceType::Door3)
  3184. {
  3185. api.OpenDoor();
  3186. //goto DOR3;
  3187. }
  3188. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door3 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door3))
  3189. {
  3190. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door3) != -1;
  3191. angle = direction * PI / 2;
  3192. movetime = 1000 / api.GetSelfInfo()->speed;
  3193. api.Move(movetime, angle);
  3194. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  3195. }
  3196. if (mapinfo[selfinfo->x][selfinfo->y] == THUAI6::PlaceType::Door3)
  3197. {
  3198. api.OpenDoor();
  3199. //goto DOR3;
  3200. }
  3201. mapinfo[d6[0]][d6[1]] == THUAI6::PlaceType::Door3;
  3202. }
  3203. }
  3204. }
  3205. }
  3206. else
  3207. {
  3208. if (id == 0)
  3209. {
  3210. api.SendTextMessage(2, "1");
  3211. api.SendTextMessage(2, "6");
  3212. }
  3213. else
  3214. {
  3215. api.SendTextMessage(3, "1");
  3216. api.SendTextMessage(3, "6");
  3217. }
  3218. //DOR62:
  3219. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))
  3220. {
  3221. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  3222. angle = direction * PI / 2;
  3223. movetime = 1000 / api.GetSelfInfo()->speed;
  3224. api.Move(movetime, angle);
  3225. }
  3226. if (mapinfo[selfinfo->x][selfinfo->y] == THUAI6::PlaceType::Door6)
  3227. {
  3228. api.OpenDoor();
  3229. while (api.IsDoorOpen(selfinfo->x, selfinfo->y - 1000) == false);
  3230. AGAIN26:
  3231. while (mapinfo[selfinfo->x][selfinfo->y] != THUAI6::PlaceType::ClassRoom)
  3232. {
  3233. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::ClassRoom) != -1;
  3234. angle = direction * PI / 2;
  3235. movetime = 1000 / api.GetSelfInfo()->speed;
  3236. api.Move(movetime, angle);
  3237. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  3238. }
  3239. while (api.GetClassroomProgress(selfinfo->x, selfinfo->y) != 1)
  3240. {
  3241. api.StartLearning();
  3242. api.Wait();
  3243. api.EndAllAction();
  3244. //Ƿbgm4
  3245. //½mzܺ
  3246. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  3247. }
  3248. if (api.GetClassroomProgress(selfinfo->x, selfinfo->y) == 1)
  3249. {
  3250. mapinfo[selfinfo->x][selfinfo->y] = THUAI6::PlaceType::Wall;
  3251. flag14++;
  3252. goto AGAIN26;
  3253. }
  3254. if (flag14 == 3)
  3255. {
  3256. if (api.GetDoorProgress(d6[0], d6[1]) == 1)
  3257. {
  3258. mapinfo[d6[2]][d6[3]] == THUAI6::PlaceType::Wall;
  3259. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))
  3260. {
  3261. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door5) != -1;
  3262. angle = direction * PI / 2;
  3263. movetime = 1000 / api.GetSelfInfo()->speed;
  3264. api.Move(movetime, angle);
  3265. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  3266. }
  3267. if (mapinfo[selfinfo->x][selfinfo->y] == THUAI6::PlaceType::Door6)
  3268. {
  3269. api.OpenDoor();
  3270. //goto DOR6;
  3271. }
  3272. mapinfo[d6[2]][d6[3]] == THUAI6::PlaceType::Door6;
  3273. }
  3274. if (api.GetDoorProgress(d6[2], d6[3]) == 1)
  3275. {
  3276. mapinfo[d6[0]][d6[1]] == THUAI6::PlaceType::Wall;
  3277. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))
  3278. {
  3279. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door6) != -1;
  3280. angle = direction * PI / 2;
  3281. movetime = 1000 / api.GetSelfInfo()->speed;
  3282. api.Move(movetime, angle);
  3283. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  3284. }
  3285. if (mapinfo[selfinfo->x][selfinfo->y] == THUAI6::PlaceType::Door6)
  3286. {
  3287. api.OpenDoor();
  3288. //goto DOR6;
  3289. }
  3290. mapinfo[d3[2]][d3[3]] == THUAI6::PlaceType::Door6;
  3291. }
  3292. if (api.GetDoorProgress(d3[0], d3[1]) == 1)
  3293. {
  3294. mapinfo[d3[2]][d3[3]] == THUAI6::PlaceType::Wall;
  3295. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door6 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door6) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door6))
  3296. {
  3297. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door3) != -1;
  3298. angle = direction * PI / 2;
  3299. movetime = 1000 / api.GetSelfInfo()->speed;
  3300. api.Move(movetime, angle);
  3301. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  3302. }
  3303. if (mapinfo[selfinfo->x][selfinfo->y] == THUAI6::PlaceType::Door3)
  3304. {
  3305. api.OpenDoor();
  3306. //goto DOR3;
  3307. }
  3308. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door3 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door3))
  3309. {
  3310. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door3) != -1;
  3311. angle = direction * PI / 2;
  3312. movetime = 1000 / api.GetSelfInfo()->speed;
  3313. api.Move(movetime, angle);
  3314. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  3315. }
  3316. if (mapinfo[selfinfo->x][selfinfo->y] == THUAI6::PlaceType::Door3)
  3317. {
  3318. api.OpenDoor();
  3319. //goto DOR3;
  3320. }
  3321. mapinfo[d6[2]][d6[3]] == THUAI6::PlaceType::Door3;
  3322. }
  3323. if (api.GetDoorProgress(d3[2], d3[3]) == 1)
  3324. {
  3325. mapinfo[d3[0]][d3[1]] == THUAI6::PlaceType::Wall;
  3326. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door3 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door3))
  3327. {
  3328. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door3) != -1;
  3329. angle = direction * PI / 2;
  3330. movetime = 1000 / api.GetSelfInfo()->speed;
  3331. api.Move(movetime, angle);
  3332. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  3333. }
  3334. if (mapinfo[selfinfo->x][selfinfo->y] == THUAI6::PlaceType::Door3)
  3335. {
  3336. api.OpenDoor();
  3337. //goto DOR3;
  3338. }
  3339. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::Door3 && (mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::Door3) && (mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::Door3))
  3340. {
  3341. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Door3) != -1;
  3342. angle = direction * PI / 2;
  3343. movetime = 1000 / api.GetSelfInfo()->speed;
  3344. api.Move(movetime, angle);
  3345. func(api, speed, life, hp, shield, rec, c, g, d3, d5, d6);
  3346. }
  3347. if (mapinfo[selfinfo->x][selfinfo->y] == THUAI6::PlaceType::Door3)
  3348. {
  3349. api.OpenDoor();
  3350. //goto DOR3;
  3351. }
  3352. mapinfo[d6[0]][d6[1]] == THUAI6::PlaceType::Door3;
  3353. }
  3354. }
  3355. }
  3356. }
  3357. }
  3358. }
  3359. }
  3360. //tricker
  3361. void func2(ITrickerAPI& api)
  3362. {
  3363. std::vector<std::vector<THUAI6::PlaceType>> mapinfo = api.GetFullMap();
  3364. std::vector<std::shared_ptr<const THUAI6::Student>> info = api.GetStudents();
  3365. std::shared_ptr<const THUAI6::Tricker> selfinfo = api.GetSelfInfo();
  3366. if (selfinfo->trickDesire >= (153 / 130))
  3367. {
  3368. api.UseSkill(0);
  3369. }
  3370. }
  3371. int BFSx(int startX, int startY, std::vector<std::vector<THUAI6::PlaceType>>& mapinfo, int targetx, int targety)
  3372. {
  3373. // return the first step to the target
  3374. int visited[50][50];
  3375. memset(visited, -1, sizeof(visited));//ʼΪ-1
  3376. std::queue<std::tuple<int, int, int>> q;//q
  3377. q.push(std::make_tuple(startX, startY, -1));
  3378. visited[startX][startY] = 0;
  3379. while (!q.empty())
  3380. {
  3381. std::tuple<int, int, int> now = q.front();
  3382. q.pop();
  3383. int x = std::get<0>(now);
  3384. int y = std::get<1>(now);
  3385. int direction = std::get<2>(now);
  3386. if (x == targetx && y == targety)
  3387. return direction;
  3388. // ĸҪ
  3389. if (x > 0 && visited[x - 1][y] == -1 && (mapinfo[x - 1][y] == THUAI6::PlaceType::Land) || (mapinfo[x - 1][y] == THUAI6::PlaceType::Grass))
  3390. {
  3391. if (direction == -1)
  3392. q.push(std::make_tuple(x - 1, y, 2));
  3393. else
  3394. q.push(std::make_tuple(x - 1, y, direction));
  3395. visited[x - 1][y] = visited[x][y] + 1;
  3396. }
  3397. if (x < 49 && visited[x + 1][y] == -1 && (mapinfo[x + 1][y] == THUAI6::PlaceType::Land) || (mapinfo[x + 1][y] == THUAI6::PlaceType::Grass))
  3398. {
  3399. if (direction == -1)
  3400. q.push(std::make_tuple(x + 1, y, 0));
  3401. else
  3402. q.push(std::make_tuple(x + 1, y, direction));
  3403. visited[x + 1][y] = visited[x][y] + 1;
  3404. }
  3405. if (y > 0 && visited[x][y - 1] == -1 && (mapinfo[x][y - 1] == THUAI6::PlaceType::Land) || (mapinfo[x][y - 1] == THUAI6::PlaceType::Grass))
  3406. {
  3407. if (direction == -1)
  3408. q.push(std::make_tuple(x, y - 1, 3));
  3409. else
  3410. q.push(std::make_tuple(x, y - 1, direction));
  3411. visited[x][y - 1] = visited[x][y] + 1;
  3412. }
  3413. if (y < 49 && visited[x][y + 1] == -1 && (mapinfo[x][y + 1] == THUAI6::PlaceType::Land) || (mapinfo[x][y + 1] == THUAI6::PlaceType::Grass))
  3414. {
  3415. if (direction == -1)
  3416. q.push(std::make_tuple(x, y + 1, 1));
  3417. else
  3418. q.push(std::make_tuple(x, y + 1, direction));
  3419. visited[x][y + 1] = visited[x][y] + 1;
  3420. }
  3421. }
  3422. return -1;
  3423. }
  3424. void AI::play(ITrickerAPI& api)
  3425. {
  3426. std::vector<std::vector<THUAI6::PlaceType>> mapinfo = api.GetFullMap();
  3427. std::shared_ptr<const THUAI6::Tricker> selfinfo = api.GetSelfInfo();
  3428. std::vector<std::vector<THUAI6::PlaceType>> mapinfo1 = api.GetFullMap();
  3429. short has_3 = 0, has_5 = 0, has_6 = 0, speed = 0, life = 0, hp = 0, shield = 0, rec = 0;//
  3430. int chests[Constants::numOfChest * 2]; int* c = chests;
  3431. int classroomx[9], classroomy[9];
  3432. double tran, d1, d2;
  3433. int id = selfinfo->playerID;
  3434. int flag = 0, goal = 0, flag2 = 0, sign = 0;
  3435. std::string s1, s2, s3, s4, sd0, sd1, sd2, sd3;
  3436. double direction, angle;
  3437. int movetime;
  3438. int i = 0, j = 0, NUM = 0;
  3439. for (i = 0; i < 50; i++)
  3440. {
  3441. for (j = 0; j < 50; j++)
  3442. {
  3443. if (mapinfo[i][j] == THUAI6::PlaceType::ClassRoom)
  3444. {
  3445. classroomx[NUM] = i;
  3446. classroomy[NUM] = j;
  3447. NUM++;
  3448. }
  3449. if (mapinfo[i][j] == THUAI6::PlaceType::Chest)
  3450. {
  3451. *c = i; c++; *c = j; c++;
  3452. }
  3453. func2(api);
  3454. }
  3455. }
  3456. for (int i = 0; i < Constants::numOfChest * 2; i += 2)
  3457. {
  3458. for (int j = i + 2; j < Constants::numOfChest * 2; j += 2)
  3459. {
  3460. d1 = getDistance(selfinfo->x, selfinfo->y, c[i], c[i + 1]);
  3461. d2 = getDistance(selfinfo->x, selfinfo->y, c[j], c[j + 1]);
  3462. if (d2 < d1)
  3463. {
  3464. tran = c[j]; c[j] = c[i]; c[i] = tran;
  3465. tran = c[j + 1]; c[j + 1] = c[i + 1]; c[i + 1] = tran;
  3466. }
  3467. func2(api);
  3468. }
  3469. }
  3470. NUM = 0;
  3471. while (flag == 0)
  3472. {
  3473. std::string sc1 = std::to_string(c[NUM]), sc2 = std::to_string(c[NUM + 1]);
  3474. goal = NUM;
  3475. if (NUM == (Constants::numOfChest * 2 + 1)) break;
  3476. if ((NUM == goal) && (api.GetChestProgress(c[goal], c[goal + 1]) != 1)) flag = 1;
  3477. while (flag == 1 && api.GetChestProgress(c[goal], c[goal + 1]) != 1 && flag2 != 1)
  3478. {
  3479. if (mapinfo[selfinfo->x + 1][selfinfo->y] == THUAI6::PlaceType::Chest || mapinfo[selfinfo->x - 1][selfinfo->y] == THUAI6::PlaceType::Chest || mapinfo[selfinfo->x][selfinfo->y + 1] == THUAI6::PlaceType::Chest || mapinfo[selfinfo->x][selfinfo->y - 1] == THUAI6::PlaceType::Chest)
  3480. {
  3481. flag2 = 1;
  3482. }
  3483. direction = BFS(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, THUAI6::PlaceType::Chest) != -1;
  3484. angle = direction * PI / 2;
  3485. movetime = 1000 / api.GetSelfInfo()->speed;
  3486. api.Move(movetime, angle);
  3487. func2(api);
  3488. }
  3489. if (api.GetChestProgress(c[goal], c[goal + 1]) == 1)
  3490. {
  3491. flag = 0;
  3492. mapinfo[c[goal]][c[goal + 1]] = THUAI6::PlaceType::Wall;
  3493. }
  3494. if (flag2 == 1)
  3495. {
  3496. while (api.GetChestProgress(c[goal], c[goal + 1]) != 1) api.StartOpenChest();//
  3497. mapinfo[c[goal]][c[goal + 1]] = THUAI6::PlaceType::Wall;
  3498. flag = 0;
  3499. if (api.PickProp(THUAI6::PropType::Key3).get()) has_3 = 1;
  3500. if (api.PickProp(THUAI6::PropType::Key5).get()) has_5 = 1;
  3501. if (api.PickProp(THUAI6::PropType::Key6).get()) has_6 = 1;
  3502. func2(api);
  3503. }
  3504. while (flag != 0)
  3505. {
  3506. NUM = 0;
  3507. while (sign == 0)
  3508. {
  3509. if (api.GetClassroomProgress(classroomx[NUM], classroomy[NUM]) > 0 && api.GetClassroomProgress(classroomx[NUM], classroomy[NUM]) < 1)sign = 1;
  3510. else NUM++;
  3511. }
  3512. while (mapinfo[selfinfo->x + 1][selfinfo->y] != THUAI6::PlaceType::ClassRoom || mapinfo[selfinfo->x - 1][selfinfo->y] != THUAI6::PlaceType::ClassRoom || mapinfo[selfinfo->x][selfinfo->y + 1] != THUAI6::PlaceType::ClassRoom || mapinfo[selfinfo->x][selfinfo->y - 1] != THUAI6::PlaceType::ClassRoom)
  3513. {
  3514. direction = BFSx(selfinfo->x / 1000, selfinfo->y / 1000, mapinfo, classroomx[NUM], classroomy[NUM]);
  3515. angle = direction * PI / 2;
  3516. movetime = 1000 / api.GetSelfInfo()->speed;
  3517. api.Move(movetime, angle);
  3518. func2(api);
  3519. }
  3520. }
  3521. }
  3522. }