http://topic.csdn.net/u/20100209/12/2f3af7b2-3faf-4d4c-beba-21367540d321.html上面。欢迎如果您已经看了前两讲的内容,欢迎继续,如果你还没有看前两讲。请去看看吧;
按照我们第一节课程《学习C#从俄罗斯方块开始(一)概述》 的规划。我们在完成了俄罗斯方块Demo后,我们将要对Demo进行优化和美化设置,使得俄罗斯的可玩性增强。本节课程我们就从算法的优化、游戏的美化和可玩性的扩展性上进行改进,让我们的游戏变得强大起来,也让我们的开发技术上一个小小的台阶。
第一、算法的优化:
在Demo中,我们基本上都是用循环来完成向下、向左、向右的移动、检查是否存在可以得分的行等动作。在这些循环中我们使用了从0到最大值的循环。本算法的优化,我们主要着重于缩小循环的范围开始。经过我们的观察发现。在检测是否满行和绘制背景的时候,我们采用了历边所有的背景数组。我们可以缩小到只在俄罗斯方块完成落下的最小高度上进行检测,这样就大大的缩小了我们的循环范围。
所以我们申明了一个参数:lowY.
private int lowY = 19; //初始化的时候为到最下面。然后随着lowY的减少,循环范围会原来越大
原来我们的检测是否得分的函数:
private void CheckSore()
{
for (int y = 19; y > -1; y--)
{
bool isFull = true;
for (int x = 13; x > -1; x--)
{
if (bgGraoud[y, x] == 0)
{
isFull = false;
break;
}
}
if (isFull)
{
//增加积分
Sorce = Sorce + 100;
for (int yy = y; yy > 0; yy--)
{
for (int xx = 0; xx < 14; xx++)
{
int temp = bgGraoud[yy - 1, xx];
bgGraoud[yy, xx] = temp;
}
}
y++;
label1.Text = Sorce.ToString(); ;
Draw();
}
}
}
可以优化为:
private void CheckSore()
{
for (int y = 19; y > lowY; y--)
{
bool isFull = true;
for (int x = 13; x > -1; x--)
{
if (bgGraoud[y, x] == 0)
{
isFull = false;
break;
}
}
if (isFull)
{
//增加积分
lowY++; //减少了一行,循环就可以减少一行
Sorce = Sorce + 100;
for (int yy = y; yy > 0; yy--)
{
for (int xx = 0; xx < 14; xx++)
{
int temp = bgGraoud[yy - 1, xx];
bgGraoud[yy, xx] = temp;
}
}
y++;
label1.Text = Sorce.ToString(); ;
Draw();
}
}
}
原来的绘图函数
private void Draw()
{
Graphics g = Graphics.FromImage(myImage);
g.Clear(this.BackColor);
for (int bgy = 0; bgy < 20; bgy++)
{
for (int bgx = 0; bgx < 14; bgx++)
{
if (bgGraoud[bgy, bgx] == 1)
{
g.FillRectangle(new SolidBrush(Color.Blue), bgx * 20, bgy * 20, 20, 20);
}
}
}
//绘制当前的图片
for (int y = 0; y < 4; y++)
{
for (int x = 0; x < 4; x++)
{
if (CurrentTrick[y, x] == 1)
{
g.FillRectangle(new SolidBrush(Color.Blue), (x + CurrentX) * 20, (y + CurrentY) * 20, 20, 20);
}
}
}
Graphics gg = panel1.CreateGraphics();
gg.DrawImage(myImage, 0, 0);
}
可以优化为:
private void Draw()
{
Graphics g = Graphics.FromImage(myImage);
g.Clear(this.BackColor);
for (int bgy = lowY; bgy < 20; bgy++)
{
for (int bgx = 0; bgx < 14; bgx++)
{
if (bgGraoud[bgy, bgx] == 1)
{
g.FillRectangle(new SolidBrush(Color.Blue), bgx * 20, bgy * 20, 20, 20);
}
}
}
//绘制当前的图片
for (int y = 0; y < 4; y++)
{
for (int x = 0; x < 4; x++)
{
if (CurrentTrick[y, x] == 1)
{
g.FillRectangle(new SolidBrush(Color.Blue), (x + CurrentX) * 20, (y + CurrentY) * 20, 20, 20);
}
}
}
Graphics gg = panel1.CreateGraphics();
gg.DrawImage(myImage, 0, 0);
}