文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

使用Python怎么模拟一个n阶魔方

2023-06-14 13:27

关注

今天就跟大家聊聊有关使用Python怎么模拟一个n阶魔方,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

import cv2import numpy as npfrom 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 = 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():        breakprint('Congratulations')cube.show(0)

看完上述内容,你们对使用Python怎么模拟一个n阶魔方有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网行业资讯频道,感谢大家的支持。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