当前位置:首页 » 操作系统 » 方块的算法

方块的算法

发布时间: 2022-09-08 09:59:39

㈠ 寻找关于俄罗斯方块程序的算法,不要程序,只要算法

核心算法:
这里把游戏的关键设计放在三个盒子和一个坐标上:
大盒子:一个两维数组,记录着方块点阵的开与关(把游戏的舞台想象
成一个点阵),在下面也把这个东西称为地图
两个5*5小盒子:两维数组,一个盛放着正在下落的方块,一个盛放在
下一个下落的方块(即next),当然这两个也必须想象成一个点阵:如长条
的点阵为:
00000
00100
00100
00100
00100
现在你只要有这么一个概念:一个不断定时下落的小盒子从大盒子顶
部下降到底部,之后再将next盒子放在下落盒子,再进行下一轮的下落...
中间的控制等尚不要太着急.
现在面临着一个问题:
下落的盒子和地图之间要怎么联系起来?
一个好的方法是再定义一个坐标:x,y,保存着小盒子左上角在地图上对应
的下标(位置),即当x = 0, y = 0时,小盒子处于地图的左上部.如此,当
小盒子需要移动时,即只须要改变x,y的值.
现在说说旋转.
小盒子保存着当前下落形状的点阵,那么旋转就只须要将这个点阵旋
转90度:例如:
00000 00000
00100 00000
00100 -> 01111
00100 00000
00100 00000
这一点实现起来还是不太难的.
判断碰撞
通常这种情况只须要在有移动小盒或旋转盒子时发生:也即点阵非空
是互斥的,当小盒要向下移(x++)时,如果小盒里的点阵与地图上的点阵(非
空的地方)重叠,则不能下移,(卡住了),旋转则转换后的形状与地图有冲
突则要放弃旋转.
到了这里,你应该有一个大概的了解了,至于怎样在屏幕上画出来,这
个是比较简单的

㈡ 俄罗斯方块游戏的 算法实现(或者设计原理)

这是个优化问题,目标函数是最终得分,变量是每个方块的得分,边界条件就是楼主所说的“同等条件”。

解决该问题,需要知道“同等条件”,即总的方块数以及每个方块的形状、出现顺序。知道了这些条件,即可以编程实现算法。

每个方块含有各自的状态,变换只需改变到下一个状态就行了,完全可以用数组来实现(不用写旋转算法了:)

比如:

/* 方块类型为 ■■■■ */
char[2][4][4] B1={{{0,1,0,0},{0,1,0,0},{0,1,0,0},{0,1,0,0}},
{{0,0,0,0},{1,1,1,1},{0,0,0,0},{0,0,0,0}}};
含两种状态,每个状态是一个4*4数组,为1表示实心,为0表示空心.
□■□□
□■□□
□■□□
□■□□

□□□□
■■■■
□□□□
□□□□

再详细的就不用说了吧

㈢ 做俄罗斯方块的思路或算法是什么

我用MFC做过俄罗斯方块:
整个场景是一个10*20的长方形空间,你要建立一个10*20的数组int num[20][10]模仿之,你可以想象这是200个小块,每个小块只有0和1两种状态,为0时相应该位置为空白,为1时相应该位置画一个小方块.

每一个图形由4个小方块组成,当他落到底停住时,你就要把数组num的相应数项由0改成1(num数组初始化全为0),同时在OnPaint(可能有时是OnDraw)函数中根据数组的0,1情况重绘,思路就是这样的.很简单

java俄罗斯方块旋转算法,求解

可以给每一个小方块设置为一个坐标,变为一个三阶行列式,3*3矩阵,转变为二元数组旋转。观察一下左旋:

11 12 13 31 21 11

21 22 23 →→ 32 22 12

31 32 33 33 23 13

坐标变换如下:(1,1)变为(1,3),(1,2)变为(2,3),(1,3)变为(3,3)

(2,1)变为(1,2),(2,2)变为(2,2),(2,3)变为(3,2)

(3,1)变为(1,1),(3,2)变为(2,1),(3,3)变为(3,1)

规律就是(i,j)变为(j,3-i+1):

如果是2*2的方格,就可以变为二阶行列式,也就是2*2的二元数组,这里给出3*3九宫格改变的示意,我的代码如下:


importjava.util.Random;

publicclassT{

publicstaticvoidmain(String[]args){

int[][]a=newint[3][3];
System.out.println("");
Randomr=newRandom();
for(inti=0;i<3;i++){
for(intj=0;j<3;j++){
a[i][j]=r.nextInt(10);
}
}
System.out.println("thearrayisshownasfollows:");
for(inti=0;i<3;i++){
for(intj=0;j<3;j++){
System.out.print(a[i][j]+"");
}
System.out.println();
}
System.out.println("左转九十度");
for(inti=0;i<a.length;i++){
for(intj=0;j<a[i].length;j++){
System.out.print(a[a[i].length-1-j][i]+"");
}
System.out.println();
}
}
}

