Guest User

Untitled

a guest
Feb 19th, 2018
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.21 KB | None | 0 0
  1. #pragma once
  2. #include <vector>
  3. #include "Point2d.h"
  4. #include "Army.h"
  5. class Army;
  6. using namespace std;
  7. class Map
  8. {
  9. int XSIZE,YSIZE;
  10. char **map;
  11. int **TRACE;
  12. int **WayArr;
  13. public:
  14. void SetPositions(Army *a1, Army *a2);
  15. Map(int sizex, int sizey);
  16. Map(char *c);
  17. void LoadMap(char *c);
  18. void WriteMap(FILE *f);
  19. void ReadMap(FILE *f);
  20. vector <Point2d> CalcWay(int x1,int y1, int x2, int y2);
  21. vector <Point2d> CalcWay(Point2d p1,Point2d p);
  22. int getX()
  23. {
  24. return XSIZE;
  25. }
  26.  
  27. int getY()
  28. {
  29. return YSIZE;
  30. }
  31. Map(){};
  32. char getChar(int x, int y)
  33. {
  34. return map[x][y];
  35. }
  36. ~Map(void);
  37. };
  38.  
  39. #include "StdAfx.h"
  40. #include "Map.h"
  41. #include "Soldier.h"
  42. #include <iostream>
  43. #include <stdlib.h>
  44. using namespace std;
  45. #define TRUE true
  46. #define FALSE false
  47.  
  48. Map::Map(int x, int y)
  49. {
  50. this->XSIZE = x;
  51. this->YSIZE = y;
  52.  
  53. this->map = new char * [XSIZE];
  54. this->TRACE = new int * [XSIZE];
  55. this->WayArr = new int *[XSIZE];
  56. for(int i =0; i< XSIZE; i++)
  57. {
  58. this->TRACE[i] = new int[YSIZE];
  59. this->map[i] = new char[YSIZE];
  60. this->WayArr[i] = new int[YSIZE];
  61. }
  62.  
  63. }
  64.  
  65. void Map::LoadMap(char *c)
  66. {
  67. FILE *f = fopen(c,"r");
  68. if(f)
  69. {
  70. fscanf(f,"%d%d",&this->XSIZE,&this->YSIZE);
  71. this->map = new char * [XSIZE];
  72. this->TRACE = new int * [XSIZE];
  73. this->WayArr = new int *[XSIZE];
  74. for(int i =0; i< XSIZE; i++)
  75. {
  76. this->TRACE[i] = new int[YSIZE];
  77. this->map[i] = new char[YSIZE];
  78. this->WayArr[i] = new int[YSIZE];
  79. }
  80. char x;//хз зачем так сделал, но оно работает.
  81. x = fgetc(f);
  82.  
  83. for(int j = 0; j<YSIZE; j++)
  84. for(int i =0;i<XSIZE+1;i++)
  85. {
  86. x = fgetc(f);
  87. if(i<XSIZE)
  88. {
  89. map[i][j] =x;
  90. TRACE[i][j]=0;
  91. }
  92. }
  93. fclose(f);
  94. }
  95. }
  96.  
  97. Map::Map(char *c)
  98. {
  99. LoadMap(c);
  100. }
  101.  
  102. void Map::WriteMap(FILE *f)
  103. {
  104. fwrite((char*)&XSIZE,4,1,f);
  105. fwrite((char*)&YSIZE,4,1,f);
  106. for(int i =0; i< XSIZE; i++)
  107. for(int j =0; j<YSIZE; j++)
  108. {
  109. fwrite((char *)&map[i][j],1,1,f);
  110. }
  111. }
  112.  
  113. void Map::ReadMap(FILE *f)
  114. {
  115. fread((char*)&XSIZE,4,1,f);
  116. fread((char*)&YSIZE,4,1,f);
  117.  
  118. this->map = new char * [XSIZE];
  119. this->TRACE = new int * [XSIZE];
  120. this->WayArr = new int * [XSIZE];
  121. for(int i =0; i< XSIZE; i++)
  122. {
  123. this->TRACE[i] = new int[YSIZE];
  124. this->map[i] = new char[YSIZE];
  125. this->WayArr[i] = new int [YSIZE];
  126. }
  127.  
  128. for(int i =0; i< XSIZE; i++)
  129. for(int j =0; j<YSIZE; j++)
  130. {
  131. fread((char *)&map[i][j],1,1,f);
  132. }
  133. }
  134.  
  135. void Map::SetPositions(Army *a1,Army *a2)
  136. {
  137. //vector <Soldier *> v = a1->GetSoldiers();
  138. /* for(int i =0; i<v.size(); i++)
  139. {
  140. TRACE[v[i]->getPos().x][v[i]->getPos().y] = 90;
  141. }
  142.  
  143. v = a2->GetSoldiers();
  144. for(int i =0; i<v.size(); i++)
  145. {
  146. TRACE[v[i]->getPos().x][v[i]->getPos().y] = 90;
  147. }
  148. */
  149. /* for(int j=0;j<YSIZE;j++)
  150. {
  151. for(int i=0;i<XSIZE;i++)
  152. {
  153. TRACE[i][j]=0;
  154. WayArr[i][j]=0;
  155. if(map[i][j]=='*' )
  156. TRACE[i][j]=XSIZE*YSIZE;//sheight - стенка.
  157. }
  158. }*/
  159.  
  160. }
  161. vector <Point2d> Map::CalcWay(int x1, int y1, int x2, int y2)
  162. {
  163.  
  164. TRACE[x1][y1]=1;//точка кто идет(тоесть враг) - 1.
  165. WayArr[x2][y2] = 0; //чтоб враг съел игрока , а не остановился перед ним - клетка игрока тоже 20.
  166. //(в этом массиве клетка куда надо идти помечаеться 20кой.)
  167. for(int k=0;k<XSIZE*YSIZE;k++)//три цикла.
  168. {//1 для волны, да для массивов.
  169. for(int j=0;j<YSIZE;j++)
  170. {
  171. for(int i=0;i<XSIZE;i++)
  172. {
  173. if(i+1<XSIZE && TRACE[i][j]==0 && TRACE[i+1][j]==k+1 && map[i][j]!='*')//если не стенка и правая - на 1 больше этой и не стенка(зачем еще раз??), то....
  174. { TRACE[i][j]=k+2;}//трасса - следующий номер.
  175. if(i-1>0 && TRACE[i][j]==0 && TRACE[i-1][j]==k+1 && map[i][j]!='*')
  176. { TRACE[i][j]=k+2;}
  177. if( j+1<YSIZE && TRACE[i][j]==0 && TRACE[i][j+1]==k+1 && map[i][j]!='*')
  178. { TRACE[i][j]=k+2;}
  179. if(j-1>0 && TRACE[i][j]==0 && TRACE[i][j-1]==k+1 && map[i][j]!='*')
  180. { TRACE[i][j]=k+2;}
  181. }
  182. }
  183. }
  184.  
  185. /***************************************************************************/
  186. vector <Point2d> res;
  187. int x3=x2;
  188. int y3=y2;
  189. for(int i=0;i<TRACE[x2][y2];i++)//И идет до игрока...
  190. {
  191. if(i%2)//если и четная то...
  192. {
  193. if(TRACE[x3][y3+1]<TRACE[x3][y3])//если следующая меньше этой,
  194. { y3++; goto bc; }//го туда.
  195. if(TRACE[x3][y3-1]<TRACE[x3][y3])
  196. { y3--; goto bc; }
  197. if(TRACE[x3+1][y3]<TRACE[x3][y3])
  198. { x3++; goto bc; }
  199. if(TRACE[x3-1][y3]<TRACE[x3][y3])
  200. { x3--; goto bc; }
  201. }
  202. else//иначе го сюда.
  203. {
  204. if(TRACE[x3+1][y3]<TRACE[x3][y3])
  205. { x3++; goto bc; }
  206. if(TRACE[x3-1][y3]<TRACE[x3][y3])
  207. { x3--; goto bc; }
  208. if(TRACE[x3][y3+1]<TRACE[x3][y3])
  209. { y3++; goto bc; }
  210. if(TRACE[x3][y3-1]<TRACE[x3][y3])
  211. { y3--; goto bc; }
  212. }
  213.  
  214. bc:
  215. //WayArr[x3][y3]=20;//нужные клетки заполняем.
  216. res.push_back(Point2d(x3,y3));
  217. }
  218. return res;
  219. }
  220.  
  221. vector <Point2d> Map::CalcWay(Point2d p1, Point2d p2)
  222. {
  223. //нужна гребаная оптимизация
  224. int x1,y1,x2,y2;
  225. x1=p2.x;
  226. y1=p2.y;
  227. x2=p1.x;
  228. y2=p1.y;
  229.  
  230. for(int i =0; i< XSIZE; i++)
  231. for(int j =0; j<YSIZE; j++)
  232. {
  233. TRACE[i][j] = 0;
  234. WayArr[i][j] = 0;
  235. if(map[i][j]=='*' )
  236. TRACE[i][j]=XSIZE*YSIZE;//sheight - стенка.
  237.  
  238. }
  239. TRACE[x1][y1]=1;//точка кто идет(тоесть враг) - 1.
  240. WayArr[x2][y2] = 0; //чтоб враг съел игрока , а не остановился перед ним - клетка игрока тоже 20.
  241. //(в этом массиве клетка куда надо идти помечаеться 20кой.)
  242. bool b = false;
  243. for(int k=0;k<XSIZE*YSIZE;k++)//три цикла.
  244. {//1 для волны, да для массивов.
  245. for(int j=0;j<YSIZE;j++)
  246. {
  247. for(int i=0;i<XSIZE;i++)
  248. {
  249. if(i+1<XSIZE && TRACE[i][j]==0 && TRACE[i+1][j]==k+1 && map[i][j]!='*')//если не стенка и правая - на 1 больше этой и не стенка(зачем еще раз??), то....
  250. { TRACE[i][j]=k+2;}//трасса - следующий номер.
  251. if(i-1>=0 && TRACE[i][j]==0 && TRACE[i-1][j]==k+1 && map[i][j]!='*')
  252. { TRACE[i][j]=k+2;}
  253. if( j+1<YSIZE && TRACE[i][j]==0 && TRACE[i][j+1]==k+1 && map[i][j]!='*')
  254. { TRACE[i][j]=k+2;}
  255. if(j-1>=0 && TRACE[i][j]==0 && TRACE[i][j-1]==k+1 && map[i][j]!='*')
  256. { TRACE[i][j]=k+2;}
  257. }
  258. }
  259. if(x2-1>=0 && x2+1<XSIZE && y2-1>=0 && y2+1 < YSIZE)
  260. if(TRACE[x2-1][y2] != 0 && TRACE[x2+1][y2] != 0 && TRACE[x2][y2-1] != 0 && TRACE[x2][y2+1] != 0)
  261. { b = true;cout<<"Algorithm breaked at "<<k<<" iterations."<<endl; break;}
  262. }
  263. if(!b)
  264. cout<<"Algorithm breaked at MAXIMUM: "<<XSIZE*YSIZE<<" iterations"<<endl;
  265.  
  266. /***************************************************************************/
  267. vector <Point2d> res;
  268. int x3=x2;
  269. int y3=y2;
  270. for(int i=0;i<TRACE[x2][y2];i++)//И идет до игрока...
  271. {
  272. if(i%2)//если и четная то...
  273. {
  274. if(y3+1<YSIZE && TRACE[x3][y3+1]<TRACE[x3][y3])//если следующая меньше этой,
  275. { y3++; goto bc; }//го туда.
  276. if(y3-1>=0 && TRACE[x3][y3-1]<TRACE[x3][y3])
  277. { y3--; goto bc; }
  278. if(x3+1<XSIZE && TRACE[x3+1][y3]<TRACE[x3][y3])
  279. { x3++; goto bc; }
  280. if(x3-1 >=0 && TRACE[x3-1][y3]<TRACE[x3][y3])
  281. { x3--; goto bc; }
  282. }
  283. else//иначе го сюда.
  284. {
  285. if(x3+1<XSIZE && TRACE[x3+1][y3]<TRACE[x3][y3])
  286. { x3++; goto bc; }
  287. if(x3-1>=0 && TRACE[x3-1][y3]<TRACE[x3][y3])
  288. { x3--; goto bc; }
  289. if(y3+1<YSIZE && TRACE[x3][y3+1]<TRACE[x3][y3])
  290. { y3++; goto bc; }
  291. if(y3-1>=0 && TRACE[x3][y3-1]<TRACE[x3][y3])
  292. { y3--; goto bc; }
  293. }
  294.  
  295. bc:
  296. //WayArr[x3][y3]=20;//нужные клетки заполняем.
  297. // if(x2 != x3 || y2 != y3)
  298. res.push_back(Point2d(x3,y3));
  299. // x2 = x3;
  300. //y2 = y3;
  301. }
  302.  
  303. // for(int i =1; i<res.size(); i++)
  304. // if(res[i].x == res[i-1].x && res[i].y == res[i-1].y)
  305.  
  306. // res.erase(res);
  307. return res;
  308. }
  309.  
  310.  
  311.  
  312. Map::~Map(void)
  313. {
  314. }
Add Comment
Please, Sign In to add comment