俄罗斯方块之六——窗体设计

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

6.1  KeyDown事件,当方块不可以下落的时候,我们要处理游戏等级、层数、分数等数据还要把将方块放入二维数组中、下个方块的创建、判断是否结束。
6.1.1 创建新的方块,方块类型是随机创建的,增加一个枚举类BlockType,存放方块的所有类型。通过简单工厂得到父类。每种方块的中心颜色和周围以颜色可以自定义。由于画板对象不同,位置不同,需要传入参数。
 

Code:
  1. public class BlockFactory   
  2. {   
  3. public static Block CreatBlock(Point location,Graphics g)   
  4. {   
  5.     Type t = typeof(BlockType);//获取BlockType类的信息   
  6.     string[] blocks = Enum.GetNames(t);//得到枚举的所有值   
  7.     int num = Game.Random.Next(blocks.Length);   
  8.     BlockType bt = (BlockType)num;   
  9.     Block block = null;   
  10.     switch (bt)   
  11.     {   
  12.         case BlockType.BlockF:   
  13.             block = new BlockF();   
  14.             block.SurroundColor = new Color[] { Color.LightGreen };   
  15.             block.CenterColor = Color.Red;   
  16.             break;   
  17.         case BlockType.BlockJ:   
  18.             block = new BlockJ();   
  19.             block.SurroundColor = new Color[] { Color.SkyBlue };   
  20.             block.CenterColor = Color.Orange;   
  21.             break;   
  22.         case BlockType.BlockL:   
  23.             block = new BlockL();   
  24.             block.SurroundColor = new Color[] { Color.LimeGreen };   
  25.             block.CenterColor = Color.Pink;   
  26.             break;   
  27.         case BlockType.BlockZ:   
  28.             block = new BlockZ();   
  29.             block.SurroundColor = new Color[] { Color.Red };   
  30.             block.CenterColor = Color.MediumTurquoise;   
  31.             break;   
  32.         case BlockType.BlockS:   
  33.             block = new BlockS();   
  34.             block.SurroundColor = new Color[] { Color.Pink };   
  35.             block.CenterColor = Color.Green;   
  36.             break;   
  37.         case BlockType.BlockN:   
  38.             block = new BlockN();   
  39.             block.SurroundColor = new Color[] { Color.Yellow };   
  40.             block.CenterColor = Color.Blue;   
  41.             break;   
  42.         case BlockType.BlockT:   
  43.             block = new BlockT();   
  44.             block.SurroundColor = new Color[] { Color.Blue };   
  45.             block.CenterColor = Color.Yellow;   
  46.             break;   
  47.         case BlockType.VBlockT:   
  48.             block = new VBlockT();   
  49.             block.SurroundColor = new Color[] { Color.Blue };   
  50.             block.CenterColor = Color.Wheat;   
  51.             break;   
  52.         case BlockType.SingelBlock:   
  53.             block = new SingelBlock();   
  54.             block.SurroundColor = new Color[] { Color.Yellow };   
  55.             block.CenterColor = Color.Wheat;   
  56.             break;   
  57.     }   
  58.     block.Location = location;   
  59.     block.InitDirection();   
  60.     block.ShowBlock(g);   
  61.     return block;   
  62. }  


 6.1.2 将落下的方块放入二维数组里。并得到落下时最下面的小方块所在的行,用于计算普通分数。
 

Code:
  1. //得到每个小方块最下面位置所在的行,并将形状的每个方块放置到游戏方块数组中   
  2. List<int> rows = new List<int>();   
  3. foreach (Square square in currBlock.Squares)   
  4. {   
  5.     int row = square.Location.Y / Game.Side;   
  6.     int col = square.Location.X / Game.Side;   
  7.     Game.SquareArray[row, col] = square;   
  8.     rows.Add(row);   
  9. }   
  10. int minRow = rows.Max();  


6.1.3 处理数据并显示到控件上
 

Code:
  1. //总行数   
  2. int count = Game.CheckLines();   
  3. Game.LayerCount += count;   
  4.   
  5. //游戏级别   
  6. if (Game.LayerCount <= 150) Game.Level = Game.LayerCount / 5 + 1;   
  7. else Game.Level = 30 + (Game.LayerCount - 150) / 50;   
  8.   
  9. //游戏级别增加则速度加0.2(1)倍   
  10. tmrDown.Interval = 1000 / (Game.Level + 1);   
  11.   
  12. //游戏总分数   
  13. Game.Score += Game.CheckScore(count);   
  14.   
  15. //方块落下去根据 游戏等级和方块最下面部分所在行 *5得到普通分   
  16. Game.Score += (Game.Rows - minRow) * Game.Level * 3;   
  17.   
  18. //空间显示   
  19. lblLevel.Text = Game.Level.ToString();   
  20. lblLines.Text = Game.LayerCount.ToString();   
  21. lblPoint.Text = Game.Score.ToString();  


6.1.4 判断是否结束,然后创建新方块
 

Code:
  1. /// <summary>   
  2. /// 创建新方块   
  3. /// </summary>   
  4. private void CreateNewBlock()   
  5. {   
  6.     //下个方块赋给当前方块   
  7.     currBlock = nextBlock;   
  8.     //将每个小方块的初始位置改变下   
  9.     foreach (Square sq in currBlock.Squares) sq.Location = new Point(sq.Location.X + 40, sq.Location.Y);   
  10.     currBlock.ShowBlock();   
  11.     //判断是否失败   
  12.     if (Game.CheckGameOver(currBlock))   
  13.     {   
  14.         tmrDown.Stop();   
  15.         MessageBox.Show("Game Over");   
  16.     }   
  17.     //创建新方块,下一个方块        
  18.     picNext.Refresh();   
  19.     nextBlock = BlockFactory.CreatBlock(new Point(40, 20), Graphics.FromHwnd(picNext.Handle));   
  20. }  


6.1.5 将6.1.2-6.1.4全部写在一个BlockDown()方法里。
6.1.6 在KeyDown时间里判断移动方向,调用相应的方法。
6.2 计时器事件tmrDown。调用BlockDown()方法。
6.3 开始事件,创建当前方块对象和下一个方块对象,计时器开。
6.4 暂停事件。开关设置,和计时器开关设置。
整个俄罗斯方块项目基本功能都实现了。