㈤ C语言写俄罗斯方块旋转算法

问题描述不完整,给你我作业里德旋转函数好了,//...#define LONG_SIZE 15
#define WIDE_SIZE 10//...char img[LONG_SIZE][WIDE_SIZE]; /*定义游戏区方块移动范围*/
int x_[4],y_[4],x,y; /*存放移动方块在游戏区的位置序号和方块的坐标*///...void rotate() /*旋转*/
{
int tmx[4],tmy[4];
int tf=1;
int i;
int k;
if((x_[0]==x_[1])&&(x_[2]==x_[3])&&(y_[0]==y_[2])&&(y_[1]==y_[3])) /*排除"田"字形*/
return;
for(i=0;i<4;i++)
img[x_[i]][y_[i]]=0;
for(i=0;i<4;i++)
{ tmx[i]=x+(y_[i]-y);
tmy[i]=y-(x_[i]-x);
if(tmx[i]<0||tmx[i]>LONG_SIZE-1)
{
tf=0;
break;
}
if(tmy[i]<0||tmy[i]>WIDE_SIZE-1)
{
tf=0;
break;
}
if((tmx[i]==x_[i])||(tmy[i]==y_[i]))
{
if(tmx[i]==x_[i])
{ if(img[tmx[i]][tmy[i]]==1||img[tmx[i]][y]==1)
{
tf=0;
break;
}
}
else if(tmy[i]==y_[i])
{
if(img[tmx[i]][tmy[i]]==1||img[x][tmy[i]]==1)
{
tf=0;
break;
}
}
else continue;
}
if((tmx[i]<x_[i]&&tmy[i]>y_[i])||(tmx[i]>x_[i]&&tmy[i]<y_[i]))
k=1;
else k=0;
while(tmx[i]!=x_[i]||tmy[i]!=y_[i])
{ if(img[tmx[i]][tmy[i]]==1)
{
tf=0;
break;
}
if(k%2==0)
tmx[i]<x_[i]?tmx[i]++:tmx[i]--;
else
tmy[i]<y_[i]?tmy[i]++:tmy[i]--;
k++;
}
}
if(tf)
{
for(i=0;i<4;i++)
{
tmx[i]=x+(y_[i]-y);
tmy[i]=y-(x_[i]-x);
x_[i]=tmx[i];
y_[i]=tmy[i];
}
}
for(i=0;i<4;i++)
img[x_[i]][y_[i]]=1;
} 几个月前写的,可能因为之前的水平原因代码有点乱(现在懒的编),不过是可行的..

㈥ 俄罗斯方块算法 总共需要多少个矩阵

俄罗斯方块的算法很简单啊,286的机器运行都不会有速度问题,速度慢不是因为矩阵的原因,你看看你的算法是不是有问题啊?

㈦ 魔术方块 共有几种不同颜色 算法

首先你要明白每一个块(可以取下来的整体叫做块,比如那个有2个颜色的块叫做棱块,有3个颜色的块叫做角块)只有可能掉一个颜色,而魔方的配色是固定了,列:上白下黄,左红右橙,前蓝后绿;所以你可以利用这个定位轻松安好掉下来的色块;
魔方共有6个面,所以每一个块上不可能有相同的颜色,应为颜色的分布所以每一个块上也不可能有相对应的颜色分布,比如一个棱块(有2个颜色的块)的一面是白色,那么另一面一定不会是白色,也不可能是黄色;或者一个角块的一面是黄色,那么另外2面绝不会出现黄色和白色,而只有可能是红色蓝色,或者蓝色和橙色;只要秉着这个方法,把块安装上去很简单的;

如果那段字你看不懂的话,我就简单点说,首先把正中间的那个块取下来按照上面白色下面黄色,左边红色,右边橙色(都是想对的),前面蓝色后面绿的坐标安好,再安装别的楞角块时先观察没掉的颜色,通过这个颜色判断另一侧是什么颜色。判断的原则就是颜色一样的绝对不会在一起,颜色相对的也绝对不会在一起

㈧ 俄罗斯方块的算法

看看对你有帮助吗:

http://www.4oa.com/Article/html/6/31/445/2005/15278.html

㈨ 哪位大神给我讲解一下俄罗斯方块的算法C语言

首先你得有个俄罗斯方块界面的概念,它就是M*N的一个2维数组,那么一个方块向左移动的极限就是有一个点已经到了最左边。
拿一个竖条为例,他本身是一个4*4的小格子,当他是竖条时可以看成
0010
0010
0010
0010
向左移动时,只要判断1是否在左边边界,没有就往左一格,另外要注意边横杆时,要先判断是否最左边越界,有越界就不能变化

