魔方';Python中的s立方体旋转

魔方';Python中的s立方体旋转,python,Python,我有一个魔方的表示,我正在尝试添加旋转方法。我已经花了一天多的时间来解决这个问题,我只是在代码中找不到bug 我有一个Box类,它的六个面都有字符串属性。我在一个3X3X3数组中填充了立方体类中的盒子(包括立方体中心的一个冗余盒子,但这段代码仍然没有优化)。然后我将正确的颜色分配给框,如果从立方体外部看不到该面,则值为“无” 到目前为止,它工作得很好,但当我添加第一个旋转方法rot_front()时,它给出了一个奇怪的结果 如果你想试试的话,我已经添加了调试方法。这是我的密码: class Bo

我有一个魔方的表示,我正在尝试添加旋转方法。我已经花了一天多的时间来解决这个问题,我只是在代码中找不到bug

我有一个Box类,它的六个面都有字符串属性。我在一个3X3X3数组中填充了立方体类中的盒子(包括立方体中心的一个冗余盒子,但这段代码仍然没有优化)。然后我将正确的颜色分配给框,如果从立方体外部看不到该面,则值为“无”

到目前为止,它工作得很好,但当我添加第一个旋转方法rot_front()时,它给出了一个奇怪的结果

如果你想试试的话,我已经添加了调试方法。这是我的密码:

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,这表明这些值被移动了不止一次。因此,副本应该可以解决保留正在移动的颜色的问题,以便您可以安全地移动它们。