C#实现简单俄罗斯方块

所属分类: 软件编程 / C#教程 阅读数: 52
收藏 0 赞 0 分享

最近在看《.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#中Datetimepicker出现问题的解决方法

这篇文章主要给大家介绍了关于C#中Datetimepicker出现问题的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

C# SQLite数据库入门使用说明

这篇文章主要给大家介绍了关于C#中SQLite数据库入门使用的相关资料,文中通过图文以及示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

C#实现批量下载图片到本地示例代码

这篇文章主要给大家介绍了关于C#如何实现批量下载图片到本地的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用c#具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

如何获取C#中方法的执行时间以及其代码注入详解

这篇文章主要给大家介绍了关于如何获取C#中方法的执行时间以及其代码注入的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧
收藏 0 赞 0 分享

C#中通过LRU实现通用高效的超时连接探测

这篇文章主要介绍了c#中通过LRU实现通用高效的超时连接探测,非常不错,具有一定的参考借鉴价值 ,需要的朋友可以参考下
收藏 0 赞 0 分享

如何使用C#将Tensorflow训练的.pb文件用在生产环境详解

这篇文章主要给大家介绍了关于如何使用C#将Tensorflow训练的.pb文件用在生产环境的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

C#程序启动项的设置方法

这篇文章主要为大家详细介绍了C#程序启动项的设置方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

c#爬虫爬取京东的商品信息

这篇文章主要给大家介绍了关于利用c#爬虫爬取京东商品信息的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们随着小编来一起学习学习吧
收藏 0 赞 0 分享

C#随机数生成字母金字塔

这篇文章主要为大家详细介绍了C#随机数生成字母金字塔,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

WPF实现窗体中的悬浮按钮

这篇文章主要为大家详细介绍了WPF实现窗体中的悬浮按钮,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享
查看更多