snake.cpp
上传用户:hbrsgg1
上传日期:2014-05-08
资源大小:2826k
文件大小:8k
源码类别:

其他智力游戏

开发平台:

C/C++

  1. /*++
  2. Copyright (c) 2004-2005  AFE(Active-Free-Elegance)
  3. Module Name:
  4.     snake.cpp
  5. Abstract:
  6.     the class of Snake,including the basic-method 
  7. such as : move,born,and eat,and so on.
  8. Author:
  9.     Weijian Luo (Arthur Luo)   15-Jun-2005
  10. E-mail: skybluehacker@yahoo.com.cn
  11. Revision History:      1.0
  12. --*/
  13. #include "snake.h"
  14. CSnake::CSnake(int x_pos,int y_pos,int len)
  15. {
  16. if(len<1) len=1;
  17. int i;
  18. m_length=len;  //蛇的身体体长
  19. //初始化蛇的坐标位置
  20. m_pPos=new SPoint[m_length+2];
  21. m_pPos[0].x=x_pos;m_pPos[0].y=y_pos;
  22. for(i=1;i<m_length+2;i++)
  23. {
  24. m_pPos[i].x=0;m_pPos[i].y=0;
  25. }
  26. //初始化蛇的运动状态
  27. m_newSnake.head=S_NONE;
  28. m_oldSnake.head=S_NONE;
  29. m_newSnake.body=new MoveState[m_length];
  30. m_oldSnake.body=new MoveState[m_length];
  31. for(i=0;i<m_length;i++)
  32. {
  33. m_newSnake.body[i]=S_NONE;
  34. m_newSnake.body[i]=S_NONE;
  35. }
  36. m_newSnake.tail=S_NONE;
  37. m_oldSnake.tail=S_NONE;
  38. //初始化蛇的位图显示状态
  39. m_pStateArray=new BitmapState[m_length+2];
  40. for(i=0;i<m_length+2;i++)
  41. m_pStateArray[i]=M_NONE;
  42. }
  43. CSnake::~CSnake()
  44. {
  45. SAFE_DELETE_ARRAY(m_pStateArray);
  46. SAFE_DELETE_ARRAY(m_pPos);
  47. }
  48. //
  49. //根据新旧两个身体的运动趋势情况,返回当前应当显示的身体状态
  50. //
  51. BitmapState CSnake::GetRightState(MoveState oldDirect,MoveState newDirect)
  52. {
  53. BitmapState res;
  54. switch(oldDirect)
  55. {
  56. case S_NONE:
  57. switch(newDirect)
  58. {
  59. case S_NONE:
  60. res=M_NONE;
  61. break;
  62. case S_UP:
  63. res=M_UP_UP;
  64. break;
  65. case S_DOWN:
  66. res=M_DOWN_DOWN;
  67. break;
  68. case S_LEFT:
  69. res=M_LEFT_LEFT;
  70. break;
  71. case S_RIGHT:
  72. res=M_RIGHT_RIGHT;
  73. break;
  74. }
  75. break;
  76. case S_UP:
  77. switch(newDirect)
  78. {
  79. case S_UP:
  80. res=M_UP_UP;
  81. break;
  82. case S_LEFT:
  83. res=M_UP_LEFT;
  84. break;
  85. case S_RIGHT:
  86. res=M_UP_RIGHT;
  87. break;
  88. }
  89. break;
  90. case S_DOWN:
  91. switch(newDirect)
  92. {
  93. case S_DOWN:
  94. res=M_DOWN_DOWN;
  95. break;
  96. case S_LEFT:
  97. res=M_DOWN_LEFT;
  98. break;
  99. case S_RIGHT:
  100. res=M_DOWN_RIGHT;
  101. break;
  102. }
  103. break;
  104. case S_LEFT:
  105. switch(newDirect)
  106. {
  107. case S_LEFT:
  108. res=M_LEFT_LEFT;
  109. break;
  110. case S_UP:
  111. res=M_LEFT_UP;
  112. break;
  113. case S_DOWN:
  114. res=M_LEFT_DOWN;
  115. break;
  116. }
  117. break;
  118. case S_RIGHT:
  119. switch(newDirect)
  120. {
  121. case S_RIGHT:
  122. res=M_RIGHT_RIGHT;
  123. break;
  124. case S_UP:
  125. res=M_RIGHT_UP;
  126. break;
  127. case S_DOWN:
  128. res=M_RIGHT_DOWN;
  129. break;
  130. }
  131. break;
  132. }
  133. return res;
  134. }
  135. //
  136. //改变方向
  137. //
  138. void CSnake::ChangeDirect(MoveState d)
  139. {
  140.   //  改变方向的条件:非对立方向
  141.   //  只能为其左,前,右方
  142. switch(d)
  143. {
  144. case S_NONE:
  145. m_newSnake.head=d;
  146. break;
  147. case S_UP:
  148. if(m_newSnake.head!=S_DOWN) m_newSnake.head=d;
  149. break;
  150. case S_DOWN:
  151. if(m_newSnake.head!=S_UP) m_newSnake.head=d;
  152. break;
  153. case S_LEFT:
  154. if(m_newSnake.head!=S_RIGHT) m_newSnake.head=d;
  155. break;
  156. case S_RIGHT:
  157. if(m_newSnake.head!=S_LEFT) m_newSnake.head=d;
  158. break;
  159. }
  160. }
  161. //
  162. //蛇移动
  163. //
  164. void CSnake::Move(void)
  165. {
  166. int i;
  167. //1.计算新状态各个节点的状态
  168. //保存蛇身体各个部位的形状
  169. for(i=0;i<m_length;i++)
  170. {
  171. m_oldSnake.body[i]=m_newSnake.body[i];
  172. }
  173. //将蛇身体的状态根据前面的状态变动一次
  174. m_newSnake.tail=m_newSnake.body[m_length-1];
  175. for(i=m_length-1;i>0;i--)
  176. {
  177. m_newSnake.body[i]=m_newSnake.body[i-1];
  178. }
  179. m_newSnake.body[0]=m_newSnake.head;
  180. //根据新旧状态特性取正确的状态
  181. m_pStateArray[0]=GetRightState(m_oldSnake.head,m_newSnake.head);
  182. for(i=0;i<m_length;i++)
  183. m_pStateArray[i+1]=GetRightState(m_oldSnake.body[i],m_newSnake.body[i]);
  184. m_pStateArray[m_length+1]=GetRightState(m_oldSnake.tail,m_newSnake.tail);
  185. //2.将整个蛇的坐标移动
  186. //除蛇头外,其他部分的新位置为其前一部分的原来位置
  187. for(i=m_length+1;i>0;i--)
  188. m_pPos[i]=m_pPos[i-1];
  189. //蛇头的新位置根据蛇的运动方向判断做相应偏移
  190. switch(m_newSnake.head)
  191. {
  192. case S_UP:
  193. m_pPos[0].y-=SNAKE_MOVE;
  194. break;
  195. case S_DOWN:
  196. m_pPos[0].y+=SNAKE_MOVE;
  197. break;
  198. case S_LEFT:
  199. m_pPos[0].x-=SNAKE_MOVE;
  200. break;
  201. case S_RIGHT:
  202. m_pPos[0].x+=SNAKE_MOVE;
  203. break;
  204. }
  205. }
  206. //
  207. //蛇的身体增长
  208. //
  209. void CSnake::AddBody(int n)
  210. {
  211. //  分配临时的"save类型"变量,用作保留
  212. //  蛇的各种数据状态
  213. int i;
  214. Snake_Struct saveOldSnake,saveNewSnake;
  215. BitmapState *savestateArray;
  216. SPoint *savePos;
  217. //保存蛇的位置信息 
  218. // pos
  219. savePos=new SPoint[m_length+2];
  220. for(i=0;i<m_length+2;i++)
  221. savePos[i]=m_pPos[i];
  222. //保存蛇的状态信息
  223. //  1.oldSnake
  224. //  2.newSnake
  225. //  3.stateArray
  226. //1
  227. saveOldSnake.head=m_oldSnake.head;
  228. saveOldSnake.body=new MoveState[m_length];
  229. for(i=0;i<m_length;i++)
  230. saveOldSnake.body[i]=m_oldSnake.body[i];
  231. saveOldSnake.tail=m_oldSnake.tail;
  232. //2
  233. saveNewSnake.head=m_newSnake.head;
  234. saveNewSnake.body=new MoveState[m_length];
  235. for(i=0;i<m_length;i++)
  236. saveNewSnake.body[i]=m_newSnake.body[i];
  237. saveNewSnake.tail=m_newSnake.tail;
  238. //3
  239. savestateArray=new BitmapState[m_length+2];
  240. for(i=0;i<m_length+2;i++)
  241. savestateArray[i]=m_pStateArray[i];
  242. //将长度增长
  243. m_length+=n;
  244. //释放所有蛇的身体存储数据空间
  245. delete[] m_oldSnake.body;m_oldSnake.body=NULL;
  246. delete[] m_newSnake.body;m_newSnake.body=NULL;
  247. delete[] m_pStateArray;m_pStateArray=NULL;
  248. delete[] m_pPos;m_pPos=NULL;
  249. //创建并初始化增长后的蛇的存储数据空间
  250. m_newSnake.head=S_NONE;
  251. m_oldSnake.head=S_NONE;
  252. m_newSnake.body=new MoveState[m_length];
  253. m_oldSnake.body=new MoveState[m_length];
  254. for(i=0;i<m_length;i++)
  255. {
  256. m_newSnake.body[i]=S_NONE;
  257. m_newSnake.body[i]=S_NONE;
  258. }
  259. m_newSnake.tail=S_NONE;
  260. m_oldSnake.tail=S_NONE;
  261. m_pStateArray=new BitmapState[m_length+2];
  262. for(i=0;i<m_length+2;i++)
  263. m_pStateArray[i]=M_NONE;
  264. m_pPos=new SPoint[m_length+2];
  265. for(i=0;i<m_length+2;i++)
  266. {
  267. m_pPos[i].x=0;
  268. m_pPos[i].y=0;
  269. }
  270. //恢复原来长度的数据(新的用初始化的数据)
  271. //a. newSnake ,oldSnake状态
  272. //b. stateArray
  273. //c. pos
  274. //a
  275. m_newSnake.head=saveNewSnake.head;
  276. m_oldSnake.head=saveOldSnake.head;
  277. for(i=0;i<m_length-n;i++)
  278. {
  279. m_newSnake.body[i]=saveNewSnake.body[i];
  280. m_oldSnake.body[i]=saveOldSnake.body[i];
  281. }
  282. m_newSnake.tail=saveNewSnake.tail;
  283. m_oldSnake.tail=saveOldSnake.tail;
  284. //b
  285. for(i=0;i<m_length-n+2;i++)
  286. m_pStateArray[i]=savestateArray[i];
  287. //c
  288. for(i=0;i<m_length-n+2;i++)
  289. m_pPos[i]=savePos[i];
  290. }
  291. //
  292. //设置蛇头的坐标
  293. //
  294. void CSnake::SetHeadPos(int x,int y)
  295. {
  296. m_pPos[0].x=x;m_pPos[0].y=y;
  297. }
  298. //
  299. //取蛇的状态标识数组
  300. //
  301. BitmapState* CSnake::GetStateArray(void)
  302. {
  303. return m_pStateArray;
  304. }
  305. //
  306. //取蛇的位置数组
  307. //
  308. SPoint* CSnake::GetPos(void)
  309. {
  310. return m_pPos;
  311. }
  312. //
  313. //取蛇身的长度
  314. //
  315. int CSnake::GetLength(void)
  316. {
  317. return m_length+2;
  318. }
  319. //
  320. //检测蛇头是否触碰到其身体
  321. //
  322. bool CSnake::IsHeadTouchBody(int x,int y)
  323. {
  324. int i;
  325. for(i=1;i<m_length+2;i++)
  326. if(m_pPos[i].x==x&&m_pPos[i].y==y) return true;
  327. return false;
  328. }
  329. //
  330. //初始化 用作游戏结束后重新开始
  331. //
  332. void CSnake::Initial(void )
  333. {
  334. //释放以前的所有存储空间
  335. SAFE_DELETE_ARRAY(m_pStateArray);
  336. SAFE_DELETE_ARRAY(m_pPos);
  337. //创建蛇身长度为1的蛇,并做各种初始化
  338. int i;
  339. int x = 0;
  340. int y = 0;
  341. //初始化蛇的坐标位置
  342. m_length=1;
  343. m_pPos=new SPoint[m_length+2];
  344. m_pPos[0].x=x;m_pPos[0].y=y;
  345. for(i=1;i<m_length+2;i++)
  346. {
  347. m_pPos[i].x=0;m_pPos[i].y=0;
  348. }
  349. //初始化蛇的运动状态
  350. m_newSnake.head=S_NONE;
  351. m_oldSnake.head=S_NONE;
  352. m_newSnake.body=new MoveState[m_length];
  353. m_oldSnake.body=new MoveState[m_length];
  354. for(i=0;i<m_length;i++)
  355. {
  356. m_newSnake.body[i]=S_NONE;
  357. m_newSnake.body[i]=S_NONE;
  358. }
  359. m_newSnake.tail=S_NONE;
  360. m_oldSnake.tail=S_NONE;
  361. //初始化蛇的位图显示状态
  362. m_pStateArray=new BitmapState[m_length+2];
  363. for(i=0;i<m_length+2;i++)
  364. m_pStateArray[i]=M_NONE;
  365. }