Snake.cs
上传用户:yiyuerguo
上传日期:2014-09-27
资源大小:3781k
文件大小:6k
源码类别:

C#编程

开发平台:

Others

  1. using System;
  2. using System.Drawing;
  3. using System.Collections;
  4. namespace WindowsApplication9
  5. {
  6. /// <summary>
  7. /// Snake 的摘要说明。蛇类。
  8. /// </summary>
  9. public delegate void SnakeDele();
  10. public class Snake
  11. {
  12. public Snake()
  13. {
  14. //
  15. // TODO: 在此处添加构造函数逻辑
  16. //
  17. }
  18. //参数vertex是顶点,用于开始时蛇出现的位置,count表示开始时蛇是由多少块构成的
  19. public Snake(Point vertex, int count)
  20. {
  21. Block newB;
  22. Point p = new Point(vertex.X + 25, vertex.Y + 25);
  23. blockList = new ArrayList(count);
  24. for (int i = 0; i < count; i ++)
  25. {
  26. p.X = p.X + 5;
  27. newB = new Block();
  28. newB.Number = i + 1;
  29. newB.Origin = p;
  30. blockList.Add(newB);
  31. //如果是蛇头就把顶点赋给headPoint
  32. if (i == count -1)
  33. {
  34. headPoint = newB.Origin;
  35. }
  36. }
  37. headNumber = count;
  38. }
  39. //蛇死亡事件
  40. public event SnakeDele snakeDie;
  41. public void SnakeDie()
  42. {
  43. if (snakeDie != null)
  44. snakeDie();
  45. }
  46. //数组列表,用来保存块。
  47. ArrayList blockList = new ArrayList();
  48. //为蛇头的编号,也是蛇的长度
  49. private int headNumber;
  50. public int HeadNumber
  51. {
  52. get { return headNumber; }
  53. set { headNumber = value; }
  54. }
  55. //蛇头的位置,用于判断蛇是否吃了豆或是撞墙了
  56. private Point headPoint;
  57. public Point getHeadPoint
  58. {
  59. get { return headPoint; }
  60. /*get 
  61. {
  62. IEnumerator myEnumerator = blockList.GetEnumerator();
  63. try
  64. {
  65. while ( myEnumerator.MoveNext() )
  66. {
  67. Block b = (Block)myEnumerator.Current;
  68. if (b.Number == headNumber)
  69. {
  70. return b.Origin;
  71. }
  72. }
  73. }
  74. catch(Exception e)
  75. {
  76. System.Console.WriteLine(e.ToString());
  77. }
  78. return new Point(0, 0);//理论上这条语句是不会执行的。
  79. }*/
  80. }
  81. //蛇是否撞到自已身上了
  82. public bool getHitSelf
  83. {
  84. get 
  85. {
  86. IEnumerator myEnumerator = blockList.GetEnumerator();
  87. try
  88. {
  89. while ( myEnumerator.MoveNext() )
  90. {
  91. Block b = (Block)myEnumerator.Current;
  92. if (b.Number != headNumber && b.Origin.Equals(headPoint))
  93. {
  94. return true;
  95. }
  96. }
  97. }
  98. catch(Exception e)
  99. {
  100. System.Console.WriteLine(e.ToString());
  101. }
  102. return false;
  103. }
  104. }
  105. //蛇的得分
  106. private int score;
  107. public int Score
  108. {
  109. get { return score; }
  110. set { score = value; }
  111. }
  112. //当前运动的方向 0为向上,1为向右,2为向下,3为向左
  113. private int direction = 1;//默认是向右
  114. public int Direction
  115. {
  116. get { return direction; }
  117. set { direction = value; }
  118. }
  119. //转方向参数pDirection有两个值,0 表示向右转(即顺时针方向)1表示向左转(即逆时针方向)
  120. public void TurnDirection(int pDirection)
  121. {
  122. switch(direction)
  123. {
  124. case 0:
  125. if (pDirection == 0)
  126. direction = 1;
  127. else if (pDirection == 1)
  128. direction = 3;
  129. break;
  130. case 1:
  131. if (pDirection == 0)
  132. direction = 2;
  133. else if (pDirection == 1)
  134. direction = 0;
  135. break;
  136. case 2:
  137. if (pDirection == 0)
  138. direction = 3;
  139. else if (pDirection == 1)
  140. direction = 1;
  141. break;
  142. case 3:
  143. if (pDirection == 0)
  144. direction = 0;
  145. else if (pDirection == 1)
  146. direction = 2;
  147. break;
  148. }
  149. }
  150. //生长
  151. public void Growth()
  152. {
  153. Block newB = new Block();
  154. IEnumerator myEnumerator = blockList.GetEnumerator();
  155. try
  156. {
  157. while ( myEnumerator.MoveNext() )
  158. {
  159. Block b = (Block)myEnumerator.Current;
  160. if (b.Number == headNumber)
  161. {
  162. int x = b.Origin.X;
  163. int y = b.Origin.Y;
  164. switch(direction)
  165. {
  166. case 0:
  167. y = y - 5;
  168. break;
  169. case 1:
  170. x = x + 5;
  171. break;
  172. case 2:
  173. y = y + 5;
  174. break;
  175. case 3:
  176. x = x - 5;
  177. break;
  178. }
  179. Point headP = new Point(x, y);
  180. newB.Origin = headP;
  181. newB.Number = b.Number + 1;
  182. headNumber ++;
  183. headPoint = headP;
  184. blockList.Add(newB);
  185. }
  186. }
  187. }
  188. catch(Exception e)
  189. {
  190. System.Console.WriteLine(e.ToString());
  191. }
  192. }
  193. //绘制自身
  194. public void Display(Graphics g)
  195. {
  196. try
  197. {
  198. Block newB = new Block();
  199. IEnumerator myEnumerator = blockList.GetEnumerator();
  200. while ( myEnumerator.MoveNext() )
  201. {
  202. Block b = (Block)myEnumerator.Current;
  203. b.Number--;
  204. if (b.Number < 1)
  205. {
  206. blockList.Remove(b);
  207. b.UnDisplay(g);
  208. continue;
  209. }
  210. if (b.Number == (headNumber - 1))
  211. {
  212. newB = new Block();
  213. int x = b.Origin.X;
  214. int y = b.Origin.Y;
  215. switch(direction)
  216. {
  217. case 0:
  218. y = y - 5;
  219. break;
  220. case 1:
  221. x = x + 5;
  222. break;
  223. case 2:
  224. y = y + 5;
  225. break;
  226. case 3:
  227. x = x - 5;
  228. break;
  229. }
  230. Point headP = new Point(x, y);
  231. newB.Origin = headP;
  232. newB.Number = headNumber;
  233. newB.Display(g);
  234. headPoint = newB.Origin;//重新指定蛇头的点
  235. }
  236. b.Display(g);
  237. }
  238. blockList.Add(newB);
  239. }
  240. catch (Exception e)
  241. {
  242. System.Console.WriteLine(e.ToString());
  243. }
  244. }
  245. //消除自身
  246. public void UnDisplay(Graphics g)
  247. {
  248. try
  249. {
  250. Block newB = new Block();
  251. IEnumerator myEnumerator = blockList.GetEnumerator();
  252. while ( myEnumerator.MoveNext() )
  253. {
  254. Block b = (Block)myEnumerator.Current;
  255. b.UnDisplay(g);
  256. }
  257. }
  258. catch(Exception e)
  259. {
  260. System.Console.WriteLine(e.ToString());
  261. }
  262. }
  263. //重设蛇的位置,以重新开始游戏
  264. public void Reset(Point vertex, int count)
  265. {
  266. Block newB;
  267. Point p = new Point(vertex.X + 25, vertex.Y + 25);
  268. blockList = new ArrayList(count);
  269. for (int i = 0; i < count; i ++)
  270. {
  271. p.X = p.X + 5;
  272. newB = new Block();
  273. newB.Number = i + 1;
  274. newB.Origin = p;
  275. blockList.Add(newB);
  276. //如果是蛇头就把顶点赋给headPoint
  277. if (i == count -1)
  278. {
  279. headPoint = newB.Origin;
  280. }
  281. }
  282. headNumber = count;
  283. //方向
  284. direction = 1;
  285. }
  286. }
  287. }