魔方游戏实现(一):任意阶魔方的表示

 第一节 魔方的简单表示

  对于任意N阶的魔方均有六个面(Surface),每个面有N*N个方块。在面向对象的程序设计里,我们可以把魔方(Cube)、魔方的面(Surface)和面的方块(Block)均视作为对象。

  魔方的定义:六个面存储在一个数组

‘‘‘ <summary>
‘‘‘ 表示一个指定阶的魔方
‘‘‘ </summary>
Public Class CubeClass
    ‘‘‘ <summary>
    ‘‘‘ 魔方阶数
    ‘‘‘ </summary>
    Public CubeRank As Integer
    ‘‘‘ <summary>
    ‘‘‘ 魔方的六个表面
    ‘‘‘ </summary>
    Public SurfaceArray(5) As CubeSurfaceClass
End Class

  魔方的面定义:方块存储为N*N的二维数组

‘‘‘ <summary>
‘‘‘ 表示一个魔方的面
‘‘‘ </summary>
Public Class CubeSurfaceClass
    ‘‘‘ <summary>
    ‘‘‘ 魔方表层的块数据
    ‘‘‘ </summary>
    Public BlockData(,) As CubeBlockClass
End Class

  魔方的块定义:每个块具有独立的颜色

‘‘‘ <summary>
‘‘‘ 表示魔方面上的一个方块
‘‘‘ </summary>
Public Class CubeBlockClass
    ‘‘‘ <summary>
    ‘‘‘ 当前块的颜色
    ‘‘‘ </summary>
    Public BlockColor As  Color
    Public x As Integer ‘所在列数
    Public y As Integer ‘所在行数
End Class

  上述,我们完成了魔方类的简单定义,并且确立了之间的从属关系。这里有一点需要注意,方块(BlockClass)是指魔方的单个颜色块。

  所以N阶魔方应有6*N*N个颜色块,以三阶魔方为例,它应有54个颜色块(BlockClass)。



第二节 面之间的空间关系

  魔方的六个面之间并非独立的,而是存在一定的空间关系。前面在CubeClass中定义了SurfaceArray()表示魔方的六个面,现在索引0~5分别指示魔方的顶层,底层,左侧,右侧,前方,后方六个面。

  SurfaceArray(0):顶层

  SurfaceArray(1):底层

  SurfaceArray(2):左侧

  SurfaceArray(3):右侧

  SurfaceArray(4):前方

  SurfaceArray(5):后方

图2.1 魔方六面的空间位置

  由此确定了各个面的空间方位,给SurfaceClass添加如下定义:

    ‘‘‘ <summary>
    ‘‘‘ 当前表层的相邻表层(顶、底、左、右、前和后)
    ‘‘‘ </summary>
    Public NeibourSurface(5) As CubeSurfaceClass

  NeibourSurface()的索引从0~5依次指示当前面的顶、底、左、右、前和后。以图2.1“右面”为例,它的NeibourSurface()应该为

  NeibourSurface(0):顶层

  NeibourSurface(1):底层

  NeibourSurface(2):前方

  NeibourSurface(3):后方

  NeibourSurface(4):右侧,每一个面的“前”就是它自身

  NeibourSurface(5):左侧

  但上述是默认为"右面"的"上方"就是顶层。所以我们还需要对每一个面的“上方”进行严格的定义:

图2.2 魔方六面的空间位置_平面展开

图2.3 魔方六面"上方"的方向

  由上,我们可以确定各面之间的空间关系:

        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}} ‘空间相邻关系矩阵

  该矩阵行数值指某个面在SurfaceArray()中的索引,列数表示这个面相邻的面在SurfaceArray()的索引。前面提到每一个面的“前”就是它自身,矩阵的第五列从0依次到5。

  在CubeClass类中添加如下方法,并在构造函数中调用:

    ‘‘‘ <summary>
    ‘‘‘初始化各个表层间的空间相邻关系
    ‘‘‘ </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}} ‘空间相邻关系矩阵

        For i = 0 To 5
            For j = 0 To 5
                SurfaceArray(i).NeibourSurface(j) = SurfaceArray(TempArray(i, j))
            Next
        Next
    End Sub


第三节 魔方的初始化

  魔方(CubeClass)的构造函数:六面的颜色标准:顶-白色,底-黄色,左-橙色,右-红色,前-绿色,后-蓝色

    ‘‘‘ <summary>
    ‘‘‘ 新建一个指定阶的魔方
    ‘‘‘ </summary>
    ‘‘‘ <param name="nRank">指定的阶数</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)的构造函数:

    ‘‘‘ <summary>
    ‘‘‘ 当前魔方的阶数
    ‘‘‘ </summary>
    Public CubeRank As Integer
    ‘‘‘ <summary>
    ‘‘‘ 魔方表层的数据
    ‘‘‘ </summary>
    Public BlockData(,) As CubeBlockClass
    ‘‘‘ <summary>
    ‘‘‘ 当前表层的相邻表层(顶、底、左、右、前和后)
    ‘‘‘ </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)的构造函数:

    Public ParentIndex As Integer
    ‘‘‘ <summary>
    ‘‘‘ 当前块的颜色
    ‘‘‘ </summary>
    Public BlockColor As Color
    Public x As Integer ‘所在列数
    Public y As Integer ‘所在行数
    Public Sub New(nX As Integer, nY As Integer)
        x = nX
        y = nY
    End Sub

  至此,一个任意阶的魔方已可以被表示,并且在此基础上将可以实现魔方的扭动逻辑。



 资源分享中国石油大学(华东)公开课:魔方和数学建模(课程涉及的方法与上述不同,另一个思路供大家参考。)

