第一节 魔方的简单表示

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

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

  1. ''' <summary>
  2. ''' 表示一个指定阶的魔方
  3. ''' </summary>
  4. Public Class CubeClass
  5. ''' <summary>
  6. ''' 魔方阶数
  7. ''' </summary>
  8. Public CubeRank As Integer
  9. ''' <summary>
  10. ''' 魔方的六个表面
  11. ''' </summary>
  12. Public SurfaceArray(5) As CubeSurfaceClass
  13. End Class

复制代码

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

  1. ''' <summary>
  2. ''' 表示一个魔方的面
  3. ''' </summary>
  4. Public Class CubeSurfaceClass
  5. ''' <summary>
  6. ''' 魔方表层的块数据
  7. ''' </summary>
  8. Public BlockData(,) As CubeBlockClass
  9. End Class

复制代码

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

  1. ''' <summary>
  2. ''' 表示魔方面上的一个方块
  3. ''' </summary>
  4. Public Class CubeBlockClass
  5. ''' <summary>
  6. ''' 当前块的颜色
  7. ''' </summary>
  8. Public BlockColor As  Color
  9. Public x As Integer '所在列数
  10. Public y As Integer '所在行数
  11. 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添加如下定义:

  1. ''' <summary>
  2. ''' 当前表层的相邻表层(顶、底、左、右、前和后)
  3. ''' </summary>
  4. 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 魔方六面"上方"的方向

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

  1. Dim TempArray(,) As Integer = {{2, 3, 4, 5, 0, 1},
  2. {3, 2, 4, 5, 1, 0},
  3. {1, 0, 4, 5, 2, 3},
  4. {0, 1, 4, 5, 3, 2},
  5. {0, 1, 2, 3, 4, 5},
  6. {0, 1, 3, 2, 5, 4}} '空间相邻关系矩阵

复制代码

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

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

  1. ''' <summary>
  2. '''初始化各个表层间的空间相邻关系
  3. ''' </summary>
  4. Public Sub InitSurface()
  5. Dim TempArray(,) As Integer = {{2, 3, 4, 5, 0, 1},
  6. {3, 2, 4, 5, 1, 0},
  7. {1, 0, 4, 5, 2, 3},
  8. {0, 1, 4, 5, 3, 2},
  9. {0, 1, 2, 3, 4, 5},
  10. {0, 1, 3, 2, 5, 4}} '空间相邻关系矩阵
  11. For i = 0 To 5
  12. For j = 0 To 5
  13. SurfaceArray(i).NeibourSurface(j) = SurfaceArray(TempArray(i, j))
  14. Next
  15. Next
  16. End Sub

复制代码

第三节 魔方的初始化

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

  1. ''' <summary>
  2. ''' 新建一个指定阶的魔方
  3. ''' </summary>
  4. ''' <param name="nRank">指定的阶数</param>
  5. Public Sub New(ByVal nRank As Integer)
  6. Dim ColorArr() As Color = {Color.White, Color.Yellow, Color.Orange, Color.Red, Color.Green, Color.Blue}
  7. For i = 0 To 5
  8. SurfaceArray(i) = New CubeSurfaceClass(nRank, i, ColorArr(i))
  9. Next
  10. CubeRank = nRank
  11. InitSurface()
  12. End Sub

复制代码

魔方面(CubeSurfaceClass)的构造函数:

  1. ''' <summary>
  2. ''' 当前魔方的阶数
  3. ''' </summary>
  4. Public CubeRank As Integer
  5. ''' <summary>
  6. ''' 魔方表层的数据
  7. ''' </summary>
  8. Public BlockData(,) As CubeBlockClass
  9. ''' <summary>
  10. ''' 当前表层的相邻表层(顶、底、左、右、前和后)
  11. ''' </summary>
  12. Public NeibourSurface(5) As CubeSurfaceClass
  13. Public Index As Integer
  14. Public Sub New(nRank As Integer, nIndex As Integer, nColor As Color)
  15. ReDim BlockData(nRank - 1, nRank - 1)
  16. CubeRank = nRank
  17. Index = nIndex
  18. Dim rnd As New Random
  19. For i = 0 To nRank - 1
  20. For j = 0 To nRank - 1
  21. BlockData(i, j) = New CubeBlockClass(i, j)
  22. BlockData(i, j).ParentIndex = Index
  23. BlockData(i, j).BlockColor = nColor
  24. Next
  25. Next
  26. End Sub

复制代码

