• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    用Python简陋模拟n阶魔方

    一、前言

    终于整完了毕业论文,忙里偷闲半小时摸了个魔方模拟程序,支持模拟任意阶魔方,自动打乱,输入指令旋转。显示方面不会弄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实现三阶魔方还原的示例代码
    上一篇:Python OpenCV快速入门教程
    下一篇:Python基础知识之变量的详解
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    用Python简陋模拟n阶魔方 用,Python,简陋,模拟,阶,魔方,