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

C#编程

开发平台:

Others

  1. using System;
  2. using System.Drawing;
  3. using System.Collections;
  4. namespace Tetris_CS
  5. {
  6. /// <summary>
  7. /// Body 的摘要说明。
  8. /// </summary>
  9. public class Body
  10. {
  11. //建立body区域的长宽 初始化参数得
  12. public Body()
  13. {
  14. maxWidth = 10;
  15. maxHeight = 15;
  16. }
  17. public enum MOVE_TYPE {MOVE_LEFT=0, MOVE_RIGHT=1, MOVE_DOWN=2, MOVE_FALL=3, MOVE_ROATE=4};
  18. private ArrayList blockList = new ArrayList();
  19. private Shape nextShape;
  20. private int maxWidth;
  21. private int maxHeight;
  22. public bool SetNextShape(Shape s)
  23. {
  24. nextShape = s;
  25. nextShape.Position = new Point(4, 0);
  26. bool ret = false;
  27. //*
  28. while (!ShapeCanPlace(nextShape))
  29. {
  30. Point pt = nextShape.Position;
  31. pt.Y--;
  32. nextShape.Position = pt;
  33. ret = true;
  34. }
  35. //*/
  36. return ret;
  37. }
  38. public void Draw(Graphics g)
  39. {
  40. DrawNextShape(g);
  41. for (int i=0; i<blockList.Count; i++)
  42. {
  43. ((Block)(blockList[i])).Draw(g);
  44. }
  45. }
  46. public bool MoveShape(Graphics g, MOVE_TYPE m)
  47. {
  48. Shape s = new Shape(nextShape.IndexDef);
  49. s.Copy(nextShape);
  50. Point pt = s.Position;
  51. switch (m)
  52. {
  53. case MOVE_TYPE.MOVE_FALL:
  54. {
  55. while (ShapeCanPlace(s))
  56. {
  57. pt.Y++;
  58. s.Position = pt;
  59. }
  60. nextShape.Draw(g, true);
  61. pt.Y--;
  62. s.Position = pt;
  63. nextShape.Copy(s);
  64. nextShape.Draw(g);
  65. PlaceShape();
  66. return true;
  67. //break;
  68. }
  69. case MOVE_TYPE.MOVE_DOWN:
  70. pt.Y++;
  71. break;
  72. case MOVE_TYPE.MOVE_LEFT:
  73. pt.X--;
  74. break;
  75. case MOVE_TYPE.MOVE_RIGHT:
  76. pt.X++;
  77. break;
  78. case MOVE_TYPE.MOVE_ROATE:
  79. s.Roate();
  80. break;
  81. default:
  82. break;
  83. }
  84. s.Position = pt;
  85. if (ShapeCanPlace(s))
  86. {
  87. nextShape.Draw(g, true);
  88. nextShape.Copy(s);
  89. nextShape.Draw(g);
  90. }
  91. else
  92. {
  93. if (m == MOVE_TYPE.MOVE_DOWN)
  94. {
  95. PlaceShape();
  96. return true;
  97. }
  98. }
  99. return false;
  100. }
  101. //判断位置是否到底
  102. public bool ShapeCanPlace(Shape s)
  103. {
  104. for (int i=0; i<4; i++)
  105. {
  106. Point pt = s.Position;
  107. Point ptOff = s.GetBlock(i).Position;
  108. pt.Offset(ptOff.X, ptOff.Y);
  109. if (PositionHasBlock(pt))
  110. return false;
  111. }
  112. return true;
  113. }
  114. public bool PositionHasBlock(Point pt)
  115. {
  116. if (pt.Y < 0) return false;
  117. Rectangle rc = new Rectangle(0, 0, maxWidth, maxHeight);
  118. if (!rc.Contains(pt))
  119. {
  120. return true;
  121. }
  122. for (int i=0; i<blockList.Count; i++)
  123. {
  124. if (((Block)(blockList[i])).Position == pt)
  125. {
  126. return true;
  127. }
  128. }
  129. return false;
  130. }
  131. public void PlaceShape()
  132. {
  133. for (int i=0; i<4; i++)
  134. {
  135. Point pt = nextShape.Position;
  136. Point ptOff = nextShape.GetBlock(i).Position;
  137. pt.Offset(ptOff.X, ptOff.Y);
  138. nextShape.GetBlock(i).Position = pt;
  139. blockList.Add(nextShape.GetBlock(i));
  140. }
  141. }
  142. public void Reset()
  143. {
  144. blockList.Clear();
  145. }
  146.         
  147. //清行程序 把的填满的一行清除 首先判断是否存在一行中的空块
  148. //存在的话则不能清除 反之 则清除 如果第i行清除 那么就把比i行少
  149. //那些行自动沉下来一个
  150. public int ClearLines()
  151. {
  152. int count = 0;
  153. for (int i=0; i<maxHeight; i++)
  154. {
  155. bool clear = true;
  156. for (int j=0; j<maxWidth; j++)
  157. {
  158. if (!PositionHasBlock(new Point(j, i)))
  159. {
  160. clear = false;
  161. break;
  162. }
  163. }
  164. if (clear)
  165. {
  166. for (int n=blockList.Count-1; n>=0; n--)
  167. {
  168. //如果第i行满了 则清除i行
  169. if (((Block)(blockList[n])).Position.Y == i)
  170. {
  171. blockList.RemoveAt(n);
  172. }
  173.                         //其他的比i行小的那些行则自动沉下来
  174. else if (((Block)(blockList[n])).Position.Y < i)
  175. {
  176. Point pt = ((Block)(blockList[n])).Position;
  177. pt.Y++;
  178. ((Block)(blockList[n])).Position = pt;
  179. }
  180. }
  181. count++;
  182. }
  183. }
  184. return count;
  185. }
  186. public void DrawNextShape(Graphics g)
  187. {
  188. nextShape.Draw(g);
  189. }
  190. }
  191. }