这篇文章主要为大家详细介绍了C#实现简单俄罗斯方块,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
最近在看《.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#实现简单俄罗斯方块


基础教程推荐
- Unity 如何获取鼠标停留位置下的物体 2023-04-10
- 实例详解C#实现http不同方法的请求 2022-12-26
- C#调用摄像头实现拍照功能的示例代码 2023-03-09
- C#中的Linq to JSON操作详解 2023-06-08
- C# 解析XML和反序列化的示例 2023-04-14
- c# – USING块在网站与Windows窗体中的行为不同 2023-09-20
- Unity shader实现高斯模糊效果 2023-01-16
- C#获取指定目录下某种格式文件集并备份到指定文件夹 2023-05-30
- C#通过标签软件Bartender的ZPL命令打印条码 2023-05-16
- C#中 Json 序列化去掉null值的方法 2022-11-18