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#实现简单俄罗斯方块 的全部内容, 来源链接: utcz.com/z/332335.html

回到顶部