对在c语言中经典c语言俄罗斯方块块游戏中怎么改变下落方块颜色

91611人阅读
C 系列(18)
用语言实现俄罗斯方块,需要先解决下面几个问题:
、如何用语言绘制图形界面
图形库即的图形库在下的移植。
先初始化图形窗口
为窗口的宽带,为窗口的高度。
清空绘图设备
设置画笔颜色
设置线条风格
还有画线、显示文字等函数,可以参照其帮助文档。
注意:由于我们用的是图形库,故源文件后缀要为,但其中内容都是的语法。
、如何存储表示出俄罗斯方块的形状
在计算机中如何让一串的数字,代表俄罗斯方块?
一、我们可以用编号,不同的编号代表不同的俄罗斯方块,根据编号把不同方块的画法写在代码中,这样种
方块就得有种相应的代码来描绘。而且这样扩展性不好,若以后设计了新的方块,则需要更改大量源代码。
二、我们很自然的想到可用字模点阵的形式来表示,即设置一个行列的数组,元素置即代表这个位置有小
方块,元素置即代表这个位置无小方块,这个整个的的数组组成俄罗斯方块的形状。
这个方法挺靠谱,但我们还可以优化一下:不用的数组,而是用个位来表示这个点阵。这样存储起来比较方便,故我们用的低位来表示方块的点阵。
我们可以用掩码与表示俄罗斯方块的位进行操作,来识别并在屏幕上画出方块。
详情见中的函数。
//逐位扫描由unsigned int的低2字节
//16个位组成的俄罗斯方块形状点阵(其代表4*4的方块形状)
mask = (unsigned int)1 && 15 ;
for (i=1; i&=16; i++)
//与掩码相与为1的 即为方块上的点
if ((rockArray[rockIndex].rockShapeBits & mask) != 0)
//在屏幕上画出此方块
rectangle(rockX+2,
rockX+ROCK_SQUARE_WIDTH-2,
rockY+ROCK_SQUARE_WIDTH-2) ;
//每4次 换行 转到下一行继续画
i%4 == 0 ? (rockY += ROCK_SQUARE_WIDTH, rockX = currentLocatePtr-&left)
rockX += ROCK_SQUARE_WIDTH ;
mask &&= 1 ;
我们把俄罗斯方块点阵的数位存在中,我们可以事先把这种方块的字模点阵自己转化成十六进制,然后在数组的初始化时赋值进去。
但这样做未免有点太费力,且扩展性也不太好,若以后设计的新方块种类加入,要改变数组中的值。
我们可以考虑把所有俄罗斯方块的点阵存储在配置文件中,在程序初始化时读取文件,把这些点阵转换成的变量存储在中。
这样,以后我们增添新的方块形状只需要在配置文件中增加新的点阵即可。
(为使得看起来更醒目,我们用表示,用表示)
、如何让图形动起来
若没有按键的情况下,方块是自动下落的。
如何实现自动下落?在某位置处用函数在屏幕上画出俄罗斯方块,然后再擦除掉即用背景色在原位置处重绘一次方块,最后在下落的下一个位置处用函数在屏幕上画出俄罗斯方块,如此循环,中间用计时器间隔一段时间以控制下落的速度。
同理,按下屏幕的左右键也是如此,只是在按下键盘时把方块的位置重新计算了。
那么按下上方向键时,如何让方块翻转呢?
我们在配置文件中就把方块的顺时针翻转形态放在了一起:
我们每按一次上方向键改变一次方块的形状即可。若一直按上键,形状应该是循环地翻滚。
我们想到了循环链表的数据结构可实现这个效果。
可是我们若把这些一种类的方块的各种形态串成循环链表形式,那么每次重新生成方块时我们就难以随机地生成方块了。
故还是得用数组来存储,但又要有循环链表的功能,于是我们想到了静态循环链表。
我们用结构体来作为一个方块在中的元素
用来表示方块的形状每一个字节是位,用每位表示方块中的一行
下一个方块,在数组中的下标
这样,当我们按下上方向键时,把传入函数中的变为当前方块结构体中的即可。
详情见中的函数。
、如何判断方块什么时候停止什么时候满行得分
方块一直下落,最终是要停下来的,我们要设置一个边界来约束方块的移动范围。我们把当前游戏界面划分成以俄罗斯方块中的小方格为单位的格子,用一个二维数组来表示这些小方格的状态,表示此位置有方块,表示此位置为空。
我们按照界面的大小和方格的大小来计算此二维数组时,再多设置一圈“围墙”,即多加两行两列,并把它们的值初始化为。
当方块准备下落或是左右移动的时候,前提前检查其即将落下的位置是否为空,若不为空,则停止下落,并把当前俄罗斯方块占用的方格都设置为。
详情见中的函数。
判断满行:
从最后一行开始往上检查,若有一行全为,则说明此行满行,将此行擦出,把此行上面的所有行向下移动一个单位。
详情见中的函数
、其他细节问题:
如何快速下落
详情见中的函数
详情见中的函数
此游戏程序的主要逻辑在中的函数
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:463341次
积分:4119
积分:4119
排名:第7054名
原创:68篇
评论:169条
阅读:87866
文章:13篇
阅读:37582
文章:15篇
阅读:161156c语言编写的俄罗斯方块小游戏_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
c语言编写的俄罗斯方块小游戏
上传于|0|0|文档简介
&&c语言编写的俄罗斯方块小游戏源码
调试 运行 通过
你可能喜欢14:20 提问
c语言设计俄罗斯方块判断能否下落问题
我会用字摸点阵的方法保存每个方块的形状,并且能用掩码的方式画出来,但很
难判断能否下落。
我判断能否左右移动的算法是:用掩码分别计算每一行最左或最右的方块位置,然后在最左边那则不能移动块旁边的中点取颜色,如果不是黑色则不能移动。
// 检查左边界
int Left(int x, int y, unsigned int binary_code)
int leftmost = 0;
// 最左端与x的的距离
int pix_in_line = 0;
// 标志一行是否有方块
int mask = 1;
// 设置掩码
for(i = 1; i&=16; i++, binary_code &&= 1)
if((mask & binary_code) == 1)
if(i%4 & leftmost)
leftmost = i%4;
if(i == 4)
leftmost = 4;
pix_in_line = 1;
if(i%4 == 0)
x += 4*LEN;
if(pix_in_line == 1)
if(getpixel(x - leftmost*LEN - LEN/2, y + LEN/2) != BLACK)
else if(x - leftmost*LEN == 0)
leftmost = 0;
pix_in_line = 0;
按这种方法判断下边界的要用两个for循环,很麻烦。网上的代码看上去没这么麻烦,但我看不懂,有哪位大神能提供下思路吗?谢谢!
按赞数排序
为什么不用a[m][n]数组表示位置(i,j)是否有方块 判断能否下落就是判断下落的方块(a[i1][j1], a[i2][j2], a[i3][j4],...)最下面的一个(j最大)的下面(j+1)是否有方块即可
其他相似问题HTTP/1.1 服务器太忙}

我要回帖

更多关于 俄罗斯方块下落算法 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信