用Python简陋模拟n阶魔方
更新时间:2021年4月17日 15:00 点击:2001
一、前言
终于整完了毕业论文,忙里偷闲半小时摸了个魔方模拟程序,支持模拟任意阶魔方,自动打乱,输入指令旋转。显示方面不会弄3D的,用opencv整了个展开图。
二、效果
五阶魔方打乱20步
震撼人心50阶,打乱100步
三、代码
import cv2 import numpy as np from random import randint class Cube: def __init__(self, order=3, size=50): # 魔方阶数、显示尺寸 self.img = np.zeros((4 * size * order, 3 * size * order, 3), dtype=np.uint8) self.order = order self.size = size self.len = size * order self.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 False if self.back[i][j] != self.back[0][0]: return False if self.front[i][j] != self.front[0][0]: return False if self.left[i][j] != self.left[0][0]: return False if self.right[i][j] != self.right[0][0]: return False if self.bottom[i][j] != self.bottom[0][0]: return False return True def show(self, wait=0): # 显示魔方展开图 for i in range(self.order): for j in range(self.order): # back x, y = self.len + i * self.size, j * self.size cv2.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) # left x, y = i * self.size, self.len + j * self.size cv2.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) # top x, y = self.len + i * self.size, self.len + j * self.size cv2.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) # right x, y = 2 * self.len + i * self.size, self.len + j * self.size cv2.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) # front x, y = self.len + i * self.size, 2 * self.len + j * self.size cv2.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) # bottom x, y = self.len + i * self.size, 3 * self.len + j * self.size cv2.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 = 0 for i in range(self.order): for j in range(self.order): if self.top[i][j] == color: count += 1 return count @staticmethod def _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] = temp def 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阶魔方的文章就介绍到这了,更多相关pytho模拟魔方内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!
相关文章
基于Python-Pycharm实现的猴子摘桃小游戏(源代码)
这篇文章主要介绍了基于Python-Pycharm实现的猴子摘桃小游戏,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-02-20- 这篇文章主要介绍了python实现逢七拍腿小游戏的思路,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-05-27
- 读万卷书不如行万里路,只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用Python实现一个八音符酱小游戏,大家可以在过程中查缺补漏,提升水平...2021-10-23
- 这篇文章主要介绍了CocosCreator制作射击游戏,各个方面都讲的比较详细,希望同学们自己动手试一下...2021-04-16
- 这篇文章主要介绍了使用pygame实现垃圾分类小游戏功能(已获校级二等奖),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-07-24
- 贪吃蛇小游戏相信80、90后小时候肯定都玩过,那么你知道如果通过Python来实现吗?今天就来教大家,文中有非常详细的代码示例,对正在学习python的小伙伴们很有帮助,需要的朋友可以参考下...2021-05-27
- 很多人都会是用PS进行拼接,本文主要介绍了pytho多张图片的无损拼接的实现示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-07-27
原生javascript+css3编写的3D魔方动画旋扭特效
这篇文章主要介绍了原生javascript+css3编写的3D魔方动画旋扭特效的相关资料,需要的朋友可以参考下...2016-03-18- 本文给大家分享的是一个使用C语言开发的命令行下的简易版扫雷小游戏,本身没有什么太多的技术含量,只不过是笔者的处女作,所以还是推荐给大家,希望对大家学习C能够有所帮助。...2020-04-25
- 本文内容主要介绍小游戏开发流中程涉及到的前端知识的如深色模式、离线缓存、樱花动画、横屏判断等知识的归纳介绍和个人收获总结,感兴趣的朋友一起看看吧...2021-10-19
- 这篇文章主要为大家详细介绍了C语言实现简易扫雷小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
- 这篇文章主要介绍了python实现三阶魔方还原的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-04-28
- 这篇文章主要为大家详细介绍了C++实现推箱子小游戏源码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
- 这篇文章主要介绍了用Python简陋模拟n阶魔方,文中有非常详细的代码示例,对正在学习python的小伙伴呢有一定的帮助,需要的朋友可以参考下...2021-04-17
pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异
这篇文章主要介绍了pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-02-25- 这篇文章主要介绍了教你用Python写一个植物大战僵尸小游戏,文中有非常详细的代码示例,对正在学习python的小伙伴们有非常好的帮助,需要的朋友可以参考下...2021-04-25
- 这篇文章主要介绍了VUE+Canvas 实现桌面弹球消砖块小游戏,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-04-13
- 这篇文章主要介绍了Java实战入门之双色球彩票,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下...2021-04-23
- 这篇文章主要为大家详细介绍了C语言实现扫雷小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
- pygame是一个专门设计来进行游戏开发设计的Python模块,因为摆脱了被低级语言(如机器语言和汇编语言)的束缚,使用起来非常的简单,这篇文章主要给大家介绍了关于如何利用pygame模块制作跳跃小球小游戏的相关资料,需要的朋友可以参考下...2021-08-18