魔方游戏 程序设计

河北大学数学系(071002)王佳星 夏利猛
设计一个魔方游戏程序首先要实现的是魔方每一层的旋转和魔方的转动,其中可以选择
的方法很多,本文介绍一种迅速有效而且算法简单的方法。

基本思想
魔方共有26块,其中6块位于每一面的中心位置,当魔方转动时它们是不动的;有8块位于
顶角位置,各有三个不同颜色的小面;剩余12块各有两个不同颜色的小面。根据这个特点,我
们规定魔方的前后面为A面,上下面为S面,左右面为D面。设置颜色值顺序:A>S>D。定义数组
a[6]存放6个中心小块的颜色,b[12]存放12个有两个小面的块的颜色,c[8]存放有三个小面的
块的颜色。a[i]的数值在0~15之间且各不相同;设b[i]所临的两个面:B1>B2,则b[i]的0~这
4个字节存放B2的值,4~7这4个字节存放B1的值;c[i]的0~3这4个字节存放D面的颜色值4~
7这4个字节存放S面的颜色值,8~11这4个字节存放A面的颜色值。

问题的提出

1.怎样实现魔方各个面的转动?

2.怎样实现魔方的旋转以使游戏者可以寻找每一小块的位置?

3.怎样检测魔方是否已经排成,即每一面的9小块颜色一致?

问题的解决

1、由于魔方共有6个面,因此只需编写6个转换的子函数。下面以其中两个为例说明这些
子函数的算法。
int m (int s)
{int d;d=((s&0xf)<<4|(s>>4);return d;}
int n (int s)
{int d;d=(s>>8)|((s&0xf)<<8)|(s&0xf0);return d;}
void c1 ()
{int t;
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(c[4]);c[4]=n(c[5]);
c[5]=n(c[1]);c[1]=n(t);
}
函数int m(int s)将s的0~3字节与4~7字节的值相交换,int n(ints)是将s的0~3字节
与8~11字节的值相交换。
函数c1()实现的是魔方上层的转动,因为魔方的上层转动时将c[i]的D面变成A面,将A面
变成D面,而S面仍是S面,所以要将参与转动的c(i)的0~3字节与8~11字节相交换,然后将每
一个c[i]的值循环交换;由于b[i]是将AS面变为SD面或将SD面变为AS面,因此要将参与转动的
每一个b[i]的0~3字节与4~7字节的值相交换,然后将每一个b[i]的值循环交换。这样就完
成了魔方上层的转动。
int l (int s)
{int d;
d=(s>>8<<4)+((s&0xf0)<<4)+(s&0xf);
return d;}
void c3 ()
{int t;
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);}
函数int l(int s)是将s的4~7字节与8~11字节相交换。
函数c3()实现的是魔方左层的转动。因为参与转动的每一个b[i]不是AD面就是SD面,因
此转动时只要将各b[i]的值循环交换即可。而每一个c[i]是ASD面和SAD面之间的变换,所以
先将各c[i]的4~7字节与8~11字节相交换,然后将各c[i]的值循环交换即可。这样就完成了
魔方的左层转动。
其它子函数的算法类似。

2.实现魔方向右和向上的旋转。向上旋转可先进行左层和右层向上转动,然后中间层
的a[i]和b[i]的值循环交换即可,程序如下:
void turn1 ()
{int t;c4();c3();
t=a[0];a[0]=a[4];a[4]=a[5];a[5]=a[2];a[2]=t;
t=b[0];b[0]=m(b[2]);b[2]=m(b[10]);
b[10]=m(b[8]);b[8]=m(t);}
向右旋转的方法类似。

3.检测魔方是否已排成,只需检测每一个b[i]的值是否与它相临的两个面的中心小块
a[j]和a[l]的值相符(设面J>L),即是否有b[i]==a[j]<<4+a[l];同时是否有每一个c[i=
=a[j]<<8+a[l]<<4+a[h](面J>L>H);如果对于所有的c[i]和b[i]都满足条件,则说明魔方已经
排完。

游戏过程
本程序运行后计算机自动将魔方打乱,然后由游戏者通过键盘来将魔方排成每九个小面
颜色一致。操作方法:‘↑’使魔方向上转动,‘→’使魔方向右转,由一个蓝色圆圈标志它
的上下、左右、前后六个层的位置,按空格键使层转动。A键和S键控制圆圈标志双向转换。
按Esc键可退出游戏。
编者注:本程序文件名为mofang.c,可执行文件为mfoang.exe,发表于本报的WWW站点上地
址是:http://www.computer world.com.cn/skill/skill.html,欢迎访问!

你可能感兴趣的:(游戏,C++,c,算法,C#)