Python——简陋的n阶魔方模拟
生活随笔
收集整理的這篇文章主要介紹了
Python——简陋的n阶魔方模拟
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
簡介
終于整完了畢業論文,忙里偷閑半小時摸了個魔方模擬程序,支持模擬任意階魔方,自動打亂,輸入指令旋轉。顯示方面不會弄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阶魔方模拟的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: drozer安装之夜深模拟器
- 下一篇: Python OpenCV 实现魔方识别