SearchSpecialPath.js 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406
  1. (function() {
  2. var __IS_THE_NONE = -1;
  3. var __IS_THE_VERTICAL = 0;
  4. var __IS_THE_LEVEL = 1;
  5. var __line = 0;
  6. var __col = 0;
  7. var __map = null;
  8. var __destPath = null;
  9. var __clearPath = function() {
  10. if (null === __destPath) {
  11. __destPath = (__destPath || []);
  12. return;
  13. }
  14. while (__destPath.length > 0) {
  15. __destPath.pop();
  16. }
  17. };
  18. var __getSameLineDistance = function(startx, starty, endx, endy) {
  19. var distance = 0;
  20. distance = Math.abs(startx - endx) + Math.abs(starty - endy);
  21. return distance;
  22. };
  23. var __isInSameLineOrCol = function(startx, starty, endx, endy) {
  24. var tmp = null;
  25. var index = starty * __col + startx;
  26. if ((startx !== endx) && (starty !== endy)) {
  27. return false;
  28. }
  29. var tmpStartX = 0;
  30. var tmpStartY = 0;
  31. var tmpEndX = 0;
  32. var tmpEndY = 0;
  33. if (startx === endx) {
  34. // in the same col
  35. tmpStartX = startx;
  36. tmpStartY = starty;
  37. tmpEndX = endx;
  38. tmpEndY = endy;
  39. if (starty > endy) {
  40. tmpStartY = endy;
  41. tmpEndY = starty;
  42. }
  43. // index = (tmpStartY + 1) * __col + tmpStartX;
  44. for (index = (tmpStartY + 1) * __col + tmpStartX; index < tmpEndY * __col
  45. + tmpEndX; index += __col) {
  46. tmp = __map[index];
  47. if (FZ.GameDefs.DREAMPET_REMOVE !== tmp.m_state) {
  48. return false;
  49. }
  50. }
  51. } else if (starty === endy) {
  52. // in the same line
  53. tmpStartX = startx;
  54. tmpStartY = starty;
  55. tmpEndX = endx;
  56. tmpEndY = endy;
  57. if (startx > endx) {
  58. tmpStartX = endx;
  59. tmpEndX = startx;
  60. }
  61. // index = tmpStartY * __col + tmpStartX + 1;
  62. for (index = tmpStartY * __col + tmpStartX + 1; index < tmpEndY * __col
  63. + tmpEndX; index++) {
  64. tmp = __map[index];
  65. if (FZ.GameDefs.DREAMPET_REMOVE !== tmp.m_state) {
  66. return false;
  67. }
  68. }
  69. }
  70. return true;
  71. };
  72. var __isInDiagonal = function(startx, starty, endx, endy) {
  73. var cornerx = 0;
  74. var cornery = 0;
  75. var index = 0;
  76. var result = false;
  77. var tmp = null;
  78. // top
  79. cornerx = endx;
  80. cornery = starty;
  81. tmp = __map[cornery * __col + cornerx];
  82. if ((FZ.GameDefs.DREAMPET_REMOVE === tmp.m_state)) {
  83. result = __isInSameLineOrCol(startx, starty, cornerx, cornery);
  84. if (result) {
  85. result = __isInSameLineOrCol(cornerx, cornery, endx, endy);
  86. if (result) {
  87. __destPath.push( [ cornerx, cornery ]);
  88. return true;
  89. }
  90. }
  91. }
  92. //level
  93. cornerx = startx;
  94. cornery = endy;
  95. tmp = __map[cornery * __col + cornerx];
  96. if ((FZ.GameDefs.DREAMPET_REMOVE === tmp.m_state)) {
  97. result = __isInSameLineOrCol(startx, starty, cornerx, cornery);
  98. if (result) {
  99. result = __isInSameLineOrCol(cornerx, cornery, endx, endy);
  100. if (result) {
  101. __destPath.push( [ cornerx, cornery ]);
  102. return true;
  103. }
  104. }
  105. }
  106. return false;
  107. };
  108. var __isInTwoDiagonal = function(startx, starty, endx, endy) {
  109. var result = 0;
  110. var curStartX = 0;
  111. var curStartY = 0;
  112. var tmpStartX = 0;
  113. var tmpStartY = 0;
  114. var tmpEndX = 0;
  115. var tmpEndY = 0;
  116. var index = 0;
  117. var tmp = null;
  118. // search the near x
  119. if (startx < endx) {
  120. curStartX = startx;
  121. curStartY = starty;
  122. tmpEndX = endx;
  123. tmpEndY = endy;
  124. } else {
  125. curStartX = endx;
  126. curStartY = endy;
  127. tmpEndX = startx;
  128. tmpEndY = starty;
  129. }
  130. tmpStartX = curStartX;
  131. tmpStartY = curStartY;
  132. for (tmpStartX = tmpStartX + 1; tmpStartX < __col; tmpStartX++) {
  133. tmp = __map[tmpStartY * __col + tmpStartX];
  134. if (FZ.GameDefs.DREAMPET_REMOVE !== tmp.m_state) {
  135. break;
  136. }
  137. __clearPath();
  138. __destPath.push( [ curStartX, curStartY ]);
  139. __destPath.push( [ tmpStartX, tmpStartY ]);
  140. if (__isInDiagonal(tmpStartX, tmpStartY, tmpEndX, tmpEndY)) {
  141. __destPath.push( [ tmpEndX, tmpEndY ]);
  142. return true;
  143. }
  144. }
  145. // search near y
  146. if (starty < endy) {
  147. curStartX = startx;
  148. curStartY = starty;
  149. tmpEndX = endx;
  150. tmpEndY = endy;
  151. } else {
  152. curStartX = endx;
  153. curStartY = endy;
  154. tmpEndX = startx;
  155. tmpEndY = starty;
  156. }
  157. tmpStartX = curStartX;
  158. tmpStartY = curStartY;
  159. for (tmpStartY = tmpStartY + 1; tmpStartY < __line; tmpStartY++) {
  160. tmp = __map[tmpStartY * __col + tmpStartX];
  161. if (FZ.GameDefs.DREAMPET_REMOVE !== tmp.m_state) {
  162. break;
  163. }
  164. __clearPath();
  165. __destPath.push( [ curStartX, curStartY ]);
  166. __destPath.push( [ tmpStartX, tmpStartY ]);
  167. if (__isInDiagonal(tmpStartX, tmpStartY, tmpEndX, tmpEndY)) {
  168. __destPath.push( [ tmpEndX, tmpEndY ]);
  169. return true;
  170. }
  171. }
  172. // search far x
  173. if (startx < endx) {
  174. curStartX = startx;
  175. curStartY = starty;
  176. tmpEndX = endx;
  177. tmpEndY = endy;
  178. } else {
  179. curStartX = endx;
  180. curStartY = endy;
  181. tmpEndX = startx;
  182. tmpEndY = starty;
  183. }
  184. tmpStartX = curStartX;
  185. tmpStartY = curStartY;
  186. for (tmpStartX = tmpStartX - 1; tmpStartX >= 0; tmpStartX--) {
  187. tmp = __map[tmpStartY * __col + tmpStartX];
  188. if (FZ.GameDefs.DREAMPET_REMOVE !== tmp.m_state) {
  189. break;
  190. }
  191. __clearPath();
  192. __destPath.push( [ curStartX, curStartY ]);
  193. __destPath.push( [ tmpStartX, tmpStartY ]);
  194. if (__isInDiagonal(tmpStartX, tmpStartY, tmpEndX, tmpEndY)) {
  195. __destPath.push( [ tmpEndX, tmpEndY ]);
  196. return true;
  197. }
  198. }
  199. // search far y
  200. if (starty < endy) {
  201. curStartX = startx;
  202. curStartY = starty;
  203. tmpEndX = endx;
  204. tmpEndY = endy;
  205. } else {
  206. curStartX = endx;
  207. curStartY = endy;
  208. tmpEndX = startx;
  209. tmpEndY = starty;
  210. }
  211. tmpStartX = curStartX;
  212. tmpStartY = curStartY;
  213. for (tmpStartY = tmpStartY - 1; tmpStartY >= 0; tmpStartY--) {
  214. tmp = __map[tmpStartY * __col + tmpStartX];
  215. if (FZ.GameDefs.DREAMPET_REMOVE !== tmp.m_state) {
  216. break;
  217. }
  218. __clearPath();
  219. __destPath.push( [ curStartX, curStartY ]);
  220. __destPath.push( [ tmpStartX, tmpStartY ]);
  221. if (__isInDiagonal(tmpStartX, tmpStartY, tmpEndX, tmpEndY)) {
  222. __destPath.push( [ tmpEndX, tmpEndY ]);
  223. return true;
  224. }
  225. }
  226. };
  227. // map struct arr [] each elements = { m_state }
  228. FZ.AG = {};
  229. FZ.AG.SearchSpecialPath = {
  230. getPath : function(map, line, col, startx, starty, endx, endy) {
  231. if (undefined === map) {
  232. return null;
  233. }
  234. if (map.length < line * col) {
  235. return null;
  236. }
  237. var result = 0;
  238. __map = map;
  239. __line = line;
  240. __col = col;
  241. __clearPath();
  242. __destPath.push( [ startx, starty ]);
  243. if (__isInSameLineOrCol(startx, starty, endx, endy)) {
  244. __destPath.push( [ endx, endy ]);
  245. return __destPath;
  246. }
  247. __clearPath();
  248. __destPath.push( [ startx, starty ]);
  249. if (__isInDiagonal(startx, starty, endx, endy)) {
  250. __destPath.push( [ endx, endy ]);
  251. return __destPath;
  252. }
  253. __clearPath();
  254. if (__isInTwoDiagonal(startx, starty, endx, endy)) {
  255. return __destPath;
  256. }
  257. return null;
  258. },
  259. drawNum : function(sprite, value, x, y, w){
  260. var n = value;
  261. var num = 0;
  262. if (n === 0) {
  263. sprite.setFrame(0);
  264. sprite.draw(FZ.GameBase.MainContext);
  265. }else{
  266. sprite.resetMatrix();
  267. sprite.makeTranslate(x, y);
  268. for (var i = 0; n !== 0; i++) {
  269. num = Math.floor(n % 10);
  270. sprite.setFrame(num);
  271. sprite.draw(FZ.GameBase.MainContext);
  272. sprite.translate(-w, 0);
  273. n = Math.floor( n/ 10);
  274. }
  275. sprite.setFrame(0);
  276. sprite.makeTranslate(x, y);
  277. }
  278. },
  279. setNumDiv : function(div, value){
  280. var n = value;
  281. var num = 0;
  282. var info = null;
  283. var digital = 0;
  284. var tmpDiv = null;
  285. if (n === 0) {
  286. div[0] = document.createElement("div");
  287. div[0].style.zIndex = 202;
  288. info = FZ.getImgInfo("number_hint_0");
  289. // if (FZ.TargetMobile === FZ.TARGET_DEF.ANDRIOD) {
  290. // info.x += 20;
  291. // }
  292. FZ.GameBase.setCss(div[0], info);
  293. return 1;
  294. }else if( n > 10){
  295. num = Math.floor(n % 10);
  296. tmpDiv = document.createElement("div");
  297. tmpDiv.style.zIndex = 202;
  298. info = FZ.getImgInfo("number_hint_" + num);
  299. // if (FZ.TargetMobile === FZ.TARGET_DEF.ANDRIOD) {
  300. // info.x += 20;
  301. // }
  302. FZ.GameBase.setCss(tmpDiv, info);
  303. div.push(tmpDiv);
  304. num = Math.floor( n/ 10);
  305. tmpDiv = document.createElement("div");
  306. tmpDiv.style.zIndex = 205;
  307. info = FZ.getImgInfo("number_hint_clone_" + num);
  308. // if (FZ.TargetMobile === FZ.TARGET_DEF.ANDRIOD) {
  309. // info.x += 20;
  310. // }
  311. FZ.GameBase.setCss(tmpDiv, info);
  312. div.push(tmpDiv);
  313. return 2;
  314. }else{
  315. num = Math.floor(n % 10);
  316. tmpDiv = document.createElement("div");
  317. tmpDiv.style.zIndex = 202;
  318. info = FZ.getImgInfo("number_hint_" + num);
  319. // if (FZ.TargetMobile === FZ.TARGET_DEF.ANDRIOD) {
  320. // info.x += 20;
  321. // }
  322. FZ.GameBase.setCss(tmpDiv, info);
  323. div.push(tmpDiv);
  324. num = Math.floor( n/ 10);
  325. tmpDiv = document.createElement("div");
  326. tmpDiv.style.zIndex = 205;
  327. info = FZ.getImgInfo("number_hint_clone_" + num);
  328. // if (FZ.TargetMobile === FZ.TARGET_DEF.ANDRIOD) {
  329. // info.x += 20;
  330. // }
  331. FZ.GameBase.setCss(tmpDiv, info);
  332. tmpDiv.style.visibility = "hidden";
  333. div.push(tmpDiv);
  334. return 2;
  335. }
  336. },
  337. setScoreNum : function(value){
  338. var n = value;
  339. var num = 0;
  340. var splitNum = [];
  341. while(n > 0){
  342. num = Math.floor(n % 10);
  343. splitNum.push(num);
  344. n = Math.floor( n/ 10);
  345. }
  346. return splitNum;
  347. },
  348. getPolygonVertex : function(x, y, radius, number) {
  349. if(number < 3){
  350. return null;
  351. }
  352. var vertex = [];
  353. var angle = 0;
  354. var addAngle = (2 * Math.PI) / number;
  355. for(var index = 0; index < number; index++) {
  356. var dot = [];
  357. dot.push(x + Math.floor(radius * Math.sin(angle)));
  358. dot.push(y + Math.floor(radius * Math.cos(angle)));
  359. angle += addAngle;
  360. vertex.push(dot);
  361. }
  362. return vertex;
  363. }
  364. };
  365. })();