简介

终于整完了毕业论文,忙里偷闲半小时摸了个魔方模拟程序,支持模拟任意阶魔方,自动打乱,输入指令旋转。显示方面不会弄3D的,用opencv整了个展开图。

效果

五阶魔方打乱20步

震撼人心50阶,打乱100步

代码

import cv2
import numpy as np
from random import randintclass Cube:def __init__(self, order=3, size=50):  # 魔方阶数、显示尺寸self.img = np.zeros((4 * size * order, 3 * size * order, 3), dtype=np.uint8)self.order = orderself.size = sizeself.len = size * orderself.top = [['y'] * order for _ in range(order)]self.front = [['r'] * order for _ in range(order)]self.left = [['b'] * order for _ in range(order)]self.right = [['g'] * order for _ in range(order)]self.back = [['o'] * order for _ in range(order)]self.bottom = [['w'] * order for _ in range(order)]self.axis_rotate = (self.base_rotate_x, self.base_rotate_y, self.base_rotate_z)self.color = {'y': (0, 255, 255), 'r': (0, 0, 255), 'b': (255, 0, 0),'g': (0, 255, 0), 'o': (0, 128, 255), 'w': (255, 255, 255)}def check(self):  # 检测魔方是否还原for i in range(self.order):for j in range(self.order):if self.top[i][j] != self.top[0][0]:return Falseif self.back[i][j] != self.back[0][0]:return Falseif self.front[i][j] != self.front[0][0]:return Falseif self.left[i][j] != self.left[0][0]:return Falseif self.right[i][j] != self.right[0][0]:return Falseif self.bottom[i][j] != self.bottom[0][0]:return Falsereturn Truedef show(self, wait=0):  # 显示魔方展开图for i in range(self.order):for j in range(self.order):# backx, y = self.len + i * self.size, j * self.sizecv2.rectangle(self.img, (x, y), (x + self.size, y + self.size), self.color[self.back[j][i]], -1)cv2.rectangle(self.img, (x, y), (x + self.size, y + self.size), (10, 10, 10), 1)# leftx, y = i * self.size, self.len + j * self.sizecv2.rectangle(self.img, (x, y), (x + self.size, y + self.size), self.color[self.left[j][i]], -1)cv2.rectangle(self.img, (x, y), (x + self.size, y + self.size), (10, 10, 10), 1)# topx, y = self.len + i * self.size, self.len + j * self.sizecv2.rectangle(self.img, (x, y), (x + self.size, y + self.size), self.color[self.top[j][i]], -1)cv2.rectangle(self.img, (x, y), (x + self.size, y + self.size), (10, 10, 10), 1)# rightx, y = 2 * self.len + i * self.size, self.len + j * self.sizecv2.rectangle(self.img, (x, y), (x + self.size, y + self.size), self.color[self.right[j][i]], -1)cv2.rectangle(self.img, (x, y), (x + self.size, y + self.size), (10, 10, 10), 1)# frontx, y = self.len + i * self.size, 2 * self.len + j * self.sizecv2.rectangle(self.img, (x, y), (x + self.size, y + self.size), self.color[self.front[j][i]], -1)cv2.rectangle(self.img, (x, y), (x + self.size, y + self.size), (10, 10, 10), 1)# bottomx, y = self.len + i * self.size, 3 * self.len + j * self.sizecv2.rectangle(self.img, (x, y), (x + self.size, y + self.size), self.color[self.bottom[j][i]], -1)cv2.rectangle(self.img, (x, y), (x + self.size, y + self.size), (10, 10, 10), 1)cv2.imshow('cube', self.img)cv2.waitKey(wait)def shuffle(self, times):  # 打乱魔方for _ in range(times):self.rotate(randint(0, 2), randint(0, self.order - 1), randint(0, 3))def rotate(self, axis, index, times):  # 旋转魔方:axis轴,第index层,逆时针times次for _ in range(times):self.axis_rotate[axis](index)def count(self, color='y'):count = 0for i in range(self.order):for j in range(self.order):if self.top[i][j] == color:count += 1return count@staticmethoddef _column_trans(surface, index, col):for i, r in enumerate(surface):r[index] = col[i]def base_rotate_x(self, index):if index == 0:self.left = [list(c) for c in zip(*self.left)][::-1]elif index == self.order - 1:self.right = [list(c)[::-1] for c in zip(*self.right)]temp = [r[index] for r in self.top]self._column_trans(self.top, index, [r[index] for r in self.front])self._column_trans(self.front, index, [r[index] for r in self.bottom])self._column_trans(self.bottom, index, [r[index] for r in self.back])self._column_trans(self.back, index, temp)def base_rotate_y(self, index):if index == 0:self.back = [list(c)[::-1] for c in zip(*self.back)]elif index == self.order - 1:self.front = [list(c) for c in zip(*self.front)][::-1]temp = self.left[index][::-1]self.left[index] = self.top[index]self.top[index] = self.right[index]self.right[index] = self.bottom[self.order - index - 1][::-1]self.bottom[self.order - index - 1] = tempdef base_rotate_z(self, index):if index == 0:self.top = [list(c) for c in zip(*self.top)][::-1]elif index == self.order - 1:self.bottom = [list(c)[::-1] for c in zip(*self.bottom)]temp = self.front[index][::-1]self.front[index] = [r[self.order - index - 1] for r in self.left]self._column_trans(self.left, self.order - index - 1, self.back[self.order - index - 1][::-1])self.back[self.order - index - 1] = [r[index] for r in self.right]self._column_trans(self.right, index, temp)cube = Cube(3, 50)
cube.shuffle(100)
while True:cube.show(1)cube.rotate(*(int(c) for c in input('axis,index,times:').split()))if cube.check():break
print('Congratulations')
cube.show(0)

