天天看点

XMOVE3.0手持终端——软件介绍(三):在2KB内存的单片机上实现的的俄罗斯方块 (原创)

  

   与xmove手持终端相关的介绍文章列表如下:

  相对于五子棋,俄罗斯方块算法更是满天飞。我的代码还是相对好移植的,看起来也更清晰,方便学弟学妹们做编程小学期时移植。不过要做就要做的有特色:它运行在软硬件由我们独立开发的平台上。以下是截图:

XMOVE3.0手持终端——软件介绍(三):在2KB内存的单片机上实现的的俄罗斯方块 (原创)
XMOVE3.0手持终端——软件介绍(三):在2KB内存的单片机上实现的的俄罗斯方块 (原创)

  有如下特点:

    跑在独立开发的平台上,平台为msp430f149,内存2kb,频率8mhz

支持体感:可以通过左右倾斜来左右移动方块,还可以上下抖动改变方块形状

代码精简,方便移植

内存占用率极低

支持横屏和竖屏操作

支持等级:用户在达到一定分数后,等级会上升,从而方块下落速度变得更快

  我们将问题细化为以下几个方面:

  1. 方块的形状如何存储

  俄罗斯方块总共有19种形状,每种形状都由四个小方块组成。如何高效存储这些方块的形状是个值得思考的问题。

XMOVE3.0手持终端——软件介绍(三):在2KB内存的单片机上实现的的俄罗斯方块 (原创)

  上图介绍了存储方法:

  我们用以下数组保存形状:

 2. 如何解决各个方块的互相转换的顺序:

  以上的数组已经解决了这一问题,多维数组的最后一位即该形状发生改变后的下一个形状。

 3. 如何存储当前的画布信息

XMOVE3.0手持终端——软件介绍(三):在2KB内存的单片机上实现的的俄罗斯方块 (原创)

 3. 如何解决碰撞问题:

  这大概是算法当中最值得考虑的了,我们用以下四个函数解决:

  所有的函数形参类似,它们的定义分别是:

  xaxi,yaxi:存储当前形状的左上角的点在画布中的实际偏移量。

  data[][22]:存储的画布数据

  type:当前形状的id(即boxsharp的数组偏移量)

   算法本身很清晰,分别检测四个方块在改变后的实际位置是否已经有墙壁或方块存在。这个属性用临时变量value存储,默认为1,如发现碰撞,则赋值为0并返回。 

4. 如何判断某一行已经被填充满并计分?

  下面是代码,很简单,检测该行的10个方格是不是都填满了,若填满,则加分,并重新刷新lcd

  5. 如何产生方块?并检查方块已经顶到头?

  代码如下:(值得讨论的是,在单片机中如何产生随机数?)

   好了,这些核心问题我们都讨论完了,下面讨论核心流程。

  若加上全部处理,包括刷新界面,显示欢迎界面,显示失败和分数界面,那么还是很冗长的。这些对于实现核心算法无益,我们也不需要关心。

  下面是流程图:

XMOVE3.0手持终端——软件介绍(三):在2KB内存的单片机上实现的的俄罗斯方块 (原创)

   主要操作代码如下,使用了状态机,请注意看os_func_state==1的流程,这是系统在运行时的主要流程。

  其他模块主要包括界面显示,分数显示,方块显示和键盘输入等。考虑到和平台相关,因此不具备移植性,贴在下面仅供参考。

  1. 初始化界面绘图画布数组,主要是建立“围栏”

   2. 绘制方块和刷新界面

  本科一年级时候写过一个俄罗斯方块,代码冗长可读性极差,各种判断和奇怪的变量,最后还有一堆bug。 这套代码算是对当时愚蠢的我的补偿吧,其实写的也不怎么地。比如,画布大小必须是22*12么?为什么不可变?

  蛮想把我开发的这套系统拿出来给大家分享的,可惜自制硬件就是这样:给自己带来了快乐,给别人带来了开发和移植的麻烦。

  说多了,呵呵

  有任何问题,欢迎随时交流。

继续阅读