今天就跟大家聊聊有关使用Python怎么模拟一个n阶魔方,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
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阶魔方有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。