C#实现简单俄罗斯方块
程序员文章站
2023-12-29 10:57:58
最近在看《.net游戏编程入门经典 c#篇》 第一章介绍了如何制作俄罗斯方块,自己试了试按照书上的步骤,可算是完成了。于是写下这篇文章留作纪念。1.类的设计在充分分析游戏的特点后,游戏大概可以分为3个...
最近在看《.net游戏编程入门经典 c#篇》 第一章介绍了如何制作俄罗斯方块,自己试了试按照书上的步骤,可算是完成了。
于是写下这篇文章留作纪念。
1.类的设计
在充分分析游戏的特点后,游戏大概可以分为3个类:square 小正方形,block 由4个小正方形组合成的一个图形, gamefield 游戏的驱动引擎
2.代码的编写
按照从小到大,从简单到复杂的顺序,先完成square类,square很简单,只需要提供show,hide方法以及size,location属性。
接下来是block,block相对比较复杂,分为以下几种:
它应该有4个square 编号可以按照个人习惯,当然之后计算坐标的时候也要根据个人的编号来进行。
block应该有hide,show,left,right,rotate一些方法,属性的话为了计算坐标 应该有square的大小,还有color
要注意的是rotate方法将block顺时针旋转90°,图上已经标出旋转的中心。
最后剩下的就是gamefield了,他应该有一个数组,保存背景中所有的square,以及哪些位置有square的 位标志数组,对每一行的检查(是否消去得分)以及消去所有方块下移操作。
这些类完成后就可以简单的写游戏逻辑了,因为太简单就不说了,简单的贴一下代码
private block currentblock; private block nextblock; private int score; private bool blockfalling; private void button1_click(object sender, eventargs e) { picturebox1.refresh(); currentblock = new block(new point(gamefield.width / 2 * gamefield.squaresize, 0), block.blocktypes.undefined); currentblock.show(gamefield.winhandle); nextblock = new block(new point(15, 15), block.blocktypes.undefined); nextblock.show(picturebox2.handle); timer1.enabled = true; button1.enabled = false; focus(); score = 0; } private void form1_load(object sender, eventargs e) { gamefield.winhandle = picturebox1.handle; gamefield.backcolor = picturebox1.backcolor; } private void form1_keydown(object sender, keyeventargs e) { if (currentblock == null) { return; } switch (e.keycode) { case keys.w: currentblock.rotate(); break; case keys.s: currentblock.down(); break; case keys.a: currentblock.left(); break; case keys.d: currentblock.right(); break; } } private void timer1_tick(object sender, eventargs e) { if (!currentblock.down()) { blockfalling = false; //塞满了 游戏结束 0 0 if (currentblock.top() == 0) { timer1.enabled = false; button1.enabled = true; gamefield.reset(); messagebox.show("恭喜你跪了"); return; } } else { blockfalling = true; } if (!blockfalling) { //检查得分 int earsecount = gamefield.checklines(); if (earsecount > 0) { score += earsecount * 20; label1.text = score.tostring(); //使图片框重绘 清楚block picturebox1.invalidate(); application.doevents(); gamefield.redraw(); } picturebox2.invalidate(); application.doevents(); currentblock = new block(new point(gamefield.width / 2 * gamefield.squaresize, 0), nextblock.blocktype); currentblock.show(gamefield.winhandle); nextblock = new block(new point(15, 15), block.blocktypes.undefined); nextblock.show(picturebox2.handle); blockfalling = true; } } private void form1_activated(object sender, eventargs e) { gamefield.redraw(); if (nextblock !=null)nextblock.show(picturebox2.handle); }
3.总结
这个简单的游戏,可谓是刚好适合新手。可以学到冲突检测(checklines),游戏中基本元素与游戏驱动的理解。
更多俄罗斯方块精彩文章请点击专题:俄罗斯方块游戏集合 进行学习。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。