魔方';Python中的s立方体旋转
我有一个魔方的表示,我正在尝试添加旋转方法。我已经花了一天多的时间来解决这个问题,我只是在代码中找不到bug 我有一个Box类,它的六个面都有字符串属性。我在一个3X3X3数组中填充了立方体类中的盒子(包括立方体中心的一个冗余盒子,但这段代码仍然没有优化)。然后我将正确的颜色分配给框,如果从立方体外部看不到该面,则值为“无” 到目前为止,它工作得很好,但当我添加第一个旋转方法rot_front()时,它给出了一个奇怪的结果 如果你想试试的话,我已经添加了调试方法。这是我的密码:魔方';Python中的s立方体旋转,python,Python,我有一个魔方的表示,我正在尝试添加旋转方法。我已经花了一天多的时间来解决这个问题,我只是在代码中找不到bug 我有一个Box类,它的六个面都有字符串属性。我在一个3X3X3数组中填充了立方体类中的盒子(包括立方体中心的一个冗余盒子,但这段代码仍然没有优化)。然后我将正确的颜色分配给框,如果从立方体外部看不到该面,则值为“无” 到目前为止,它工作得很好,但当我添加第一个旋转方法rot_front()时,它给出了一个奇怪的结果 如果你想试试的话,我已经添加了调试方法。这是我的密码: class Bo
class Box:
def __init__(self):
self.top = 'none'
self.bottom = 'none'
self.right = 'none'
self.left = 'none'
self.front = 'none'
self.back = 'none'
class Cube:
def __init__(self):
self.boxes = [[[Box() for i in range(3)] for i in range(3)] for i in range(3)]
for z in range(3):
for y in range(3):
for x in range(3):
if z == 0:
self.boxes[z][y][x].front = 'white'
if z == 2:
self.boxes[z][y][x].back = 'yellow'
if y == 0:
self.boxes[z][y][x].top = 'red'
if y == 2:
self.boxes[z][y][x].bottom = 'orange'
if x == 0:
self.boxes[z][y][x].left = 'blue'
if x == 2:
self.boxes[z][y][x].right = 'green'
def print_front(self):
z = 0
for y in range(3):
for x in range(3):
print(cube.boxes[z][y][x].front, end=" ")
print("")
def print_back(self):
z = 2
for y in range(3):
for x in range(3):
print(cube.boxes[z][y][x].back, end=" ")
print("")
def print_top(self):
y = 0
for z in range(3):
for x in range(3):
print(cube.boxes[z][y][x].top, end=" ")
print("")
def print_bottom(self):
y = 2
for z in range(3):
for x in range(3):
print(cube.boxes[z][y][x].bottom, end=" ")
print("")
def print_left(self):
x = 0
for z in range(3):
for y in range(3):
print(cube.boxes[z][y][x].left, end=" ")
print("")
def print_right(self):
x = 2
for z in range(3):
for y in range(3):
print(cube.boxes[z][y][x].right, end=" ")
print("")
def rot_front(self):
front_face = self.boxes[0]
for y in range(3):
for x in range(3):
target = front_face[2-x][y]
self.boxes[0][y][x].top = target.left
self.boxes[0][y][x].right = target.top
self.boxes[0][y][x].bottom = target.right
self.boxes[0][y][x].left = target.bottom
cube = Cube()
cube.rot_front()
print("FRONT")
cube.print_front()
print("BACK")
cube.print_back()
print("TOP")
cube.print_top()
print("BOTTOM")
cube.print_bottom()
print("LEFT")
cube.print_left()
print("RIGHT")
cube.print_right()
提前感谢您的帮助 最简单的方法是制作
self.boxes
的深度副本,并对其进行更改,然后在旋转结束时更换self.boxes
:
导入副本
类多维数据集:
#其他方法保持不变
def rot_前部(自身):
正面=自盒[0]
new_state=copy.deepcopy(self.box)
对于范围(3)内的y:
对于范围(3)内的x:
目标=正面[2-x][y]
新状态[0][y][x]。顶部=目标。左侧
新状态[0][y][x]。右=target.top
新状态[0][y][x]。底部=目标。右侧
新状态[0][y][x]。左=目标。底部
self.boxes=新状态
你犯的错误有点难以解释,因为我不是以英语为母语的人,但我会尽力:
您正在将信息从循环中的一个框移动到另一个框。但在某些情况下,
target
中的信息包含已移动的信息,您可以再次移动该信息。最简单的方法是制作self.boxes
的深度副本,并对其进行更改,然后在旋转结束时更换self.boxes
:
导入副本
类多维数据集:
#其他方法保持不变
def rot_前部(自身):
正面=自盒[0]
new_state=copy.deepcopy(self.box)
对于范围(3)内的y:
对于范围(3)内的x:
目标=正面[2-x][y]
新状态[0][y][x]。顶部=目标。左侧
新状态[0][y][x]。右=target.top
新状态[0][y][x]。底部=目标。右侧
新状态[0][y][x]。左=目标。底部
self.boxes=新状态
你犯的错误有点难以解释,因为我不是以英语为母语的人,但我会尽力:
您正在将信息从循环中的一个框移动到另一个框。但在某些情况下,
target
中的信息包含已移动的信息,您可以再次移动该信息。当您使用调试方法时,您发现了什么?可能会根据“box”是中心类、边缘类还是角形类来创建不同的类,考虑到它们的行为不同。当您使用调试方法时,您发现了什么?考虑到它们的行为不同,可能会根据“box”是中心类、边缘类还是角形类来创建不同的类。我调试了代码,并表示同意。如果打印出“目标”,则某些颜色的值会超过3,这表明这些值被移动了不止一次。因此,一个副本应该可以解决保留正在移动的颜色的问题,这样您就可以安全地移动它们。如果打印出“目标”,则某些颜色的值会超过3,这表明这些值被移动了不止一次。因此,副本应该可以解决保留正在移动的颜色的问题,以便您可以安全地移动它们。