当前位置: 移动技术网 > IT编程>开发语言>c# > C#实现简单俄罗斯方块

C#实现简单俄罗斯方块

2020年06月23日  | 移动技术网IT编程  | 我要评论

周禹候,梵非,罗奇正

最近在看《.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),游戏中基本元素与游戏驱动的理解。

更多俄罗斯方块精彩文章请点击专题:俄罗斯方块游戏集合 进行学习。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网