俄罗斯方块中的若干问题

vivicareer 2009-12-29 10:46:27
我想做个俄罗斯方块的游戏,与以往不同的是允许用户定制不同形状的俄罗斯方块,但是这其中存在如下的问题:
1、对于一个用户定制的方块,当方块变型时,其旋转的中心点如何计算?
2、在一个方块变型的过程中,如何判断其变型是否被允许?就是说当方块变型时周边是否会有其他的已经落下的块阻挡方块的变型.

对于第一个问题,本来想用俄罗斯方块的重心当作它的旋转中心,但是该重心一般为非整数值,如果取四舍五入之后的整值,对于像那种“一整条”的方块(即长方形的方块)经过两次变型后,其位置会变化而不能回到最初的位置形态。

对于第二个问题,最初的解决思路是判断一个俄罗斯方块在旋转过程中所经过的区域是否存在已经落下的块,如果有,就不允许变型,反之就允许。但是该区域并不好计算,因为旋转过程中,俄罗斯方块如果绕重心旋转,坐标值并非整数,而旋转后映射的坐标也并非整数,同时由于该映射的存在,变化前后的坐标值并非按简单的线性变化,所以变型后的定位不知道怎么解决

也不知道大家能不能看懂我说的这些,不过希望能和有兴趣的朋友一起探讨。
...全文
241 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
vivicareer 2010-01-01
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 icefairy 的回复:]
引用 6 楼 yuanbbsky 的回复:
前段时间看到别人这样做 每个方块 5*5的数组
比如:
0 0 0 0 0
0 0 0 0 0
0 0 1 0 0
0 0 1 0 0
0 1 1 1 0
构成了倒T方块 这个基本方块可以变换成 四种情况 1:旋转90度 2:旋转180度 3:旋转-90度 至于旋转的算法我记得离散数学里有学过
然后把外边的大箱子也设计成一个数组比如 :10*20 的数组 最开始每个值设置为0,当有方块落下 判断小方块的各个值在大方块里对应的值 如果碰到了2个都是1 表示有障碍了,。。。 其他的没怎么研究了 请高手指点


up这个方式不错
[/Quote]
如果只是实现几个预设的方块形状就不用这么麻烦了,我主要想实现方块的定制功能,就是能让用户在一定规则下自己定制不同形状的方块
vivicareer 2010-01-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yuyongbao 的回复:]
允许用户定制不同形状的俄罗斯方块,是什么意思呢,是说组成方块形状的四个小格子可以由用户选定图片,还是说方块的形状不只限于普通的那几种形状 .如果说每个单元小格子可以变的话,采取直接贴图的方式还是可以动态加载用户指定的图片的。
  至于旋转的中心点问题,看一些品牌手机等上自带的游戏,也并非旋转几次后可以还原。我觉得可以用一个数组保存每个基本形态下一次变形的位置
[/Quote]
想的用户定制的意思是对用户的权限越开放越好,在可以实现的基础上让用户能定制尽可能多的不同形状的方块,至于是否贴图这个实现起来与算法的关系不大吧
如果允许用户定制的话,我想确定一个旋转中心是必要的,因为如果没有旋转中心并且方块的形状也是未知的,那方块变型时就不好处理了。对于那种旋转一个轮回后不能还原的,我想看起来会比较奇怪吧,比如说只有一个方格的,如果连续变型两次后,方格会无故下移了一行.....
至于用数组保存变型后的下一次方块位置,这个只是个结果,我不知道怎么获得变型后的那些坐标值....
yuanbbsky 2009-12-31
  • 打赏
  • 举报
回复
前段时间看到别人这样做 每个方块 5*5的数组
比如:
0 0 0 0 0
0 0 0 0 0
0 0 1 0 0
0 0 1 0 0
0 1 1 1 0
构成了倒T方块 这个基本方块可以变换成 四种情况 1:旋转90度 2:旋转180度 3:旋转-90度 至于旋转的算法我记得离散数学里有学过
然后把外边的大箱子也设计成一个数组比如 :10*20 的数组 最开始每个值设置为0,当有方块落下 判断小方块的各个值在大方块里对应的值 如果碰到了2个都是1 表示有障碍了,。。。 其他的没怎么研究了 请高手指点
cdsnpeter 2009-12-31
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yuanbbsky 的回复:]
前段时间看到别人这样做 每个方块 5*5的数组
比如:
0 0 0 0 0
0 0 0 0 0
0 0 1 0 0
0 0 1 0 0
0 1 1 1 0
构成了倒T方块 这个基本方块可以变换成 四种情况 1:旋转90度 2:旋转180度 3:旋转-90度 至于旋转的算法我记得离散数学里有学过
然后把外边的大箱子也设计成一个数组比如 :10*20 的数组 最开始每个值设置为0,当有方块落下 判断小方块的各个值在大方块里对应的值 如果碰到了2个都是1 表示有障碍了,。。。 其他的没怎么研究了 请高手指点
[/Quote]

其实如果不怕浪费空间,每种变形后90度,180度,270度的,原始的,都可以这样存储。
定义一个Status变量,根据Status选择相应的数组变形即可。
icefairy 2009-12-31
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yuanbbsky 的回复:]
前段时间看到别人这样做 每个方块 5*5的数组
比如:
0 0 0 0 0
0 0 0 0 0
0 0 1 0 0
0 0 1 0 0
0 1 1 1 0
构成了倒T方块 这个基本方块可以变换成 四种情况 1:旋转90度 2:旋转180度 3:旋转-90度 至于旋转的算法我记得离散数学里有学过
然后把外边的大箱子也设计成一个数组比如 :10*20 的数组 最开始每个值设置为0,当有方块落下 判断小方块的各个值在大方块里对应的值 如果碰到了2个都是1 表示有障碍了,。。。 其他的没怎么研究了 请高手指点
[/Quote]

up这个方式不错
daredjever 2009-12-31
  • 打赏
  • 举报
回复
有意思,顶下
狗窝 2009-12-30
  • 打赏
  • 举报
回复
允许用户定制不同形状的俄罗斯方块,是什么意思呢,是说组成方块形状的四个小格子可以由用户选定图片,还是说方块的形状不只限于普通的那几种形状 .如果说每个单元小格子可以变的话,采取直接贴图的方式还是可以动态加载用户指定的图片的。
至于旋转的中心点问题,看一些品牌手机等上自带的游戏,也并非旋转几次后可以还原。我觉得可以用一个数组保存每个基本形态下一次变形的位置
shuilongyin_00 2009-12-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 shuilongyin_00 的回复:]
做方块的化,不需要麻烦到用旋转!直接用90 180 270的映射……
[/Quote]直接用90 180 270 360的映射……刚刚少了个360……汗!
shuilongyin_00 2009-12-30
  • 打赏
  • 举报
回复
做方块的化,不需要麻烦到用旋转!直接用90 180 270的映射……

判断有没重合点,最下一排是否与底下堆积的已经连接……

我的想象……高手纠正
aaaa3105563 2009-12-29
  • 打赏
  • 举报
回复
UP
winnuke 2009-12-29
  • 打赏
  • 举报
回复
我觉得还是比较难做的。

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