import random
class Cube:
def __init__(self):
self.faces = {
'U': [['W' for _ in range(3)] for _ in range(3)], # 上面
'D': [['Y' for _ in range(3)] for _ in range(3)], # 下面
'L': [['O' for _ in range(3)] for _ in range(3)], # 左面
'R': [['R' for _ in range(3)] for _ in range(3)], # 右面
'F': [['G' for _ in range(3)] for _ in range(3)], # 前面
'B': [['B' for _ in range(3)] for _ in range(3)] # 后面
}
self.front_face = 'F' # 当前朝向用户的面
def rotate_face(self, face, clockwise=True):
if clockwise:
self.faces[face] = [list(x) for x in zip(*self.faces[face][::-1])]
else:
self.faces[face] = [list(x) for x in zip(*self.faces[face])][::-1]
def rotate_top(self, clockwise=True):
self.rotate_face('U', clockwise)
if clockwise:
temp = self.faces[self.front_face][0]
self.faces[self.front_face][0] = self.faces['R'][0]
self.faces['R'][0] = self.faces['B'][0]
self.faces['B'][0] = self.faces['L'][0]
self.faces['L'][0] = temp
else:
temp = self.faces[self.front_face][0]
self.faces[self.front_face][0] = self.faces['L'][0]
self.faces['L'][0] = self.faces['B'][0]
self.faces['B'][0] = self.faces['R'][0]
self.faces['R'][0] = temp
def rotate_down(self, clockwise=True):
self.rotate_face('D', clockwise)
if clockwise:
temp = self.faces[self.front_face][2]
self.faces[self.front_face][2] = self.faces['L'][2]
self.faces['L'][2] = self.faces['B'][2]
self.faces['B'][2] = self.faces['R'][2]
self.faces['R'][2] = temp
else:
temp = self.faces[self.front_face][2]
self.faces[self.front_face][2] = self.faces['R'][2]
self.faces['R'][2] = self.faces['B'][2]
self.faces['B'][2] = self.faces['L'][2]
self.faces['L'][2] = temp
def rotate_left(self, clockwise=True):
self.rotate_face('L', clockwise)
if clockwise:
temp = [self.faces['U'][i][0] for i in range(3)]
for i in range(3):
self.faces['U'][i][0] = self.faces['B'][2-i][0]
self.faces['B'][2-i][0] = self.faces['D'][i][0]
self.faces['D'][i][0] = self.faces[self.front_face][i][0]
self.faces[self.front_face][i][0] = temp[i]
else:
temp = [self.faces['U'][i][0] for i in range(3)]
for i in range(3):
self.faces['U'][i][0] = self.faces[self.front_face][i][0]
self.faces[self.front_face][i][0] = self.faces['D'][i][0]
self.faces['D'][i][0] = self.faces['B'][2-i][0]
self.faces['B'][2-i][0] = temp[i]
def rotate_right(self, clockwise=True):
self.rotate_face('R', clockwise)
if clockwise:
temp = [self.faces['U'][i][2] for i in range(3)]
for i in range(3):
self.faces['U'][i][2] = self.faces[self.front_face][i][2]
self.faces[self.front_face][i][2] = self.faces['D'][i][2]
self.faces['D'][i][2] = self.faces['B'][2-i][2]
self.faces['B'][2-i][2] = temp[i]
else:
temp = [self.faces['U'][i][2] for i in range(3)]
for i in range(3):
self.faces['U'][i][2] = self.faces['B'][2-i][2]
self.faces['B'][2-i][2] = self.faces['D'][i][2]
self.faces['D'][i][2] = self.faces[self.front_face][i][2]
self.faces[self.front_face][i][2] = temp[i]
def rotate_cube(self, direction):
if direction == 'top':
# 朝向用户的面向上旋转,新的朝向用户的面是上面
self.front_face = 'U'
# 交换 'F'、'U'、'B' 和 'D' 四个面的内容
self.faces['F'], self.faces['U'], self.faces['B'], self.faces['D'] = \
self.faces['D'], self.faces['F'], self.faces['U'], self.faces['B']
# 旋转 'L' 和 'R' 两个面90度
self.faces['L'] = [list(x) for x in zip(*self.faces['L'][::-1])]
self.faces['R'] = [list(x) for x in zip(*self.faces['R'][::-1])]
elif direction == 'down':
# 朝向用户的面向下旋转,新的朝向用户的面是下面
self.front_face = 'D'
# 交换 'F'、'D'、'B' 和 'U' 四个面的内容
self.faces['F'], self.faces['D'], self.faces['B'], self.faces['U'] = \
self.faces['U'], self.faces['F'], self.faces['D'], self.faces['B']
# 旋转 'L' 和 'R' 两个面90度
self.faces['L'] = [list(x) for x in zip(*self.faces['L'])][::-1]
self.faces['R'] = [list(x) for x in zip(*self.faces['R'])][::-1]
elif direction == 'left':
# 朝向用户的面向左旋转,新的朝向用户的面是左面
self.front_face = 'L'
# 交换 'F'、'L'、'B' 和 'R' 四个面的内容
self.faces['F'], self.faces['L'], self.faces['B'], self.faces['R'] = \
self.faces['R'], self.faces['F'], self.faces['L'], self.faces['B']
# 旋转 'U' 和 'D' 两个面90度
self.faces['U'] = [list(x) for x in zip(*self.faces['U'][::-1])]
self.faces['D'] = [list(x) for x in zip(*self.faces['D'][::-1])]
elif direction == 'right':
# 朝向用户的面向右旋转,新的朝向用户的面是右面
self.front_face = 'R'
# 交换 'F'、'R'、'B' 和 'L' 四个面的内容
self.faces['F'], self.faces['R'], self.faces['B'], self.faces['L'] = \
self.faces['L'], self.faces['F'], self.faces['R'], self.faces['B']
# 旋转 'U' 和 'D' 两个面90度
self.faces['U'] = [list(x) for x in zip(*self.faces['U'])][::-1]
self.faces['D'] = [list(x) for x in zip(*self.faces['D'])][::-1]
else:
print("Invalid direction. Please use 'top', 'down', 'left', or 'right'.")
def print_front(self):
# 打印上面(U)
for i in range(3):
print(f" {self.faces['U'][i][0]} {self.faces['U'][i][1]} {self.faces['U'][i][2]}")
print(" -----")
# 打印前面(F)、右面(R)、左面(L)、后面(B)
for i in range(3):
print(
f"{self.faces['L'][i][0]} {self.faces['L'][i][1]} {self.faces['L'][i][2]}|{self.faces['F'][i][0]} {self.faces['F'][i][1]} {self.faces['F'][i][2]}|{self.faces['R'][i][0]} {self.faces['R'][i][1]} {self.faces['R'][i][2]}")
print(" -----")
# 打印下面(D)
for i in range(3):
print(f" {self.faces['D'][i][0]} {self.faces['D'][i][1]} {self.faces['D'][i][2]}")
print(" -----")
# 打印后面(B)
for i in range(3):
print(f"{self.faces['B'][i][0]} {self.faces['B'][i][1]} {self.faces['B'][i][2]}")
def scramble(self, num_moves=20):
# 定义所有可能的旋转操作
moves = [
('top', True), ('top', False),
('down', True),('down', False),
('left', True), ('left', False),
('right', True), ('right', False)
]
# 随机选择 num_moves 次操作来打乱魔方
for _ in range(num_moves):
move, clockwise = random.choice(moves)
if move == 'top':
self.rotate_top(clockwise)
elif move == 'down':
self.rotate_down(clockwise)
elif move == 'left':
self.rotate_left(clockwise)
elif move == 'right':
self.rotate_right(clockwise)
else:
print("Invalid move. Please use 'top', 'down', 'left', or 'right'.")
# 创建魔方实例
cube = Cube()
# 交互循环
while True:
cube.print_front()
user_input = input("Enter rotation (e.g., 'top' to rotate cube, 'top,left' to rotate face, or 'exit' to quit, or 'play' to start game): ")
if user_input.lower() == 'exit':
break
if user_input in ['top', 'down', 'left', 'right']:
cube.rotate_cube(user_input)
elif user_input == 'play':
cube.scramble()
else:
try:
face, direction = user_input.split(',')
face = face.strip().lower()
direction = direction.strip().lower()
if face in ['top', 'down', 'left', 'right']:
clockwise = direction == 'right'
if face == 'top':
cube.rotate_top(clockwise)
elif face == 'down':
cube.rotate_down(clockwise)
elif face == 'left':
cube.rotate_left(clockwise)
elif face == 'right':
cube.rotate_right(clockwise)
else:
print("Invalid face. Please use 'top', 'down', 'left', or 'right'.")
except ValueError:
print("Invalid input format. Please use 'face,direction' or 'top', 'down', 'left', 'right'.")
代码解释
- 初始化魔方:
__init__方法初始化一个3x3x3的魔方,每个面用一个3x3的数组表示,并设置当前朝向用户的面为 “F”。 - 旋转单个面:
rotate_face方法用于旋转单个面,支持顺时针和逆时针旋转。 - 旋转顶部:
rotate_top方法用于旋转顶部面,同时更新当前朝向用户的面的顶部行。 - 旋转底部:
rotate_down方法用于旋转底部面,同时更新当前朝向用户的面的底部行。 - 旋转左面:
rotate_left方法用于旋转左面,同时更新当前朝向用户的面的左侧列。 - 旋转右面:
rotate_right方法用于旋转右面,同时更新当前朝向用户的面的右侧列。 - 旋转整个魔方:
rotate_cube方法用于旋转整个魔方,使得指定的方向成为新的朝向用户的面。 - 打印魔方:
print_cube方法用于按照指定的格式打印魔方的各个面。 - 打乱魔方:
scramble方法用于打乱魔方。它定义了所有可能的旋转操作,然后随机选择一定数量的操作来打乱魔方。
通过这些方法,你可以实现打乱魔方的功能,并且可以按照指定的格式打印魔方的各个面。
还不是很完美,如果发现bug,欢迎反馈
1166

被折叠的 条评论
为什么被折叠?



