俄罗斯方块——图形编程
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://wangjierui.blog.51cto.com/186879/56005 |
第三个题目是俄罗斯方块游戏。该游戏算法比较简单,主要功夫都在界面体验上了,比如方块图形、用户控制、消去与累计等。
图形我们采用GDI+画图方式显示,共8种图形,当然可以根据自己的喜好随意定制。如何表示图形?我们可以借鉴马赛克效果。把所有图形都用3*3矩阵表示,0表示背景色显示,1表示着色显示。比如
{0,0,0},
{0,1,0}, 表示 T型,看出来了吗?每个数字位置其实就是一个正方形小块。 {1,1,1} 用户控制?简单KeyPress事件实现就好。当然还有一个无需用户控制的就是自动下落,可以使用Timer实现。
消去算法?^_^,当然很简单,如果一行上有为0的单元格,那么表示没有充满,就不用消去;否则就要消去。累计就是数组追加,消去就是元素删除。
当然了,消去与累计都需要将数据的变化体现到界面上,那就是画图。Graphics对象我们都会使用,在该windows窗体游戏中,我们可以实现OnPaint事件。每当需要重绘的时候,比如用户控制,消去等,就调用窗体refresh,那么自然会触发Paint事件。以下是代码示例:
public int[][,] figures = new int[8][,]//8种图形
{ new int[3,3] { {0,0,0}, {0,1,0}, {1,1,1} }, new int[3,3] { {0,0,0}, {0,2,2}, {2,2,0} }, new int[3,3] { {0,0,0}, {3,3,0}, {0,3,3} }, new int[2,2] { {4,4}, {4,4} }, new int[3,3] { {5,0,0}, {5,0,0}, {5,5,0} }, new int[3,3] { {0,6,0}, {0,6,0}, {6,6,0} }, new int[4,4] { {7,0,0,0}, {7,0,0,0}, {7,0,0,0}, {7,0,0,0} }, new int[3,3] { {0,8,0}, {8,8,8}, {0,0,0} } }; 你能从上面的定义看出有哪些图形吗?^_^,为什么不为0的地方不全是1?因为我想让不同的图形显示不同的颜色,如果无此要求则不必这样。
在具体画图时,我们需要将将数组大小转换为区域边长方格数 int conversize(int sz) { int s = 0; if (sz == 4) s = 2; if (sz == 9) s = 3; if (sz == 16) s = 4; return s; } 当然出现的图形是随机的,直接用Random就可以做到。
记住无论什么动作引起的图形变化,包括移动、旋转等都要用Refresh,以便刷新游戏界面。例如向左
public void moveLeft()
{ if (check(figure, px - 1, py)) px = px - 1;
Refresh();//this.Refresh(); } protected override void OnPaint(PaintEventArgs e)这个熟悉吧?嗯,界面就是它画出来的。你要在界面显示什么,就在里面画什么。记住,是全部界面,因为我们的这个游戏没有任何其他资源,没有任何控件,只有图形。
当然了,图形位置移动必须要要检查越界和是否遇到障碍物。也就是上述的check方法。基本思路就是图形经过的位置中无越界并且无不为0的单元格存在。
bool check(int[,] fg, int x, int y)
{ int sz = conversize(fg.Length); for (int i = 0; i < sz; i++)
for (int j = 0; j < sz; j++) { int rx = i + x; int ry = j + y; if ((rx < 0 || rx > 9 || ry < 0 || ry > 19) && fg[i, j] != 0) return false; if (!(rx < 0 || rx > 9 || ry < 0 || ry > 19)) if (board[rx, ry] != 0 && fg[i, j] != 0) return false; } return true;
} 旋转怎么实现?一个纯数组倒序排列的简单题目,不是吗?
最后是游戏难度的问题,等级越高,降落速度越快,其实就是把等级数字跟计时器的Interval挂钩就是了。
其他的就不多说了。有兴趣的可以把它做成控件,方便大家使用。祝你玩的开心。
明天搞那个木马记录器…… 本文出自 “王杰瑞的技术博客” 博客,请务必保留此出处http://wangjierui.blog.51cto.com/186879/56005 本文出自 51CTO.COM技术博客 |



王杰瑞
博客统计信息
热门文章
最新评论
友情链接