一、前言
终于整完了毕业论文,忙里偷闲半小时摸了个魔方模拟程序,支持模拟任意阶魔方,自动打乱,输入指令旋转。显示方面不会弄3d的,用opencv整了个展开图。
二、效果
五阶魔方打乱20步
震撼人心50阶,打乱100步
三、代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
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模拟魔方内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/Eyizoha/article/details/115703147