欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#实现简单俄罗斯方块

程序员文章站 2023-11-09 16:56:16
最近在看《.net游戏编程入门经典 c#篇》 第一章介绍了如何制作俄罗斯方块,自己试了试按照书上的步骤,可算是完成了。于是写下这篇文章留作纪念。1.类的设计在充分分析游戏的特点后,游戏大概可以分为3个...

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

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

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