俄罗斯方块之五——完善Game类

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

游戏界面所有的小方块对象都在二维数组SquareArray里面,判断数组里面的从低层到最顶层,每层里面的所有列都有对象则这行消除。
5.1在Game类里写个判断是否为满行的方法IsFullLine(int row),传入当前行数。
 

Code:
  1. /// <summary>   
  2. /// 判断满行   
  3. /// </summary>   
  4. /// <param name="row"></param>   
  5. /// <returns></returns>   
  6. public static bool IsFullLine(int row) {   
  7.     if (row >= 0 && row < Rows){   
  8.         for (int i = 0; i < Cols; i++) if (SquareArray[row, i] == nullreturn false;   
  9.         return true;   
  10.     }   
  11.     else return false;   
  12. }  


5.2如过这次行全为空的话,就没必要继续判断上面的行了,这里还需要判断是否为空行的方法public static bool IsEmptyLine(int row),和判断满行同理。
5.3如果都有小方块的对象的话,就将上面所有行往下移。
 

Code:
  1. /// <summary>   
  2. /// 方块下移   
  3. /// </summary>   
  4. /// <param name="row"></param>   
  5. public static void MoveDown(int row) {   
  6.     for (int i = row; i > 0; i--){  //外层循环从当前行到最顶行   
  7.         if (IsEmptyLine(i)) return//为空行则返回方法   
  8.         for (int j = 0; j < Cols; j++){//内层遍历第i行的所有列   
  9.             SquareArray[i, j] = SquareArray[i - 1, j];//二维数组里面下移一行   
  10.             if (SquareArray[i, j] != null)    
  11.                 SquareArray[i, j].Location = new Point(   
  12.                     SquareArray[i, j].Location.X,SquareArray[i, j].Location.Y + Side);   
  13.         }   
  14.         for (int j = 0; j < Cols; j++) SquareArray[0, j] = null;//清空最顶行   
  15.     }   
  16. }  


5.4 消除行数result++,再继续判断落下行的所有列,直到遍历完所有行。如果有消层出现则将最上面的一行对象清除,即第0行。
 

Code:
  1. /// <summary>   
  2. /// 检测行   
  3. /// </summary>   
  4. /// <returns></returns>   
  5. public static int CheckLines() {   
  6.     int result = 0;   
  7.     int i = Rows - 1;//当前行   
  8.     //循环从底行到最定行遍历是否有满行   
  9.     while (i >= 0) {   
  10.         if (IsEmptyLine(i)) return result;   
  11.         if (IsFullLine(i)){ //满行的话   
  12.             result++;   
  13.             MoveDown(i); //将该行上方下移   
  14.         }   
  15.         else i--;        //检测上一行   
  16.     }   
  17.     return result;   
  18. }  


5.5方块行消除完后得到消除行数的积分,count通过 CheckLines()方法得到
5.6最后,需要将二维数组里面的对象重绘下,在这里有需要注意下重绘的方块是有很多小方块组成的,五颜六色。我们要求颜色统一。那么重绘方法,颜色不一样,所以我们可以在Square类中重载方法ShowSquare(),把周围颜色和中心颜色传参。
 

Code:
  1. /// <summary>   
  2. /// 重绘界面中已有的方块   
  3. /// </summary>   
  4. public static void Redarw()   
  5. {   
  6.     for (int i = 0; i < Rows; i++)   
  7.         for (int j = 0; j < Cols; j++)    
  8.             if (SquareArray[i, j] != null)   
  9.                 SquareArray[i, j].ShowSquare(picGraphics,Color.Green,new Color[]{Color.Yellow});   
  10. }  


5.7游戏总有失败的时候,判断游戏结束CheckGameOver(Block block),通过传入当前初始化的方块,通过其能不能落下判断是否结束。
 

Code:
  1. /// <summary>   
  2. /// 检测游戏是否失败(用新出来的方块能不能落下判断)   
  3. /// </summary>   
  4. /// <param name="block"></param>   
  5. /// <returns></returns>   
  6. public static bool CheckGameOver(Block block){   
  7.     foreach (Square s in block.Squares){   
  8.         int col = s.Location.X / Side;   
  9.         int row = s.Location.Y / Side;   
  10.         if (row < 0 || col < 0) continue;   
  11.         if (SquareArray[row, col] != nullreturn true;   
  12.     }   
  13.     return false;   
  14. }  

 

原创粉丝点击