public void CheckAndOverBlock() //检查砖块是否到底,如果到底的话则把它当做固定的砖块coorarr,产生新的砖块 { bool over = false; //设置一个当前运行砖块是否到底的标志 for (int i = 0; i < runBlock.Length; i++) { int x = runBlock.XPos + runBlock[i].X; int y = runBlock.YPos - runBlock[i].Y; if (y == _heihgt - 1)//如果到底,则当前砖块结束 { over = true; break; } if (!coorArr[x, y + 1].IsEmpty)//如果下面有其它砖块,则当前砖块结束 { over = true; break; } } if (over) { for (int i = 0; i < runBlock.Length; i++)//把当前砖块归入coordinateArr { coorArr[runBlock.XPos + runBlock[i].X, runBlock.YPos - runBlock[i].Y] = runBlock.BlockColor; } //检查是否有满行的情况,如果有,则去掉满行 CheckAndDelFullRow(); //产生新的砖块 runBlock = readyBlock; //新的砖块为准备好的砖块 runBlock.XPos = _width / 2; //确定当前运行砖块的出生位置 int y = 0; for (int i = 0; i < runBlock.Length; i++) { if (runBlock[i].Y > y) { y = runBlock[i].Y; } } runBlock.YPos = y; //检查新产生的砖块所占用的地方是否已经有砖块,如果有,则游戏结束 for (int i = 1; i < runBlock.Length; i++) { if (!coorArr[runBlock.XPos + runBlock[i].X, runBlock.YPos - runBlock[i].Y].IsEmpty) { //游戏结束 StringFormat drawFormat = new StringFormat(); drawFormat.Alignment = StringAlignment.Center; gpPalette.DrawString("GAME OVER", new Font("Arial Black", 25f), new SolidBrush(Color.White), new RectangleF(0, _heihgt * recPix / 2 - 100, _width * recPix, 100), drawFormat); timerBlock.Stop();//关闭定时器 return; } } runBlock.Paint(gpPalette); //获取新的准备砖块 BlockGroup bGroup = new BlockGroup(); readyBlock = bGroup.GetABlock(); readyBlock.XPos = 2; readyBlock.YPos = 2; gpReady.Clear(Color.Black); readyBlock.Paint(gpReady); } }