学习C#从俄罗斯方块开始(三)俄罗斯方块的优化和美化

aofengdaxia 2010-02-18 03:23:32
前两节的内容在帖子:
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);
}
...全文
936 41 打赏 收藏 转发到动态 举报
写回复
用AI写文章
41 条回复
切换为时间正序
请发表友善的回复…
发表回复
hubinyes 2012-08-22
  • 打赏
  • 举报
回复
右侧。。。没画上线条呢、、
hubinyes 2012-08-22
  • 打赏
  • 举报
回复
没积分。。下不了
superpp1990 2011-10-12
  • 打赏
  • 举报
回复
很强大~
steady3659 2011-08-14
  • 打赏
  • 举报
回复
新手学习中,谢谢楼主
a1140012035 2011-07-27
  • 打赏
  • 举报
回复
感谢lz,期待lz推陈出新
seawaycao 2011-07-08
  • 打赏
  • 举报
回复
顶一下!~~学习了!!~~
cjl09039 2011-04-07
  • 打赏
  • 举报
回复
我自己也想编 但是现在没有一点头绪,,, 不知道到底要些什么知识
LuRenMJava 2011-04-07
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 lixinlu2000 的回复:]
关注楼主,什么时候继续更新呀?
[/Quote]
还有没有其他的游戏源代码啊?期待中!
临江仙 2011-01-01
  • 打赏
  • 举报
回复
支持 期待你推出其他游戏
taki25 2010-03-02
  • 打赏
  • 举报
回复
受益匪浅.感谢你的点拨,不错!
aofengdaxia 2010-02-26
  • 打赏
  • 举报
回复
今天晚上结贴,另外放出新的教程。
aofengdaxia 2010-02-24
  • 打赏
  • 举报
回复
自己顶顶啊。哈哈哈哈哈哈
aofengdaxia 2010-02-22
  • 打赏
  • 举报
回复
引用 22 楼 pywepe 的回复:
lz果然强大 文章也很好

不过好像没有用到面向对象的思想 本人不才


汗,确实是,虽然用了面向对象的语言,但是没用面向对象的思想,在开发的时候项目太小了,没去考虑重用。我思考思考去改善改善。谢谢
pywepe 2010-02-22
  • 打赏
  • 举报
回复
代码真的写得好漂亮 回学校去好好学学
pywepe 2010-02-22
  • 打赏
  • 举报
回复
lz果然强大 文章也很好

不过好像没有用到面向对象的思想 本人不才
aofengdaxia 2010-02-22
  • 打赏
  • 举报
回复
引用 18 楼 wo65432519 的回复:
要5个资源分...LZ这个东西不是应该ForFree 啊!


这个打个分数就把积分还给大家了,然后还可以赚一份。鼓励大家良性互动嘛。
再说,这个俄罗斯方块也不是以前开发的东西拿出来分享,而是我现在在业余时间舍弃陪老婆逛街的同时,重新搞的。所以,看在我老婆的面子上,就别介意了。俺写这个东西也别无他求。
xuenzhen123 2010-02-22
  • 打赏
  • 举报
回复
很强大 学习了~~~~
Joe-xXx 2010-02-22
  • 打赏
  • 举报
回复
要5个资源分...LZ这个东西不是应该ForFree 啊!
aofengdaxia 2010-02-22
  • 打赏
  • 举报
回复
自己再顶顶,捞点人气
aofengdaxia 2010-02-22
  • 打赏
  • 举报
回复
引用 25 楼 lixinlu2000 的回复:
关注楼主,什么时候继续更新呀?

网络版的俄罗斯方块今天晚上开始整理。估计俩晚上左右,开始公布文章和源码
加载更多回复(19)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