魔方块(CubeBlockClass)的构造函数:

  1. Public ParentIndex As Integer
  2. ''' <summary>
  3. ''' 当前块的颜色
  4. ''' </summary>
  5. Public BlockColor As Color
  6. Public x As Integer '所在列数
  7. Public y As Integer '所在行数
  8. Public Sub New(nX As Integer, nY As Integer)
  9. x = nX
  10. y = nY
  11. End Sub

复制代码

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

魔方游戏实现:任意阶魔方的表示相关推荐

  1. java魔方游戏代码_Java 3D魔方

    很强的JAVA 3D魔方游戏,这是源码及中文注释包,作者的开发文档和思绪都在里面,对学习很有帮助! Java 3D魔方游戏源码及中文注释包 (1 folders, 2 files, 1.38 KB, ...

  2. 任意阶魔方阵matlab程序,【精品】任意阶魔方阵算法(c语言)

    n阶幻方是由前n^2(n的2次方)个自然数组成的一个n阶方阵,其各行.各列及两条对角线所含的n个数的和相等.洛书就是最基本的3×3阶魔方阵,做出某种最恰当的决定,横竖都有3个格. 0的倒数 a-1可以 ...

  3. Python——简陋的n阶魔方模拟

    简介 终于整完了毕业论文,忙里偷闲半小时摸了个魔方模拟程序,支持模拟任意阶魔方,自动打乱,输入指令旋转.显示方面不会弄3D的,用opencv整了个展开图. 效果 五阶魔方打乱20步 震撼人心50阶,打 ...

  4. 魔方(4)二阶魔方、六阶魔方、七阶魔方

    目录 二阶魔方 1,二阶魔方与三阶魔方的关系 2,二阶魔方的定位 3,二阶魔方的盲拧 六阶魔方 七阶魔方 二阶魔方     1,二阶魔方与三阶魔方的关系 可以理解为,二阶魔方就是三阶魔方的八个角块. ...

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

    魔方又称幻方.纵横图.九宫图,最早记录于我国古代的洛书.据说夏禹治水时,河南洛阳附近的大河里浮出了一只乌龟,背上有一个很奇怪的图形,古人认为是一种祥瑞,预示着洪水将被夏禹王彻底制服.后人称之为&quo ...

  6. java 魔方_2 java实现4阶魔方,通过运行代码,鼠标进行旋转,可以模拟 游戏 Develop 246万源代码下载- www.pudn.com...

    开发工具: Java 文件大小: 3830 KB 上传时间: 2015-11-07 下载次数: 0 详细说明:java实现4阶魔方,通过运行代码,鼠标进行旋转,可以模拟魔方游戏-java achiev ...

  7. Android 3D 魔方游戏的设计与开发

    Android 3D 魔方游戏的设计与开发 5.1 Feature 定义 魔方是一个有趣的益智游戏,相信很多人都玩过.本次毕业设计,欲完成的主要的功能如下: (1) 开始游戏:开始一个新的游戏 (2) ...

  8. Matlab编程与数据类型 -- 奇数阶魔方矩阵的编程

    本微信图文详细介绍了利用Matlab实现奇数阶魔方矩阵的编程.

  9. NYOJ 734 奇数阶魔方

    奇数阶魔方 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 一个 n 阶方阵的元素是1,2,...,n^2,它的每行,每列和2条对角线上元素的和相等,这样的方阵叫魔方.n ...

最新文章

  1. 浅析Spring——控制反转IoC
  2. 译者招募 | 这本“顶级”微积分教材,中文版要来了!
  3. confluence6.15.4部署及问题汇总
  4. C/C++ 整型提升(Integral Promotion)
  5. java获取当前方法
  6. java 计算 日期_java 计算某日期 多少天后的日期
  7. 解决 vue 项目一直出现 sockjs-node/info?t=1554978**** ,并造成浏览器不能及时更新编码改动结果
  8. 【Zabbix】使用zabbix 3.4自带Mysql模板,监控Redhat 7.0上的Mysql
  9. Silverlight数据绑定之DataGrid
  10. 多核编程与单核多线程编程
  11. BZOJ4426 : [Nwerc2015]Better Productivity最大生产率
  12. WAR文件与具有嵌入式服务器的Java应用程序
  13. 【渝粤教育】电大中专幼儿园组织与管理 (10)作业 题库
  14. Linux常用脚本命令总结
  15. 找不到该项目,请确认该项目的位置的解决办法
  16. 传统IT正在被颠覆,下一个风口会是互联网+吗?
  17. 谷歌修复已遭在野利用的两个 0day
  18. js return加分号_JavaScript 语句后应该加分号么?
  19. 理解openssl协议:x509、crt、cer、key、csr、ssl、tls 这些都是什么鬼? 如何给自己网站颁发证书?
  20. spring boot整合elk

热门文章

  1. “达观杯”文本智能处理挑战赛,季军带你飞
  2. 如何把html转换成音频网址,怎么把视频转换成音频 视频转换成mp3
  3. matlab直流电机双闭环控制系统设计,基于MATLAB的直流电机双闭环调速系统设计毕业论文.doc...
  4. ae 创建图像等高线 蒙版_如何用AE创建简单的UI动效
  5. MySQL——在Linux下安装和卸载MySQL
  6. [SourceInsight].SI自动添加函数注释
  7. python链家网高并发异步爬虫and异步存入数据
  8. JZOJ100047.基因变异 (Standard IO)
  9. The Majesty Of Vue.js
  10. 解决EditText在ListView Item中,第一次点击无法获取焦点问题