魔方游戏程序设计
[ 录入者:admin |时间:2006-04-18 09:53:29 | 作者:未知 | 来源:未知 | 点击数:659 ]
[上一篇] [下一篇]
设计一个魔方游戏程序首先要实现的是魔方每一层的旋转和魔方的转动,其中可以选择的方法很多,本
文介绍一种迅速有效,而且算法简单的方法。
基本思想
魔方共有 26 块,其中 6 块位于每一面的中心位置,当魔方转动时它们是不动的;有 8 块位于顶角位
置,各有三个不同颜色的小面;剩余 12 块各有二个不同颜色的小面。根据这个特点,我们规定魔方的
前后面为 A 面,上下面为 S 面,左右面为 D 面。设置颜色值顺序:A>S>D。定义数组 a[6]存放 6 个
中心小块的颜色,b[12]存放 12 个有两个小面的块的颜色,c[8]存放有三个小面的块的颜色,a
的数值
在
0 15
之间且各不相同;设
b
所临的两个面:
B1
>
B2
,则
b
的
03
这
4
个字节存放
B2
的值,
4 7
这
4
个字节存放
B1
的值;
c
的
0 3
这
4
个字节存放
D
面的颜色值,
4 7
这
4
个字节存放
S
面的颜色
值,
8 11
这
4
个字节存放
A
面的颜色值。
问题的提出
怎样实现魔方各个面的转动
?
怎样实现魔方的旋转以使游戏者可以寻找每一小块的位置
?
怎样检测魔方是否已经排成,即每一面的
9
小块颜色一致
?
问题的解决
由于魔方共有
6
个面,因此只需编写
6
个转换的子函数。下面以其中两个为例说明这些子函数的算法:
intm(ints){intd;d=((s&Oxf)
|
(s
>>
4);returnd;}
intn(ints){intd;d=(s
>>
8)
|
(s&Oxf)
<<
8)
|
(s&OxfO);returnd;}
voidc1(){intt;
t=b[0];b[0]=m(b[4]);b[4]=m(b[8]);b[8]=m(b[5]);b[5]=m(t);
t=c[0];c[0]=n(b[4]);b[4]=n(b[5]);c[5]=n(c[1]);c[1]=n(t);
函数
intm(ints)
将
s
的
0 3
字节与
4 7
字节的值相交换,
intn(ints)
将
s
的
0 3
字节与
8 11
字节的值相
交换。
函数
c1()
实现的是魔方上层的转动,因为魔方的上层转换时将
c
的
D
面变成
A
面,将
A
面变成
D
面,
而
S
面仍是
S
面,所以要将参与转动的
c(i)
的
0 3
字节与
8 11
字节相交换,然后将每一个
ci
的值循环
交换;由于是将
AS
面变为
SD
面或将
SD
面变为
AS
面,因此要将参与转动的每一个
b
的
0 3
字节与
4 7
字节的值相交换,然后将每一个
b
的值循环交换。这样魔方上层的转动就完成了。
int1(ints){intd;d=(s
>>
8
<<
4)+((s&OxfO)
<<
4)+(s&Oxf);returnd;}
voidc3(){intt;
t=b[3];b[3]=b[7];b[7]=b[11];b[11]=b[4];b[4]=t;
t=c[0];c[0]=l(c[3]);c[3]=l(c[7]);c[7]=l(c[4]);c[4]=l(t);}
评论0
最新资源