俄罗斯方块之三——Block类

来源:互联网 发布:如何申请免费域名 编辑:程序博客网 时间:2024/06/03 22:17

小方块有了,我们下一步就要得到游戏中的组合方块,这里创建一个Block类,为游戏中的组合方块类。那这个类有什么属性呢?位置(Location),周围颜色(SurroundColor),中心颜色(CenterColor) 。那么大小(Size)还需要吗,如果需要我们可以通过小方块的位置和数量得到。其实组合方块的Size是不需要的,我们以后的判断都是将组合块的所有小方块循环遍历的。
3.1  一个组合方块由多个小方块组成,那么我们就需要一个Square类型的集合来存储小方块。Block类添加个Squares属性,List<Square> squares。
3.2 接下来组合方块是可以转动的。定义一个枚举类型Direction,里面是方块的四个不同方向(North,East,South,West),Block类里面加个Direction属性,枚举类型,表示方块初始化的方向。
3.3 为了方便,我们规定所有类型的组合方块,以中心的方块旋转。组合方块是由不同小方块相对于中心小方块的位置变化组成的。在以后我们判断游戏出界面,高度,宽度等,都是判断组合方块的小方块集合。根据分析我们得出Block类有Location,SurroundColor,CenterColor,Squares,Direction共5个属性。
3.4 俄罗斯方块有基本形状7种。这些形状她们有Block类的共同属性,但是它们小方块的位置是不同的,旋转方法也是不同的。
我们采用继承,将Block类作为父类,7种基本形状类作为子类。
3.5 子类的共同方法有:
3.5.1 在游戏界面中显示大方块形状ShowBlock()。
3.5.2 将移动后的方块隐藏重绘HideBlock()。
3.5.3 初始化所有小方块位置的方法,定义为抽象方法Init(Direction direction)。
3.5.4 方块是随机出来的,每个方块出来的方向也是随机的,所以需要一个随机数,去得到方块初始的方向InitDirection()方法。并在这个方向的值传递给初始化方块位置Init()方法。将随机数对象在Gmae类中声明。
3.5.5 所有组合方块的旋转方法Ratate()。
3.5.6移动方法,移动有三个方向左右和下,Left()、Right()、Down()。

3.6 接下来看看每个方法是怎么具体实现的:
3.6.1 ShowBlock()方法和HideBlock()方法:只需遍历squares集合循环调用Square类的ShowSquare(Graphicsg)方法和HideSquares()方法,将所有小方块显示或重绘下。这里需要注意,在俄罗斯方块中要显示下一块方块是的形状,但面板对象不一样,把两个方法重构下,传入不同面板对象。
 
3.6.2  InitDirection()方法得到初始化的方向:
Direction = (Direction)Game.Random.Next(0, 4);//Random为随机数对象。
3.6.3  移动的方法:移动我们首先要判断是否出了游戏界面,这里用二维数组来存放游戏界面里所有的小方块对象。Square[,] SquareArray = new Square[Rows, Cols],Rows为游戏界面中的行,Clos为游戏界面中列。这样我们就可以知道游戏界面中某行某列是否有小方块。
3.6.4 将Rows,Cols和Square[,] SquareArray = new Square[Rows, Cols]声明到Game类中,并初始化。在Game类里面添加一个 IsEmpty(int row,int col)方法。来判断是否出界和是否有小方块对象在移动的方向上。
 

Code:
  1. /// <summary>   
  2. /// 判断方块所在行数是否出界,行和列都是从0开始,是否有方块   
  3. /// </summary>   
  4. /// <param name="row"></param>   
  5. /// <param name="col"></param>   
  6. /// <returns></returns>   
  7. public static bool IsEmpty(int row, int col)   
  8. {   
  9.     //判断游戏区域某个点是否已有方块,并且没出界   
  10.     if ( row >= 0 && row < Rows && col >= 0 && col < Cols)   
  11.         return SquareArray[row, col] == null;   
  12.     else return false;   
  13. }  


3.6.5在Block类里接下来移动方法就只需要判断所有小方块是否满足IsEmpty(int row,int col)方法返回True就可以移动否则不能移动。下面以往下移为例:(其他的方向同理),下移返回bool值,其他方向无返回值。
 

Code:
  1. //判断是否可以落下   
  2. public bool Down(){   
  3.     bool flag = true;   
  4.     HideBlock();   
  5.     foreach (Square s in Squares)   
  6.         flag = flag & Game.IsEmpty(s.Location.Y / Game.Side + 1, s.Location.X / Game.Side);   
  7.   
  8.     if (flag){   
  9.         //可以落下   
  10.         foreach (Square s in Squares) s.Location = new Point(s.Location.X, s.Location.Y + s.Size.Height);   
  11.         ShowBlock();   
  12.         return true;   
  13.     }   
  14.     else {   
  15.         //不可以落下   
  16.         ShowBlock();   
  17.         return false;   
  18.     }     
  19. }  

 

原创粉丝点击