㈩ 求方块魔方的公式

最简单的四阶还原时以3阶为基础的,具体来说,就是把杂乱的四阶魔方,变成一个3阶,然后排出几种特殊情况,就可以按照3阶来还原了,这种事比较简单了,如果你会3阶,理解一下4阶的公式,基本就可以还原四阶了。四阶的公式很少,大概有5个左右。但是前提是你会3阶。 建议先去玩三阶啦,我觉得最有魅力的就是3阶了,百玩不厌。 【三阶魔方公式】 三阶魔方一共有二十六块,分为三个部分。六个中心块,这是不动的。八只角和十二条棱。 常用的方法一般有三种,分层法,角先法和棱先法。不过我认为还是棱先法比较简单和实用的。 还原棱就是在每一个面上都拼出个十字,拼十字时不是按面来的,而是按层来的。 先还第一层的,也就是在第一面上拼出个十字。这个很简单,不过拼出来的十字一定要正确也就是十字的那四条棱侧而的颜色一定要跟前后左右中心块的颜色一致。 对了。忘了跟你说方向的定位了。朝上的称为上,右手边的为右,左手边的为左之类的,这在以后的公式里是能用的上的。 第一面好了之后。现在还原第二层,这也很简单的。公式也就是前+下+前- 前+下-前- 一类的很简单的,还原这后,前后左右四面会出现四个倒着的T。 现在该把魔方倒过来了,也就是把下层变为上层。这时如果够幸运的话,底下的一层也已经好了。 如果没有的话。现在就真的要用上公式了。 拼十字公式 公式1 右-上-前-上+前+右+ 公式2 右-前-上-前+上+右+ 用这两个公式时。用1分拼出两个相对的棱,这时需要有2了。把魔方的上层看作一个时钟把它的两条已经转到上方的棱看作时针和分针,应该放在六点整的们置上。这样才能用公式2当用2时会拼出相邻的两条棱,再用公式1时,就要把魔方放在九点整的位置上,这时拼出的十字位置不一定对。有可能对一个,出有可能对两个。也可能一个也不对,因为上层可以自由转动。这时就要换公式了。在用公式的时候要把十字放在只有一条棱对的时候。也就是其它三个都不对时转十字公式 公式1 右-上-右+上-右-上2 公式2 左+上+左-上+左+上2 用公式1会把那三个错们的棱按顺时针挪动一个位置。公式2则为逆完成之后。六面的十字就已经拼好了,现在要把角复原过来 转角公式 公式1上+右+上-左-上+右-上-左+ 公式2上-左-上+右+上-左+上+右- 用法,用公式1是为了要把左前 左后 右后这三个角按逆时针挪动一个位置,但主要还是要把左后角转到左前公式2是为了把右前 右后 左后这三个角顺时针挪一下位置。但主要是为了把右后转到右前用1时会把右后角挪动。如果这时这个角已经复原过了。只要把右手边的旋转一下就行了。用2则会把左后角打乱处理方法和1的原理一样。 当还原了五只角时。这时剩下的三只角就可以一次转过来了,不过说起来容易做起来难。对于新手来说,还是再还原一只角吧,这时会出现几种情况,第一种,相邻的两只角 位置不对。把那两只错乱的角放在左前角和左后角这两个位置,这时你会发现两只角会出现有两只颜色一样的在同一面。应该把那颜色一样的面朝上,你还会发现这各颜色和左面的颜色是一致的。也就是直接可以翻转到左边。 先用公式1 之后。再后+。再把魔方整体顺时翻转九十度,是整体啊。不是一面。再用公式2。 如果你完成了上述步骤的话。恭喜你。完工了。 第二种情况。剩下相对的两只角,这时只要把两只角转到相邻的位置,就会变成了第一种情况了。 当然了,还会出现一种情况。就是魔方的两只对角,不是一个面的,是对整个魔方来说的。处理方法和上面的一样。

热点内容
app什么情况下找不到服务器 发布:2025-05-12 15:46:25 浏览:713
php跳过if 发布:2025-05-12 15:34:29 浏览:466
不定时算法 发布:2025-05-12 15:30:16 浏览:130
c语言延时1ms程序 发布:2025-05-12 15:01:30 浏览:164
动物园灵长类动物配置什么植物 发布:2025-05-12 14:49:59 浏览:732
wifi密码设置什么好 发布:2025-05-12 14:49:17 浏览:147
三位数乘两位数速算法 发布:2025-05-12 13:05:48 浏览:396
暴风影音缓存在哪里 发布:2025-05-12 12:42:03 浏览:539
access数据库exe 发布:2025-05-12 12:39:04 浏览:627
五开的配置是什么 发布:2025-05-12 12:36:37 浏览:363