魔方遊戲程式設計 (轉)

worldblog發表於2007-12-06
魔方遊戲程式設計 (轉)[@more@]設計一個魔方遊戲首先要實現的是魔方每一層的旋轉和魔方的轉動,其中可以選擇的方法很多,本文介紹一種迅速有效,而且演算法簡單的方法。

基本思想
魔方共有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]的03這4個位元組存放B2的值,4?7這4個位元組存放B1的值;c[i]的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[i]的D面變成A面,將A面變成D面,而S面仍是S面,所以要將參與轉動的c(i)的0?3位元組與8?11位元組相交換,然後將每一個ci[i]的值迴圈交換;由於[i]是將AS面變為SD面或將SD面變為AS面,因此要將參與轉動的每一個b[i]的0?3位元組與4?7位元組的值相交換,然後將每一個b[i]的值迴圈交換。這樣魔方上層的轉動就完成了。

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);}

函式intl(ints)是將s的4?7位元組與8?11位元組相交換。函式c3()實現的是魔方左層的轉動。因為參與轉動的每一個b[i]不是AD面就是SD面,因此轉動時只要將各b[i]的值迴圈交換即可。而每一個c[i]是ASD面和SAD面之間的變換,所以先將各c[i]的4?7位元組與8?11位元組相交換,然後將各c[i]的值迴圈交換即可。這樣魔方的左層轉動就完成了。其它子函式的演算法類似。

實現魔方向右和向上的旋轉。向上旋轉可先施行左層和右層向上轉動,然後中間層的a[i]和b[i]的值迴圈交換即可,程式如下:
voidturn1(){intt;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[2]);b[2]=b[10];b[10]=m(b[8]);b[8]=m(t);}

向右旋轉的方法類似。

檢測魔方是否已排成,只需檢測每一個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]都滿足條件,則說明魔方已經排完。
遊戲過程:
本程式執行後自動將魔方打亂,然後由遊戲者透過鍵盤來將魔方排成每九個小面的顏色一致。操作方法:'↑'使魔方向上轉動,'→'使魔方向右轉,由一個藍色圓圈標誌它的上下、左右、前後六個層的位置,按空格鍵使層轉動。A鍵和S鍵控制圓圈標誌雙向轉換。按Esc鍵可退出遊戲。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-988869/,如需轉載,請註明出處,否則將追究法律責任。

相關文章