MFC俄罗斯方块

MFC俄罗斯方块

获得picedit句柄在上面画图形,但是使用定时器实现下落的时候,出现下落前的方块不会消失,于是采用invalidate(true)将背景清除重绘,这个能够实现下落,但是出现对话框闪动。——-待解决

写着写着发现又写到坑里去了,尴尬。我现在的俄罗斯方块分为两个部分,一部分是已经堆积的方块部分,另一部分是下落方块部分。而整个游戏的方块都是放在一个m*n的picedit中的,这个picedit被我分成了GAME_HEIGHT*GAME_WIDTH个小方块,这个小方块的数据被我存在一个二维数组中,数组值为1则是有小方块的,数组值为0则是没有小方块的。俄罗斯方块就实现上来说就是一个变形,左移右移和quicklydown。在变形,左移右移和quicklydown之前我们需要判断是否可以进行这些操作。由于我是把变形放在最后写的,所以就找到挖坑的好机会了。首先我用一个坐标position(x,y)来定位下落方块的位置,以此来绘制下落的方块,并且左移右移的时候会非常的方便,直接修改position就好了,这个实现是没有毛病的。关键是判断是否能够移动的时候,我是用下落方块的边界旁边是否有其他的方块来判断是否能够移动,这样想想其实是非常自然的思考方式,虽然有几种图形你就要写集中判断情况(贼**蠢)。没有涉及到变形功能之前一切都是美滋滋的,想想都觉得甜。

代码如下,自己都觉得可爱:


switch(i){

case 1:if(grid_x==0||grid[grid_y][grid_x-1]==1||grid[grid_y+1][grid_x-1]==1) return 0;break;

case 2:if(grid_x==0||grid[grid_y][grid_x-1]==1) return 0;break;

case 3:if(grid_x==0||grid[grid_y][grid_x-1]==1||grid[grid_y+1][grid_x-1]==1||grid[grid_y+2][grid_x-1]==1||grid[grid_y+3][grid_x-1]==1) return 0;break;

case 4:if(grid_x==0||grid[grid_y][grid_x-1]==1||grid[grid_y+1][grid_x]==1||grid[grid_y+2][grid_x]==1) return 0;break;

case 5:if(grid_x==0||grid[grid_y][grid_x-1]==1||grid[grid_y+1][grid_x-1]==1||grid[grid_y+2][grid_x-1]==1) return 0;break;

case 6:if(grid_x==0||grid[grid_y][grid_x-1]==1||grid[grid_y+1][grid_x-1]==1||grid[grid_y+2][grid_x]==1) return 0;break;

case 7:if(grid_x==0||grid[grid_y][grid_x]==1||grid[grid_y+1][grid_x-1]==1||grid[grid_y+2][grid_x-1]==1) return 0;break;

}

终于写变形了,发现平白无辜的多出这么多的图形不可能每个图形都去判断他是否能够移动,这样太蠢了。然后看了下别人的源码,发现了一个新的方法:通过判断变形前后界面中小方块的数量来判断是否能够移动。这个方法非常的秒,他能够在不判断图形的形状的情况下对下落图形进行判断是否能够移动或者变形。

发表评论

电子邮件地址不会被公开。 必填项已用*标注