6.1 KeyDown事件,当方块不可以下落的时候,我们要处理游戏等级、层数、分数等数据还要把将方块放入二维数组中、下个方块的创建、判断是否结束。
6.1.1 创建新的方块,方块类型是随机创建的,增加一个枚举类BlockType,存放方块的所有类型。通过简单工厂得到父类。每种方块的中心颜色和周围以颜色可以自定义。由于画板对象不同,位置不同,需要传入参数。
- public class BlockFactory
- {
- public static Block CreatBlock(Point location,Graphics g)
- {
- Type t = typeof(BlockType);//获取BlockType类的信息
- string[] blocks = Enum.GetNames(t);//得到枚举的所有值
- int num = Game.Random.Next(blocks.Length);
- BlockType bt = (BlockType)num;
- Block block = null;
- switch (bt)
- {
- case BlockType.BlockF:
- block = new BlockF();
- block.SurroundColor = new Color[] { Color.LightGreen };
- block.CenterColor = Color.Red;
- break;
- case BlockType.BlockJ:
- block = new BlockJ();
- block.SurroundColor = new Color[] { Color.SkyBlue };
- block.CenterColor = Color.Orange;
- break;
- case BlockType.BlockL:
- block = new BlockL();
- block.SurroundColor = new Color[] { Color.LimeGreen };
- block.CenterColor = Color.Pink;
- break;
- case BlockType.BlockZ:
- block = new BlockZ();
- block.SurroundColor = new Color[] { Color.Red };
- block.CenterColor = Color.MediumTurquoise;
- break;
- case BlockType.BlockS:
- block = new BlockS();
- block.SurroundColor = new Color[] { Color.Pink };
- block.CenterColor = Color.Green;
- break;
- case BlockType.BlockN:
- block = new BlockN();
- block.SurroundColor = new Color[] { Color.Yellow };
- block.CenterColor = Color.Blue;
- break;
- case BlockType.BlockT:
- block = new BlockT();
- block.SurroundColor = new Color[] { Color.Blue };
- block.CenterColor = Color.Yellow;
- break;
- case BlockType.VBlockT:
- block = new VBlockT();
- block.SurroundColor = new Color[] { Color.Blue };
- block.CenterColor = Color.Wheat;
- break;
- case BlockType.SingelBlock:
- block = new SingelBlock();
- block.SurroundColor = new Color[] { Color.Yellow };
- block.CenterColor = Color.Wheat;
- break;
- }
- block.Location = location;
- block.InitDirection();
- block.ShowBlock(g);
- return block;
- }
6.1.2 将落下的方块放入二维数组里。并得到落下时最下面的小方块所在的行,用于计算普通分数。
- //得到每个小方块最下面位置所在的行,并将形状的每个方块放置到游戏方块数组中
- List<int> rows = new List<int>();
- foreach (Square square in currBlock.Squares)
- {
- int row = square.Location.Y / Game.Side;
- int col = square.Location.X / Game.Side;
- Game.SquareArray[row, col] = square;
- rows.Add(row);
- }
- int minRow = rows.Max();
6.1.3 处理数据并显示到控件上
- //总行数
- int count = Game.CheckLines();
- Game.LayerCount += count;
- //游戏级别
- if (Game.LayerCount <= 150) Game.Level = Game.LayerCount / 5 + 1;
- else Game.Level = 30 + (Game.LayerCount - 150) / 50;
- //游戏级别增加则速度加0.2(1)倍
- tmrDown.Interval = 1000 / (Game.Level + 1);
- //游戏总分数
- Game.Score += Game.CheckScore(count);
- //方块落下去根据 游戏等级和方块最下面部分所在行 *5得到普通分
- Game.Score += (Game.Rows - minRow) * Game.Level * 3;
- //空间显示
- lblLevel.Text = Game.Level.ToString();
- lblLines.Text = Game.LayerCount.ToString();
- lblPoint.Text = Game.Score.ToString();
6.1.4 判断是否结束,然后创建新方块
- /// <summary>
- /// 创建新方块
- /// </summary>
- private void CreateNewBlock()
- {
- //下个方块赋给当前方块
- currBlock = nextBlock;
- //将每个小方块的初始位置改变下
- foreach (Square sq in currBlock.Squares) sq.Location = new Point(sq.Location.X + 40, sq.Location.Y);
- currBlock.ShowBlock();
- //判断是否失败
- if (Game.CheckGameOver(currBlock))
- {
- tmrDown.Stop();
- MessageBox.Show("Game Over");
- }
- //创建新方块,下一个方块
- picNext.Refresh();
- nextBlock = BlockFactory.CreatBlock(new Point(40, 20), Graphics.FromHwnd(picNext.Handle));
- }
6.1.5 将6.1.2-6.1.4全部写在一个BlockDown()方法里。
6.1.6 在KeyDown时间里判断移动方向,调用相应的方法。
6.2 计时器事件tmrDown。调用BlockDown()方法。
6.3 开始事件,创建当前方块对象和下一个方块对象,计时器开。
6.4 暂停事件。开关设置,和计时器开关设置。
整个俄罗斯方块项目基本功能都实现了。