C#实现简单俄罗斯方块

作者:q645989637 时间:2023-06-18 07:18:36 

最近在看《.NET游戏编程入门经典 C#篇》 第一章介绍了如何制作俄罗斯方块,自己试了试按照书上的步骤,可算是完成了。

于是写下这篇文章留作纪念。

1.类的设计

在充分分析游戏的特点后,游戏大概可以分为3个类:Square 小正方形,Block 由4个小正方形组合成的一个图形, GameField 游戏的驱动引擎

2.代码的编写

按照从小到大,从简单到复杂的顺序,先完成Square类,Square很简单,只需要提供Show,Hide方法以及Size,Location属性。

接下来是Block,Block相对比较复杂,分为以下几种:

C#实现简单俄罗斯方块

它应该有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),游戏中基本元素与游戏驱动的理解。

来源:https://blog.csdn.net/q645989637/article/details/9299957

标签:C#,俄罗斯方块
0
投稿

猜你喜欢

  • Android中GIF动图的播放控制和监听详解

    2023-12-08 18:15:01
  • Spring + Mybatis 项目实现动态切换数据源实例详解

    2022-01-13 04:34:41
  • 一款非常简单酷炫的LoadingView动画效果

    2021-11-09 11:49:08
  • C# 反射与 Quartz 实现流程处理详情

    2022-11-11 09:11:07
  • 基于WPF实现3D画廊动画效果的示例代码

    2022-02-06 08:02:22
  • Java多线程同步工具类CyclicBarrier的使用

    2021-08-26 05:29:53
  • C#中using关键字的使用方法示例

    2023-07-30 14:17:02
  • 详解Spring Boot Admin监控服务上下线邮件通知

    2023-06-16 21:53:31
  • Android开发之ToggleButton实现开关效果示例

    2022-01-12 20:22:30
  • unity中点击某一个按钮播放某一个动作的操作

    2023-12-01 04:38:05
  • Java反射如何修改private final成员变量值

    2023-09-06 03:43:18
  • Java裁剪压缩PNG图片,透明背景色变黑的解决方案

    2023-11-25 13:21:27
  • Android中双击返回键退出应用实例代码

    2022-02-20 00:28:44
  • Android中Fragment的基本用法示例总结

    2021-11-25 19:00:23
  • c# 将Minio.exe注册成windows服务

    2022-09-25 20:51:18
  • Mybatis实现关联关系映射的方法示例

    2022-09-18 05:36:12
  • SSH框架网上商城项目第8战之查询和删除商品类别功能实现

    2023-02-12 05:54:39
  • C++内存池的简单实现

    2022-05-27 05:20:50
  • Android中ListView下拉刷新的实现方法实例分析

    2023-07-31 01:40:27
  • java编程求二叉树最大路径问题代码分析

    2023-03-16 20:44:16
  • asp之家 软件编程 m.aspxhome.com