C#实现简单俄罗斯方块
- 作者: Zoan
- 来源: 51数据库
- 2021-07-31
最近在看《.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),游戏中基本元素与游戏驱动的理解。
更多俄罗斯方块精彩文章请点击专题:俄罗斯方块游戏集合 进行学习。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读
- C#通过fleck实现wss协议的WebSocket多人Web实时聊天(附源码)
- 团队城市未满足要求:MSBuildTools12.0_x86_Path 存在
- 使用 MSBuild.exe 在发布模式下构建 C# 解决方案
- 当我发布 Web 应用程序时,AfterPublish 脚本不运行
- 构建时 T4 转换的产品仅在下一个构建中使用
- ASP.NET Core Application (.NET Framework) for Windows x64 only error in project.assets.json
- 新的 .csproj 格式 - 如何将整个目录指定为“链接文件"到子目录?
- 如何将条件编译符号(DefineConstants)传递给 msbuild
- MSBuild 支持 Visual Studio 2017 RTM 中的 T4 模板
- NuGet 包还原找不到包,没有源
热点文章
团队城市未满足要求:MSBuildTools12.0_x86_Path 存在
0
使用 MSBuild.exe 在发布模式下构建 C# 解决方案
0
当我发布 Web 应用程序时,AfterPublish 脚本不运行
0
构建时 T4 转换的产品仅在下一个构建中使用
0
ASP.NET Core Application (.NET Framework) for Windows x64 only error in project.assets.json
0
新的 .csproj 格式 - 如何将整个目录指定为“链接文件"到子目录?
0
如何将条件编译符号(DefineConstants)传递给 msbuild
0
MSBuild 支持 Visual Studio 2017 RTM 中的 T4 模板
0
NuGet 包还原找不到包,没有源
0
使用 C# 6.0 功能运行 TFS 构建
0
