FighterInfo.cpp
上传用户:baina_li
上传日期:2013-03-23
资源大小:960k
文件大小:7k
源码类别:

射击游戏

开发平台:

Visual C++

  1. // FighterInfo.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "Fighter.h"
  5. #include "FighterInfo.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CFighterInfo
  13. CFighterInfo::CFighterInfo()
  14. {
  15. }
  16. CFighterInfo::~CFighterInfo()
  17. {
  18. }
  19. /////////////////////////////////////////////////////////////////////////////
  20. // CFighterInfo message handlers
  21. void CFighterInfo::SetHeadPos(CPoint ptPos)
  22. {
  23. m_ptHeadPos = ptPos;
  24. }
  25. BOOL CFighterInfo::SetFighterPosition(int nDir)
  26. {
  27. switch(nDir){
  28. case 0:
  29. m_ptPos[0] = m_ptHeadPos;
  30. m_ptPos[1] = CPoint(m_ptHeadPos.x-1, m_ptHeadPos.y-2);
  31. m_ptPos[2] = CPoint(m_ptHeadPos.x-1, m_ptHeadPos.y-1);
  32. m_ptPos[3] = CPoint(m_ptHeadPos.x-1, m_ptHeadPos.y  );
  33. m_ptPos[4] = CPoint(m_ptHeadPos.x-1, m_ptHeadPos.y+1);
  34. m_ptPos[5] = CPoint(m_ptHeadPos.x-1, m_ptHeadPos.y+2);
  35. m_ptPos[6] = CPoint(m_ptHeadPos.x-2, m_ptHeadPos.y  );
  36. m_ptPos[7] = CPoint(m_ptHeadPos.x-3, m_ptHeadPos.y-1);
  37. m_ptPos[8] = CPoint(m_ptHeadPos.x-3, m_ptHeadPos.y  );
  38. m_ptPos[9] = CPoint(m_ptHeadPos.x-3, m_ptHeadPos.y+1);
  39. break;
  40. case 1:
  41. m_ptPos[0] = m_ptHeadPos;
  42. m_ptPos[1] = CPoint(m_ptHeadPos.x+2, m_ptHeadPos.y-1);
  43. m_ptPos[2] = CPoint(m_ptHeadPos.x+1, m_ptHeadPos.y-1);
  44. m_ptPos[3] = CPoint(m_ptHeadPos.x  , m_ptHeadPos.y-1);
  45. m_ptPos[4] = CPoint(m_ptHeadPos.x-1, m_ptHeadPos.y-1);
  46. m_ptPos[5] = CPoint(m_ptHeadPos.x-2, m_ptHeadPos.y-1);
  47. m_ptPos[6] = CPoint(m_ptHeadPos.x  , m_ptHeadPos.y-2);
  48. m_ptPos[7] = CPoint(m_ptHeadPos.x+1, m_ptHeadPos.y-3);
  49. m_ptPos[8] = CPoint(m_ptHeadPos.x  , m_ptHeadPos.y-3);
  50. m_ptPos[9] = CPoint(m_ptHeadPos.x-1, m_ptHeadPos.y-3);
  51. break;
  52. case 2:
  53. m_ptPos[0] = m_ptHeadPos;
  54. m_ptPos[1] = CPoint(m_ptHeadPos.x+1, m_ptHeadPos.y+2);
  55. m_ptPos[2] = CPoint(m_ptHeadPos.x+1, m_ptHeadPos.y+1);
  56. m_ptPos[3] = CPoint(m_ptHeadPos.x+1, m_ptHeadPos.y  );
  57. m_ptPos[4] = CPoint(m_ptHeadPos.x+1, m_ptHeadPos.y-1);
  58. m_ptPos[5] = CPoint(m_ptHeadPos.x+1, m_ptHeadPos.y-2);
  59. m_ptPos[6] = CPoint(m_ptHeadPos.x+2, m_ptHeadPos.y  );
  60. m_ptPos[7] = CPoint(m_ptHeadPos.x+3, m_ptHeadPos.y+1);
  61. m_ptPos[8] = CPoint(m_ptHeadPos.x+3, m_ptHeadPos.y  );
  62. m_ptPos[9] = CPoint(m_ptHeadPos.x+3, m_ptHeadPos.y-1);
  63. break;
  64. case 3:
  65. m_ptPos[0] = m_ptHeadPos;
  66. m_ptPos[1] = CPoint(m_ptHeadPos.x-2, m_ptHeadPos.y+1);
  67. m_ptPos[2] = CPoint(m_ptHeadPos.x-1, m_ptHeadPos.y+1);
  68. m_ptPos[3] = CPoint(m_ptHeadPos.x  , m_ptHeadPos.y+1);
  69. m_ptPos[4] = CPoint(m_ptHeadPos.x+1, m_ptHeadPos.y+1);
  70. m_ptPos[5] = CPoint(m_ptHeadPos.x+2, m_ptHeadPos.y+1);
  71. m_ptPos[6] = CPoint(m_ptHeadPos.x  , m_ptHeadPos.y+2);
  72. m_ptPos[7] = CPoint(m_ptHeadPos.x-1, m_ptHeadPos.y+3);
  73. m_ptPos[8] = CPoint(m_ptHeadPos.x  , m_ptHeadPos.y+3);
  74. m_ptPos[9] = CPoint(m_ptHeadPos.x+1, m_ptHeadPos.y+3);
  75. break;
  76. default:
  77. break;
  78. }
  79. for(int i=0; i<10; i++)
  80. if(m_ptPos[i].x<0 || m_ptPos[i].y<0 || m_ptPos[i].x>9 || m_ptPos[i].y>9)
  81. return FALSE;
  82. return TRUE;
  83. }
  84. //////////////////////////////////////////////////////
  85. //检查m_nSky[10][10]中的布局是否正确
  86. //
  87. //
  88. ///////////////////////////////////////////////////////
  89. BOOL CFighterInfo::IsFighterValid()
  90. {
  91. for(int i=0; i<10; i++){
  92. if(m_ptPos[i].x<0 || m_ptPos[i].x>9) return FALSE;
  93. if(m_ptPos[i].y<0 || m_ptPos[i].y>9) return FALSE;
  94. if(m_nSky[m_ptPos[i].x][m_ptPos[i].y] == 1) return FALSE;
  95. if(m_nSky[m_ptPos[i].x][m_ptPos[i].y] == 2) return FALSE;
  96. }
  97. return TRUE;
  98. }
  99. BOOL CFighterInfo::IsSkyValid()
  100. {
  101. int i=0, j=0, k=0, l=0;
  102. int nSky[10][10];
  103. CPoint ptHead[3];
  104. int nHead=0;
  105. for(i=0; i<10; i++)
  106. for(j=0; j<10; j++)
  107. {
  108. if(m_nSky[i][j] == 2)
  109. ptHead[nHead++] = CPoint(i, j);
  110. nSky[i][j] = 0;
  111. }
  112. if(nHead!=3)
  113. return FALSE;
  114. int nTotal=0;
  115. for(i=0; i<10; i++)
  116. for(j=0; j<10; j++)
  117. nTotal += m_nSky[i][j];
  118. if(nTotal!=33)
  119. return FALSE;
  120. int nx=0, ny=0;
  121. char buf[256];
  122. CPoint ptPos2[10];//第二层的循环的m_ptPos[10]需要保留,若第三层检验不成功要减去
  123. BOOL bInterrupted = FALSE;
  124. for(i=0; i<4; i++)//第一层循环
  125. {
  126. for(nx=0; nx<10; nx++)
  127. for(ny=0; ny<10; ny++)
  128. nSky[nx][ny]=0;
  129. SetHeadPos(ptHead[0]);
  130. if(!SetFighterPosition(i))
  131. continue;
  132. int temp = ptHead[0].x;
  133. temp = ptHead[0].y;
  134. for(l=0; l<10; l++)
  135. nSky[m_ptPos[l].x][m_ptPos[l].y] += 1;
  136. sprintf(buf, "i=%drn", i);
  137. //PrintSky(nSky, buf);
  138. for(j=0; j<4; j++)//第二层循环
  139. {
  140. SetHeadPos(ptHead[1]);
  141. if(!SetFighterPosition(j))
  142. continue;
  143. for(l=0; l<10; l++)
  144. {
  145. nSky[m_ptPos[l].x][m_ptPos[l].y] += 1;
  146. ptPos2[l] = m_ptPos[l];//保留第二层的m_ptPos
  147. }
  148. sprintf(buf, "i=%d    j=%drn", i, j);
  149. //PrintSky(nSky, buf);
  150. bInterrupted = FALSE;
  151. for(nx=0; nx<10; nx++)
  152. {
  153. for(ny=0; ny<10; ny++)
  154. if(nSky[nx][ny]==2) //如果为2,说明飞机有重叠,重新第二层循环
  155. {
  156. for(l=0; l<10; l++)
  157. nSky[ptPos2[l].x][ptPos2[l].y] -= 1;
  158. bInterrupted = TRUE;
  159. break;
  160. }
  161. if(bInterrupted)
  162. break;
  163. }
  164. if(bInterrupted)
  165. continue;
  166. for(k=0; k<4; k++)//第三层循环
  167. {
  168. SetHeadPos(ptHead[2]);
  169. if(!SetFighterPosition(k))
  170. continue;
  171. for(l=0; l<10; l++)
  172. nSky[m_ptPos[l].x][m_ptPos[l].y] += 1;
  173. sprintf(buf, "(before check)i=%d    j=%d    k=%drn", i, j, k);
  174. //PrintSky(nSky, buf);
  175. bInterrupted = FALSE;
  176. for(nx=0; nx<10; nx++)
  177. {
  178. for(ny=0; ny<10; ny++)
  179. if(nSky[nx][ny]==2) //如果为2,说明飞机有重叠,重新第三层循环
  180. {
  181. for(l=0; l<10; l++)
  182. nSky[m_ptPos[l].x][m_ptPos[l].y] -= 1;
  183. bInterrupted = TRUE;
  184. break;
  185. }
  186. if(bInterrupted)
  187. break;
  188. }
  189. if(bInterrupted)
  190. continue;
  191. sprintf(buf, "(通过测试)i=%d    j=%d    k=%drn", i, j, k);
  192. //PrintSky(nSky, buf);
  193. BOOL bMatched = TRUE;
  194. for(int nRow=0; nRow<10; nRow++)
  195. {
  196. for(int nColumn=0; nColumn<10; nColumn++)
  197. {
  198. if((m_nSky[nRow][nColumn]!=2)
  199. &&(nSky[nRow][nColumn] != m_nSky[nRow][nColumn]))
  200. {
  201. bMatched = FALSE;
  202. break;
  203. }
  204. }
  205. if(!bMatched)
  206. break;
  207. }
  208. if(bMatched)
  209. return TRUE;
  210. for(l=0; l<10; l++)
  211. nSky[m_ptPos[l].x][m_ptPos[l].y] -= 1;
  212. }
  213. for(l=0; l<10; l++)
  214. nSky[ptPos2[l].x][ptPos2[l].y] -= 1;
  215. }
  216. }
  217. sprintf(buf, "leave:  i=%d    j=%d    k=%drn", i, j, k);
  218. //PrintSky(m_nSky, buf);
  219. return FALSE;
  220. }
  221. void CFighterInfo::SetItInSky()
  222. {
  223. m_nSky[m_ptPos[0].x][m_ptPos[0].y] = 2;
  224. for(int i=1; i<10; i++){
  225. m_nSky[m_ptPos[i].x][m_ptPos[i].y] = 1;
  226. }
  227. }
  228. CPoint CFighterInfo::GetHeadPos()
  229. {
  230. return m_ptHeadPos;
  231. }
  232. void CFighterInfo::PrintSky(int nSky[10][10], LPCTSTR buf)
  233. {
  234. CStdioFile file;
  235. if(!file.Open("g:\sky.txt", CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite))
  236. {
  237. AfxMessageBox("open sky.txt fail");
  238. return ;
  239. }
  240. CString info;
  241. int temp;
  242. file.Seek(0, CFile::end);
  243. file.WriteString(buf);
  244. for(int j=0; j<10; j++)
  245. {
  246. for(int i=0; i<10; i++)
  247. {
  248. temp = nSky[i][j];
  249. info.Format("%d ", nSky[i][j]);
  250. file.WriteString(info);
  251. }
  252. file.WriteString("rn");
  253. }
  254. file.Close();
  255. }