【python基础】用python写一个魔方

部署运行你感兴趣的模型镜像
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'.")

代码解释

  1. 初始化魔方__init__ 方法初始化一个3x3x3的魔方,每个面用一个3x3的数组表示,并设置当前朝向用户的面为 “F”。
  2. 旋转单个面rotate_face 方法用于旋转单个面,支持顺时针和逆时针旋转。
  3. 旋转顶部rotate_top 方法用于旋转顶部面,同时更新当前朝向用户的面的顶部行。
  4. 旋转底部rotate_down 方法用于旋转底部面,同时更新当前朝向用户的面的底部行。
  5. 旋转左面rotate_left 方法用于旋转左面,同时更新当前朝向用户的面的左侧列。
  6. 旋转右面rotate_right 方法用于旋转右面,同时更新当前朝向用户的面的右侧列。
  7. 旋转整个魔方rotate_cube 方法用于旋转整个魔方,使得指定的方向成为新的朝向用户的面。
  8. 打印魔方print_cube 方法用于按照指定的格式打印魔方的各个面。
  9. 打乱魔方scramble 方法用于打乱魔方。它定义了所有可能的旋转操作,然后随机选择一定数量的操作来打乱魔方。

通过这些方法,你可以实现打乱魔方的功能,并且可以按照指定的格式打印魔方的各个面。

还不是很完美,如果发现bug,欢迎反馈

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值