Python——简陋的n阶魔方模拟相关推荐

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

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

  2. Python培训分享:python如何用cookie实现自动模拟登录?

    本期教程Python培训教程为大家带来的是python如何用cookie实现自动模拟登录?据小编的了解,python实现cookie自动登录,目前来说有许多第三方库都可以直接使用,这里以常用的requ ...

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

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

  4. python中的高阶函数

    python中的高阶函数 文章目录: 1 什么是高阶函数? 1.1 高阶函数:一个函数的`函数名`作为参数传给另外一个函数 1.2 高阶函数:一个函数返回值(return)为另外一个`函数` 2 py ...

  5. NYOJ 734 奇数阶魔方

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

  6. 魔方游戏实现:任意阶魔方的表示

    第一节 魔方的简单表示 对于任意N阶的魔方均有六个面(Surface),每个面有N*N个方块.在面向对象的程序设计里,我们可以把魔方(Cube).魔方的面(Surface)和面的方块(Block)均视 ...

  7. Python中的高阶变量

    Python中的高阶变量 文章目录 Python中的高阶变量 变量进阶 01. 变量的引用 1.1 引用的概念 1.3 函数的参数和返回值的传递 02. 可变和不可变类型 哈希 `(hash)` 03 ...

  8. python核心,内建函数,高阶函数

    晨测 global和nonlocal区别 写一个递归的阶乘 回顾 1.global和nonlocal 关键字 2.函数的递归 1.查找规律 2.设置退出条件 3.性能 3.闭包 外函数中定义一个内函数 ...

  9. 杭电1998 奇数阶魔方

    奇数阶魔方 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

最新文章

  1. 【Java】Linux下安装配置Oracle JDK 1.7版本
  2. JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解 | 必须收藏!
  3. BZOJ1457 棋盘游戏
  4. pdf拼版插件_pdf文件中的文字批量转曲的办法
  5. Winforn中DevExpress的TreeList中显示某路径下的所有目录和文件(附源码下载)
  6. JAVA POI 应用系列(2)--读取Excel
  7. after markup mount - how is converted source code got executed
  8. 常见的无线传感器数据采集传输系统的三种组网
  9. JavaWeb 命名规则
  10. 双向链表(带头结点)
  11. 1026. 程序运行时间(15)
  12. 自动填写html文本框的值,网页自动填表——文本输入框及多行文本输入框
  13. maven依赖冲突解决_Maven依赖树–解决冲突
  14. 从零基础入门Tensorflow2.0 ----四、17.生成tfrecords文件
  15. 通过ln链接目录到目标
  16. MySQL Buffer Pool缓冲池总结
  17. vim插件介绍(一)之Tabular
  18. 使用DevCpp/DevC++调试的设置和步骤
  19. word参考文献后面的附录在目录显示不出来如何解决
  20. 微信小程序开发之视频上传

热门文章

  1. 动态时间规整算法: 从DTW到FastDTW
  2. 《probabilistic robotics》学习笔记——卡尔曼滤波
  3. B.TMT Document (思维分析)
  4. opecv BGR转NV21
  5. **Maven web项目报错**-web.xml is missing and <failOnMissingWebXml> is set to true 原因:生成的maven web项目webap
  6. 亚马逊开店优势是什么?
  7. 关于大数定律的讨论(转)
  8. Windows10自带Ubuntu更换UI主题
  9. CCNP学多长时间就行了?
  10. 联通服务器维护破解限速,网速1mbps(联通限速1mbps解除方法)