看起来还行吧..
网上有很多版本的实现代码.但是看了几个都是用一个很大的数组记录这些下落的物体的形状.然后写一个很大的switch case来实现变形.感觉真麻烦.今天提出一个容易的实现方法.下面切入正题
思路是这样的:
一:随机生成物体
二:控制
1.变形
围绕一个方块向右旋转90度.以变形
2.左右下移动
1>物体左右移动的时候不要过界.
2>物体落定后.
(1).设定它落下的位置.
(2).看是否满了一行.满了一行消去
(3).看是否方块垒到顶了.到了game over
三:重复以上步骤
约定:
下落的会变形的那个小东东,我们叫 物体Object (--!!.大家忍受下这个名字.我是想不出其他的名字了.)
左侧那个 物体在里面移动的区域叫 游戏区域 Block
实现这个游戏的思路跟玩这个游戏一样简单...
1,随机生成一个物体.
2,响应键盘的输入,做左右下移动和变形
3,物体落到底部,判断是否满一行,物块垒满一行消除之.垒到顶部game over
但是实现起来貌似又不是那么简单了.
首先看起来随机生成一个不同形状的物体就是挑战
怎么在视图上画一个个的不同形状的物体呢?
我们看下这个游戏.每个物体都是由更小的方块组成.这些基本的小方块没有什么不同,
再看看这个二维的游戏界面,左边的游戏区域,一个个的小方块合在一起是否就是我们所熟悉的二维数组?
假如我们把这个游戏区域映射到一个二维数组,当这个数组元素有物体占据的时候就在上面涂颜色,没有则涂背景色.不就实现了么?.
好了可以定义游戏的区域的数据结构了.这个游戏中由于要画不同的颜色,因此数据结构可以如下定义:
那么画一个物体又该如何画呢?
假如我们先用数组定义好物体的形状,然后移动变化,那就太麻烦了.可以看到这些物体都是更小的方块组成的.(我们用四个小方块组成一个大的物体).用四个小方块,通过相对位置的不同可以变化成各种各样的不同形状.
我们最终是要在那个二维数组中画不同形状的物体.那么在画的时候就要直到当前的物体应该画到哪儿.假如我们对二维数组的每个元素再抽象出来一个数据结构.在这个数据结构中保存当前它在二维数组中的位置(行列值).那就容易多了.
这是一个小方格的定义,那每个物体要四个小方格,于是
由于我们要在画一个当前的下落的物体和一个下次将出现的物体.因此定义两个物体的对象
每个物体都是有边界的(把四个小方格全部盛下的最小矩形边界),我们把这个物体的四个小方块当前在block中的行列值,记录下来作为边界,放置在 tblr中.下面很多地方是用到这几个值的
我们规定每个小方块的实际大小是 (24*24)像素
那这个游戏区域实际上就是 height = 18*24 ,width = 10*24大小的矩形内(要注意数组的行列和矩形宽高的对应,col 对应的是width, row 对应的是height)
现在的问题是,你怎么知道具体应该在视图的哪个地方画这些小方块呢?
太简单了.我们可以由行列值(row,col)立即得到它在视图中所对应的矩形区域
CRect(col*PANE_WIDTH,row*PANE_WIDTH,(col+1)*PANE_WIDTH,(row+1)*PANE_WIDTH);
假如我们 要画一个 物体,物体的四个方块的行列值都知道的.比如是在二维数组中
(<0,0> <0,1> <1,0> <1,1>) 那
<0,0>对应的视图的坐标矩形是(0,0,24,24)
<0,1> -----(24,0,48,24)
....
自己那么对比几下就明白了.
可以写一个函数专门获取小方块对应的实际视图中的矩形区域(实际上,我们的游戏区域不是从视图的0,0开始画的,而是上和左都有空白,左边空白LEFT_MARGIN个像素,上边空白是TOP_MARGIN个像素,因此是以(LEFT_MARGIN,TOP_MARGIN)点处作为游戏区域的左上角 .方块的长和宽相等,定义为PANE_WIDTH = 24)
现在再绘制一个物体还难么???张飞吃豆芽.!
咦.郁闷了...吃豆芽的时候遇到点problem.....
需要绘制下一个将出现的物体.这个物体不是绘制在游戏区域内的.而是在游戏区域的右侧.
没关系.假如我们在游戏区域和这下个物体绘制的区域之间隔一个 方块的宽度.所有的问题都又解决了,原来的函数还照样可以用...
...继续吃豆芽
好了.万事具备了.下次讲如何生成不同形状的物体物体
编程群C,C++,MFC,Java 58698324.正招人.欢迎加入