时间: 2024-12-13 07:58:48

魔方游戏实现(一):任意阶魔方的表示的相关文章

任意阶魔方阵(幻方)的算法及C语言实现

写于2012.10: 本来这是谭浩强那本<C程序设计(第四版)>的一道课后习题,刚开始做得时候去网上找最优的算法,结果发现奇数和双偶数(4的倍数)的情况下算法都比较简单,但是单偶数(2的倍数但不是4的倍数)情况一直找不到明确的算法,就连百度百科对这一问题的解释也是“因非四的倍数作法相当复杂,在此只介绍四的倍数的作法”,而且连谭浩强那本书给的答案中竟然也变相的限定了n只能为奇数(题目并未说明).在广泛查找资料后,发现了一篇由中南大学信息科学与工程学院某教授和研究生撰写的论文,介绍了任意阶幻方的算

任意阶幻方(魔方矩阵)C语言实现

魔方又称幻方.纵横图.九宫图,最早记录于我国古代的洛书.据说夏禹治水时,河南洛阳附近的大河里浮出了一只乌龟,背上有一个很奇怪的图形,古人认为是一种祥瑞,预示着洪水将被夏禹王彻底制服.后人称之为"洛书"或"河图",又叫河洛图. 南宋数学家杨辉,在他著的<续古摘奇算法>里介绍了这种方法:只要将九个自然数按照从小到大的递增次序斜排,然后把上.下两数对调,左.右两数也对调:最后再把中部四数各向外面挺出,幻方就出现了. (摘自<趣味数学辞典>) 在西方

【C++小白成长撸】--(续)单偶数N阶魔方矩阵

1 /*程序的版权和版本声明部分: 2 **Copyright(c) 2016,电子科技大学本科生 3 **All rights reserved. 4 **文件名:单偶数N阶魔方矩阵 5 **程序作用:单偶数N阶魔方矩阵 6 **作者:Amoshen 7 **完成日期:2016.11.2 8 **版本号:V1.0 9 */ 10 #include<iostream> 11 12 using namespace std; 13 14 #define MAX_SIZE 100 15 16 int

结对作业-魔方游戏

结对成员:  姓名:王刚德     学号:201303011130                           姓名:徐文韬     学号:201303011161     我们的心得: 软件工程第二次作业的结对编程,我和我的队友万炼炼设计了一个基于unity3d的魔方游戏,通过在网上边学习边操作的方式,了解了unity3d游戏引擎的基本机制, 同时也深刻体会到要做出一个软件,团队合作的重要性.在这次结对编程中,我主要担任的是代码的编写,以及游戏逻辑的设计.万炼炼同学主要负责的是游戏资源

n阶魔方阵(奇数阵)的输出

需求 要求输出1~n2的自然数构成的魔方阵. STEP 1 什么是魔方阵? 魔方阵,古代又称"纵横图",是指组成元素为自然数1.2-n2的平方的n×n的方阵,其中每个元素值都不相等,且每行.每列以及主.副对角线上各n个元素之和都相等. STEP 2 魔方阵的规律是什么? 此处先写简单一点的奇阶魔方阵,偶数阶的算法更复杂,暂不讨论. 奇阶魔方阵的排列方法: ⑴将1放在第一行中间一列: ⑵从2开始直到n×n止各数依次按下列规则存放:每一个数存放的行比前一个数的行数减1,列数加1: ⑶如果上

Hdu 1998 奇数阶魔方

奇数阶魔方 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4629    Accepted Submission(s): 2622 Problem Description 一个 n 阶方阵的元素是1,2,...,n^2,它的每行,每列和2条对角线上元素的和相等,这样的方阵叫魔方.n为奇数时我们有1种构造方法,叫做"右上方" ,

奇数阶魔方 NYOJ 734

#include<stdio.h>//奇数阶魔方(734) int main() { int a[20][20],i,j,n,x,cnt; scanf("%d",&x); while(x--){ scanf("%d",&n); for(i=0;i<n;i++){ for(j=0;j<n;j++){ a[i][j]=0; } } a[0][n/2]=1; i=0;j=n/2; cnt=1; while(cnt<=n*n){

奇数阶魔方问题

问题: 一个 n 阶方阵的元素是1,2,...,n^2,它的每行,每列和2条对角线上元素的和相等,这样的方阵叫魔方.n为奇数时我们有1种构造方法,叫做“右上方” ,例如下面给出n=3,5,7时的魔方.38 1 63 5 74 9 2517 24 1 8 1523 5 7 14 164 6 13 20 2210 12 19 21 311 18 25 2 9730 39 48 1 10 19 2838 47 7 9 18 27 2946 6 8 17 26 35 375 14 16 25 34 36

算法:九宫格问题--奇数阶魔方(Magic-Square)

一.魔方介绍 魔方(这里是简称,也可以叫幻方.魔术矩阵,Magic Square)是 n×n 正方形网格(n 为每侧的单元数),里面每个单元格填充了不同的正整数 1, 2, 3, ... , n2,并且每一行.每一列和对角线中的正整数之和相等.每行.每列以及对角线上的单元格里的正整数之和又叫做魔术常数或魔方的魔术和. 幻方历史: <系辞>云:“河出图,洛出书,圣人则之.”在宋朝之前,洛书的记述只有文字. 九宫图实物最早发现于西汉,1977年中国考古学家在安徽阜阳县双古堆西汉古墓中发现汉文帝七年