.NET實(shí)現(xiàn)魔方游戲(一)之任意階魔方的表示
第一節(jié) 魔方的簡(jiǎn)單表示
對(duì)于任意N階的魔方均有六個(gè)面(Surface),每個(gè)面有N*N個(gè)方塊。在面向?qū)ο蟮某绦蛟O(shè)計(jì)里,我們可以把魔方(Cube)、魔方的面(Surface)和面的方塊(Block)均視作為對(duì)象。
魔方的定義:六個(gè)面存儲(chǔ)在一個(gè)數(shù)組
''' <summary> ''' 表示一個(gè)指定階的魔方 ''' </summary> Public Class CubeClass ''' <summary> ''' 魔方階數(shù) ''' </summary> Public CubeRank As Integer ''' <summary> ''' 魔方的六個(gè)表面 ''' </summary> Public SurfaceArray(5) As CubeSurfaceClass End Class
魔方的面定義:方塊存儲(chǔ)為N*N的二維數(shù)組
''' <summary> ''' 表示一個(gè)魔方的面 ''' </summary> Public Class CubeSurfaceClass ''' <summary> ''' 魔方表層的塊數(shù)據(jù) ''' </summary> Public BlockData(,) As CubeBlockClass End Class
魔方的塊定義:每個(gè)塊具有獨(dú)立的顏色
''' <summary> ''' 表示魔方面上的一個(gè)方塊 ''' </summary> Public Class CubeBlockClass ''' <summary> ''' 當(dāng)前塊的顏色 ''' </summary> Public BlockColor As Color Public x As Integer '所在列數(shù) Public y As Integer '所在行數(shù) End Class
上述,我們完成了魔方類的簡(jiǎn)單定義,并且確立了之間的從屬關(guān)系。這里有一點(diǎn)需要注意,方塊(BlockClass)是指魔方的單個(gè)顏色塊。
所以N階魔方應(yīng)有6*N*N個(gè)顏色塊,以三階魔方為例,它應(yīng)有54個(gè)顏色塊(BlockClass)。
--------------------------------------------------------------------------------
第二節(jié) 面之間的空間關(guān)系
魔方的六個(gè)面之間并非獨(dú)立的,而是存在一定的空間關(guān)系。前面在CubeClass中定義了SurfaceArray()表示魔方的六個(gè)面,現(xiàn)在索引0~5分別指示魔方的頂層,底層,左側(cè),右側(cè),前方,后方六個(gè)面。
SurfaceArray(0):頂層
SurfaceArray(1):底層
SurfaceArray(2):左側(cè)
SurfaceArray(3):右側(cè)
SurfaceArray(4):前方
SurfaceArray(5):后方
圖2.1 魔方六面的空間位置
由此確定了各個(gè)面的空間方位,給SurfaceClass添加如下定義:
''' <summary> ''' 當(dāng)前表層的相鄰表層(頂、底、左、右、前和后) ''' </summary>
Public NeibourSurface(5) As CubeSurfaceClass
NeibourSurface()的索引從0~5依次指示當(dāng)前面的頂、底、左、右、前和后。以圖2.1“右面”為例,它的NeibourSurface()
應(yīng)該為
NeibourSurface(0):頂層
NeibourSurface(1):底層
NeibourSurface(2):前方
NeibourSurface(3):后方
NeibourSurface(4):右側(cè),每一個(gè)面的“前”就是它自身
NeibourSurface(5):左側(cè)
但上述是默認(rèn)為"右面"的"上方"就是頂層。所以我們還需要
對(duì)每一個(gè)面的“上方”進(jìn)行嚴(yán)格的定義:
圖2.2 魔方六面的空間位置_平面展開
圖2.3 魔方六面"上方"的方向
由上,我們可以確定各面之間的空間關(guān)系:
Dim TempArray(,) As Integer = {{2, 3, 4, 5, 0, 1}, {3, 2, 4, 5, 1, 0}, {1, 0, 4, 5, 2, 3}, {0, 1, 4, 5, 3, 2}, {0, 1, 2, 3, 4, 5}, {0, 1, 3, 2, 5, 4}} '空間相鄰關(guān)系矩陣
該矩陣行數(shù)值指某個(gè)面在SurfaceArray()中的索引,列數(shù)表示這個(gè)面相鄰的面在SurfaceArray()的索引。前面提到每一個(gè)面的“前”就是它自身,矩陣的第五列從0依次到5。
在CubeClass類中添加如下方法,并在構(gòu)造函數(shù)中調(diào)用:
''' <summary> '''初始化各個(gè)表層間的空間相鄰關(guān)系 ''' </summary>
Public Sub InitSurface() Dim TempArray(,) As Integer = {{2, 3, 4, 5, 0, 1}, {3, 2, 4, 5, 1, 0}, {1, 0, 4, 5, 2, 3}, {0, 1, 4, 5, 3, 2}, {0, 1, 2, 3, 4, 5}, {0, 1, 3, 2, 5, 4}} '空間相鄰關(guān)系矩陣 For i = 0 To 5 For j = 0 To 5 SurfaceArray(i).NeibourSurface(j) = SurfaceArray(TempArray(i, j)) Next Next End Sub
--------------------------------------------------------------------------------
第三節(jié) 魔方的初始化
魔方(CubeClass)的構(gòu)造函數(shù):六面的顏色標(biāo)準(zhǔn):頂-白色,底-黃色,左-橙色,右-紅色,前-綠色,后-藍(lán)色
''' <summary> ''' 新建一個(gè)指定階的魔方 ''' </summary> ''' <param name="nRank">指定的階數(shù)</param> Public Sub New(ByVal nRank As Integer) Dim ColorArr() As Color = {Color.White, Color.Yellow, Color.Orange, Color.Red, Color.Green, Color.Blue} For i = 0 To 5 SurfaceArray(i) = New CubeSurfaceClass(nRank, i, ColorArr(i)) Next CubeRank = nRank InitSurface() End Sub
魔方面(CubeSurfaceClass)的構(gòu)造函數(shù):
''' <summary> ''' 當(dāng)前魔方的階數(shù) ''' </summary> Public CubeRank As Integer ''' <summary> ''' 魔方表層的數(shù)據(jù) ''' </summary> Public BlockData(,) As CubeBlockClass ''' <summary> ''' 當(dāng)前表層的相鄰表層(頂、底、左、右、前和后) ''' </summary> Public NeibourSurface(5) As CubeSurfaceClass Public Index As Integer Public Sub New(nRank As Integer, nIndex As Integer, nColor As Color) ReDim BlockData(nRank - 1, nRank - 1) CubeRank = nRank Index = nIndex Dim rnd As New Random For i = 0 To nRank - 1 For j = 0 To nRank - 1 BlockData(i, j) = New CubeBlockClass(i, j) BlockData(i, j).ParentIndex = Index BlockData(i, j).BlockColor = nColor Next Next End Sub
魔方塊(CubeBlockClass)的構(gòu)造函數(shù):
Public ParentIndex As Integer ''' <summary> ''' 當(dāng)前塊的顏色 ''' </summary> Public BlockColor As Color Public x As Integer '所在列數(shù) Public y As Integer '所在行數(shù) Public Sub New(nX As Integer, nY As Integer) x = nX y = nY End Sub
至此,一個(gè)任意階的魔方已可以被表示,并且在此基礎(chǔ)上將可以實(shí)現(xiàn)魔方的扭動(dòng)邏輯。
以上所述是針對(duì).NET實(shí)現(xiàn)魔方游戲(一)之任意階魔方的表示,希望對(duì)大家有所幫助。
相關(guān)文章
ASP.NET中用js取CheckBoxList中值的方法實(shí)例
用腳本取CheckBoxList中的值,并用"|"將其分開,之后將取到的值放入文本框,返回?cái)?shù)據(jù)庫做添加或者修改2013-07-07asp.net實(shí)現(xiàn)非常實(shí)用的自定義頁面基類(附源碼)
這篇文章主要介紹了asp.net實(shí)現(xiàn)非常實(shí)用的自定義頁面基類,包含日志處理、控件賦值、異常處理等功能,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-11-11ASP.NET怎么操作DataTable實(shí)例應(yīng)用
有機(jī)會(huì)在博客園的博問頻道上看到一個(gè)問題,《ASP.NET怎么操作DataTable》;需要的朋友可以參考下2012-11-11[Asp.Net MVC4]驗(yàn)證用戶登錄實(shí)現(xiàn)實(shí)例
這篇文章主要介紹了[Asp.Net MVC4]驗(yàn)證用戶登錄實(shí)現(xiàn)實(shí)例,這里整理了詳細(xì)的代碼,具有一定的參考價(jià)值,有需要的小伙伴可以參考下。2016-12-12Asp.Mvc?2.0用戶客戶端驗(yàn)證實(shí)例講解(3)
這篇文章主要介紹了Asp.Mvc?2.0實(shí)現(xiàn)客戶端驗(yàn)證功能,本文使用jquery.validate插件進(jìn)行驗(yàn)證,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2015-08-08asp.net性能優(yōu)化之使用Redis緩存(入門)
本文主要介紹了asp.net性能優(yōu)化之使用Redis緩存的相關(guān)知識(shí)。具有很好的參考價(jià)值,下面跟著小編一起來看下吧2017-03-03