满意答案

qwbku

2017.06.20

采纳率:52%    等级:9

已帮助:368人

俄罗斯方块实现下降速度使用编程技术:JAVA,C语言,C#。

俄罗斯方块

俄罗斯方块是款非常流行的小游戏,通过七个方块的旋转和位移,构成各种变幻莫测的图案。而游戏者也在不断的叠加和消除中找到乐趣。

从编程的角度来说,这个游戏混合了键盘事件,定时器,随机数,鼠标事件(如果没有菜单,这个也不是必需的),数据结构比较清晰,算法比较灵活,图形是比较简单的矩形,所以很适合刚学习完某种语言的语法又想做点什么的初学者。

本文使用的语言包括:c(Turboc2.0,VC6.0),JAVA(Applet),c#(.NET2003)

编写这个游戏的基本过程是:

首先,把这七个方块用一种数据结构存储起来

其次,在游戏中将这七个方块随机挑选出来并显示在屏幕上,根据键盘事件进行旋转

最后,判断到达底部的方块是简单叠加还是引发消除事件

另外,对这个游戏来说,还有一些记分和过关加速的规则,这些会穿插在上面的内容中讲述。

1存储和旋转七个方块

对于OOP语言(JAVA,C#)来讲,可以写一个数据结构类,处理本游戏中的全部数据。在界面中调用这个类,以实现界面操作与数据结构分离。在后面展示这两个数据结构类的时候,会发现除了语法外,这两个类是基本相同的(把C#的类改了改,再加上键盘操作就成Applet了)。

对于过程化语言(c)来说,界面显示函数与数据结构函数地位相当,所以在形式上稍微分分就行了。

1.1存储七个方块

普通俄罗斯方块游戏中,只有七个基本方块:|,Z,N,L,7,|-,O,如果加上旋转,一共是19种方块(要注意哦,最后一个正方形的方块不能旋转)。这19种方块都可以画在一个4*4的方格中。

于是就有两个方法:一个是只存储七个方块,在游戏运行的时候计算旋转后的方块形状;另一个是将19种方块全部存储起来,在游戏运行的时候计算取其中的哪个方块。

另外,考虑到4*4是16,而一个int正好是16位(TC2是16位,其他的是32位),所以可以把一个方块存储在一个int数据中,取出的时候,判断它的每个bit位,为1处有小方块,为0处是空白。

分别用二维数组和bit的方法来表示这19个方块:

int blocks_shape[19][16]={

0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,/*11*/

0,0,0,0,0,1,0,0,1,1,0,0,1,0,0,0,/*12*/

0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,/*21*/

0,0,0,0,1,0,0,0,1,1,0,0,0,1,0,0,/*22*/

0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,/*31*/

0,0,0,0,1,0,0,0,1,0,0,0,1,1,0,0,/*32*/

0,0,0,0,0,0,1,0,1,1,1,0,0,0,0,0,/*33*/

0,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,/*34*/

0,0,0,0,1,0,0,0,1,1,1,0,0,0,0,0,/*41*/

0,0,0,0,0,1,0,0,0,1,0,0,1,1,0,0,/*42*/

0,0,0,0,1,1,1,0,0,0,1,0,0,0,0,0,/*43*/

0,0,0,0,1,1,0,0,1,0,0,0,1,0,0,0,/*44*/

0,0,0,0,0,1,0,0,1,1,1,0,0,0,0,0,/*51*/

0,0,0,0,0,1,0,0,1,1,0,0,0,1,0,0,/*52*/

0,0,0,0,0,0,0,0,1,1,1,0,0,1,0,0,/*53*/

0,0,0,0,1,0,0,0,1,1,0,0,1,0,0,0,/*54*/

0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,/*61*/

0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,/*62*/

0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,/*71*/

};

注释里第一个数字表示方块编号,第二个数字表示该方块的第几个变形。

private int[] blocks_shape = {3168,1224,1728,2244,3712,2188,736,3140,2272,1100,3616,3208,1248,1220,228,2248,3840,17476,3264};

显然,第二种方法节约了一些内存。

1.2旋转七个方块

在游戏中计算旋转后的方块形状:

这个其实就是考考二维坐标知识。还是不贴图。先在脑袋里想像一个4*4的方格,上面有个|-。|占三个方格的长度,-占一个。以左下角为原点,从左向右画x轴;从下向上画y轴。如果在游戏中想逆时针旋转方块,就把这个坐标轴顺时针旋转一次。多想几遍得到结论:原来的x坐标与新的y坐标相同,原来的y坐标与新的x坐标方向正好相反。这里的“相反”意思是,原来是4,现在是1,原来是2,现在是3。语言不好表达啦,不过想通的话就很容易理解。

在游戏中计算调用19个方块中的哪个方块:

将19个方块存入数组后,再设一数组告诉程序哪七个下标是七个基本方块。比如:private int[] start_bricks = {0,2,4,8,12,16,18};每次随机产生的方块下标都为start_bricks里的元素。当游戏者旋转方块时,将当前方块下标加1,再判断加1后的下标是否在start_bricks里。如果在的话,说明已经是另一个形状了,舍掉,使用start_bricks里原来的下标。最后根据此下标在blocks_shape数组中取出形状,显示在屏幕上。

看看代码。

private int[] bricks = {3168,1224,1728,2244,3712,2188,736,3140,2272,1100,3616,3208,1248,1220,228,2248,3840,17476,3264};

private int[] start_bricks = {0,2,4,8,12,16,18};

/*mid是当前方块在bricks中的下标*/

for(i=0;i<7;i++)

{

if(mid+1==start_bricks[i])

/*如果mid加1后是start_bricks中的元素*/

/*则还是取start_bricks中原来的元素,即七个基本方块之一,不让它变形*/

mid=start_bricks[i-1];

}

2方块落下的处理

2.1判断方块已经到达底部或是否碰到墙壁

不论是用二维数组还是用bit的方法存储的方块,最终都需要遍历方块的16个小方块中为1的地方是否将会碰到障碍物。“将会”指的是方块如果向左,向右,向下移动后就会碰到障碍物;“障碍物”指的是左右下墙壁和底部已经落下未被消除的小方块。

比较困难的地方,就是把为1的地方转换为相应的坐标,用此坐标判断是否碰到了障碍物。用旋转的办法比较简单,根据旋转的方向转换一下坐标就可以了。如果采用存储19个方块的方法的话,直接看下程序:

用二维数组:

/*遍历16个小方块*/

for(j=0;j<16;j++)

{

/*此处有小方块,判断它是否碰到障碍物*/

if(blocks_shape[i][j]==1)

{

/*a,b是方块左上角坐标,aaa,bbb是新得到的小方块的坐标*/

aaa=a-1+j/4;

bbb=b+j%4;

if( ( aaa==h )||( aa[aaa][bbb]>0 )||( bbb<0 )||( bbb>9 ) )

/*aaa==h 表示该小块已经到达底部;aa[aaa][bbb]>0 表示底部该位置已经有了小方块*/

{

/*返回false,表示会碰到障碍物*/

return false;

}

}

}

用bit与此类似,只是多了一个移位处理:

for(int i=0;i<16;i++)

{

/*num是当前方块的int值,a,b是当前方块的左上角坐标*/

if( (num>>(15-i)1)!=0 )/*此位为1*/

{

if( (a+i/4>22)||(b+i%4<0)||(b+i%4>11) )/*取得新坐标并加以判断*/

{

flag=false;

break;

}

if( (arr[a+i/4][b+i%4]>0) )/*底部该位置是否有已经落下的小方块*/

{

flag=false;

break;

}

}

}

2.2消除一行

判断到方块落下后,就开始检查是否有满足消除条件的行了。

规则很简单:只要某行被小方块全部填充,该行就被消除,上面的小方块全部下移一行。所以,只要把原来的小方块全部擦去,计算完新方块位置后,再全部画出就可以了,计算的时候,可以遍历整个游戏区域,看有没有可以消除的行。但是在实际编程中就会发现,这样的设计虽然简单,但是计算量大,而且会引起闪烁(因为是整个擦除和重画),效果不是很好。仔细观察这个游戏,就会发现,其实每次消除的时候,只要判断当前方块所在的四行就足够了。在编程的时候,还可以为方块设一个最高高度h,每次刷新的时候,只刷新从h到当前方块底部的行。虽然这样有点烦琐,但是节约了计算时间,减少了重绘面积,效果还是挺明显的。

另外,一些关于这个游戏算法的介绍,有人建议把随机产生下一个方块的计算放在当前方块正在下落的时候,因为那时比较空闲。总之,只要用心去想,一定会写出代码紧凑,资源利用合理,界面舒适的游戏。

00分享举报

c语言设置方块颜色,对在c语言中经典俄罗斯方块游戏中怎么改变下落方块颜色...相关推荐

  1. 学习踩坑:在Vue项目中使用svg标签却无法改变图标的颜色

    在Vue项目中使用svg标签却无法改变图标的颜色 在学习 vue 实战项目的过程中,用到了 svg 模块,对其使用了 fill 属性后,图标的颜色却没有任何的改变,反复查看了视频,步骤是一模一样的,却 ...

  2. dellemc服务器中文语言设置,美版windows10系统设置中文语言的方法

    为了获得更好的体验,一些用户会去尝试新的Windows10泄漏版本,此时他们可能会遇到美(英语)版的Win10系统.那么,如果希望美版win10系统切换回中文语言该如何操作呢?下面,就随小编看看具体方 ...

  3. android 英文语言设置字体,修改安卓ROM默认语言方法

    修改安卓ROM默认语言方法 (2012-06-06 19:29:41) 标签: 安卓 默认语言 中文 手机博客 安卓Android手机的ROM目前主要有三大类: ①官方发布的正版: ②民间开发团队发布 ...

  4. [C语言]魔术师与3位数:在一种室内互动游戏中,魔术师要每位观众心里想一个3位数abc(a、b、c分别是百位、十位和个位数字),然后魔术师让观众心中记下acb、bac、bca、cab、cba五个数以及

    在一种室内互动游戏中,魔术师要每位观众心里想一个3位数abc(a.b.c分别是百位.十位和个位数字),然后魔术师让观众心中记下acb.bac.bca.cab.cba五个数以及这五个数的和值.只要观众说 ...

  5. Linux下通过设置PS1变量改变bash提示符颜色

    我们都知道bash中,可以通过PS1变量改变提示符的颜色.当命令输出较长时,往往不容易第一眼看到输出是从哪里开始的,通过改变改变PS1变量,可以更改bash提示符的颜色,这样在人群中多看了一眼,就能够 ...

  6. 计算机桌面成英文怎样变成中文版,怎样把电脑语言设置成英文

    现在国内绝大多数电脑都是中文系统,有些喜欢用英文交流的朋友希望将中文系统变成英文系统,但重装英文系统太麻烦,接下来是小编为大家收集的把电脑语言设置成英文方法,欢迎大家阅读. 怎样把电脑语言设置成英文一 ...

  7. Drupal 8 多语言设置

    Drupal 8多语言设置 1.启用 Drupal 8 多语言相关模块 通过导航"Manage > Extend"进入扩展管理页面(admin/modules),找到 Lan ...

  8. 如何在计算机上更改英语语言,电脑系统语言设置如何更改

    电脑的系统语言我们是可以随意设置的,具体设置方法怎么做呢?下面由学习啦小编为你整理了电脑系统语言设置如何更改的相关方法,希望对你有帮助! 电脑系统语言设置更改的方法 更改显示语言 1首先,点击&quo ...

  9. oracle支持几国语言,明白ORACLE的多国语言设置

    wlgyhnj(冷风0) 明白ORACLE的多国语言设置,ORACLE多国语言设置是为了支持世界范围的语言与字符集,一般对语言提示,货币形式,排序方式和CHAR,VARCHAR2,CLOB,LONG字 ...

最新文章

  1. 两步搞定Hyperledger主打区块链解决方案Fabric
  2. LiveVideoStackCon讲师热身分享 ( 九 ) —— 51Talk音视频技术思考及非典型挑战
  3. python最小二乘法拟合_Python 普通最小二乘法(OLS)进行多项式拟合
  4. 使用 .NET CLI 构建项目脚手架
  5. c语言选择排序_C语言——选择排序
  6. 移动端隐藏滚动条(最全面)
  7. WebForm页面间传值方法(转)
  8. matlab2c使用c++实现matlab函数系列教程-fft函数
  9. 怎样取消计算机中镜像,win7系统,如何删除之前创建的镜像文件。 (不是在系统保护里头删除还原点,我试过了)...
  10. 通过模板生成Excel表格——XLSTransformer
  11. win7计算机病毒制作教程,win7 64位旗舰版系统删除电脑病毒文件夹方法
  12. sql问题导致CPU使用率100%
  13. 手机--修改dns服务器地址,DNS怎么修改 电脑和手机设置DNS全攻略
  14. js 剩余时间,天,小时,分钟,秒
  15. vs的快捷键——注释/取消注释
  16. 纯前端语言编写音乐播放器
  17. 利用ENVI实现图像几何校正
  18. response的响应头,下载文件
  19. 交换机配置第七讲(不同vlan相互通信2)
  20. android 探针工具,探针营app下载-探针营 安卓版v1.0.0-PC6安卓网

热门文章

  1. 新西兰进口奶粉,漂洋而来入驻Newbuy商城!
  2. 微信网页开发(10)--扫一扫功能接口
  3. Python中的变长对象
  4. RabbitMQ-工作模型
  5. 神奇校车 = topsage
  6. 使用代理IP发送请求,出现502错误 java.io.IOException: Unable to tunnel through proxy. Proxy returns “HTTP/1.1 502
  7. Spring框架下集成Activiti 5.17.0的diagram-viewer
  8. proteus时钟电路仿真
  9. 网络地址和主机地址的区别---思考与延伸
  10. Mactype - 让 Windows 字体更漂亮