python制作俄罗斯方块

2024-06-20 1330阅读
  • 作者简介:一名后端开发人员,每天分享后端开发以及人工智能相关技术,行业前沿信息,面试宝典。
  • 座右铭:未来是不可确定的,慢慢来是最快的。
  • 个人主页:极客李华-CSDN博客
  • 合作方式:私聊+
  • 这个专栏内容:BAT等大厂常见后端java开发面试题详细讲解,更新数目100道常见大厂java后端开发面试题。
  • 我的CSDN社区:https://bbs.csdn.net/forums/99eb3042821a4432868bb5bfc4d513a8
  • 微信公众号,抖音,b站等平台统一叫做:极客李华,加入微信公众号领取各种编程资料,加入抖音,b站学习面试技巧,职业规划

    python制作俄罗斯方块

    简介

    俄罗斯方块》(Tetris, 俄文:Тетрис)是一款由俄罗斯人阿列克谢·帕基特诺夫于1984年6月发明的休闲游戏。

    该游戏曾经被多家公司代理过。经过多轮诉讼后,该游戏的代理权最终被任天堂获得。 [1] 任天堂对于俄罗斯方块来说意义重大,因为将它与GB搭配在一起后,获得了巨大的成功。 [1]

    《俄罗斯方块》的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。

    编码

    搭建基础页面

    首先是创建一个python文件

    python制作俄罗斯方块

    • 创建一个窗体,用来显示这个游戏的界面

      代码

      import tkinter as tk
      # 首先创建一个窗体
      win = tk.Tk()
      win.mainloop()
      

      运行结果

      python制作俄罗斯方块

      • 绘制格子

        原理如下

        python制作俄罗斯方块

        python制作俄罗斯方块

        • 画格子,这里主要应用的是tkinter里面Canvas功能。

          python制作俄罗斯方块

          代码如下

          import tkinter as tk
          # 设置行数和列数
          row = 20
          col = 12
          # 设置每个格子的大小
          cell_size = 30
          # 设置窗口的高和宽
          height = row * cell_size
          width = col * cell_size
          # 首先创建一个窗体
          win = tk.Tk()
          # 在画板上绘制格子
          def draw_cell(canvas, col, row, color="#CCCCCC"):
              x0 = col * cell_size
              y0 = row * cell_size
              x1 = col * cell_size + cell_size
              y1 = row * cell_size + cell_size
              # 创建矩形
              canvas.create_rectangle(x0, y0, x1, y1, fill=color, outline="white", width=2)
          def draw_blank_board(canvas):
              for ri in range(row):
                  for cj in range(col):
                      draw_cell(canvas, cj, ri)
          # 绘制画布的长宽
          canvas = tk.Canvas(win, width=width, height=height)
          # 打包放置组件对象
          canvas.pack()
          draw_blank_board(canvas)
          win.mainloop()
          
          • 绘制俄罗斯方块

            现根据这个规则绘制一个看看情况

            python制作俄罗斯方块

            代码讲解

            import tkinter as tk
            # 设置行数和列数
            Row = 20
            Col = 12
            # 设置每个格子的大小
            cell_size = 30
            # 设置窗口的高和宽
            height = Row * cell_size
            width = Col * cell_size
            # 设置不同形状的格子
            SHAPES = {
                "O": [(-1, -1), (0, -1), (-1, 0), (0, 0)]
            }
            # 设置格子的颜色
            SHAPESCOLOR = {
                "O":"blue"
            }
            # 在画板上绘制格子
            def draw_cell_background(canvas, col, row, color="#CCCCCC"):
                x0 = col * cell_size
                y0 = row * cell_size
                x1 = col * cell_size + cell_size
                y1 = row * cell_size + cell_size
                # 创建矩形
                canvas.create_rectangle(x0, y0, x1, y1, fill=color, outline="white", width=2)
            def draw_blank_board(canvas):
                for ri in range(Row):
                    for cj in range(Col):
                        draw_cell_background(canvas, cj, ri)
            def draw_cells(canvas, col, row, cell_list, color="#CCCCCC"):
                """
                :param canvas: 画板对象
                :param col: 这个形状的的原点所在的列
                :param row: 这个形状所的原点所在的行
                :param cell_list: 这个形状各个格子相对于自身的原点所处的位置坐标
                :param color: 这个形状的颜色
                :return:
                """
                for cell in cell_list:
                    cell_col, cell_row = cell
                    ci = cell_col + col
                    ri = cell_row + row
                    # 判断是否越界
                    if 0 
                "O": [(-1, -1), (0, -1), (-1, 0), (0, 0)],
                "S":[(-1, 0),(0, 0),(0, -1),(1, -1)],
                "T":[(-1, 0),(0, 0),(0, -1),(1, 0)],
                "I":[(0, 1),(0, 0),(0, -1),(0, -2)],
                "L":[(-1, 0),(0, 0),(-1, -1),(-1, -2)],
                "J":[(-1, 0),(0, 0),(0, 1),(0, -2)],
                "Z":[(-1, -1),(0, -1),(0, 0),(1, 0)]
            }
            # 设置格子的颜色
            SHAPESCOLOR = {
                "O":"blue",
                "S":"red",
                "T":"yellow",
                "I":"green",
                "L":"purple",
                "J":"orange",
                "Z":"Cyan",
            }
            # 在画板上绘制格子
            def draw_cell_background(canvas, col, row, color="#CCCCCC"):
                x0 = col * cell_size
                y0 = row * cell_size
                x1 = col * cell_size + cell_size
                y1 = row * cell_size + cell_size
                # 创建矩形
                canvas.create_rectangle(x0, y0, x1, y1, fill=color, outline="white", width=2)
            def draw_blank_board(canvas):
                for ri in range(Row):
                    for cj in range(Col):
                        draw_cell_background(canvas, cj, ri)
            def draw_cells(canvas, col, row, cell_list, color="#CCCCCC"):
                """
                :param canvas: 画板对象
                :param col: 这个形状的的原点所在的列
                :param row: 这个形状所的原点所在的行
                :param cell_list: 这个形状各个格子相对于自身的原点所处的位置坐标
                :param color: 这个形状的颜色
                :return:
                """
                for cell in cell_list:
                    cell_col, cell_row = cell
                    ci = cell_col + col
                    ri = cell_row + row
                    # 判断是否越界
                    if 0 
                "O": [(-1, -1), (0, -1), (-1, 0), (0, 0)],
                "S":[(-1, 0),(0, 0),(0, -1),(1, -1)],
                "T":[(-1, 0),(0, 0),(0, -1),(1, 0)],
                "I":[(0, 1),(0, 0),(0, -1),(0, -2)],
                "L":[(-1, 0),(0, 0),(-1, -1),(-1, -2)],
                "J":[(-1, 0),(0, 0),(0, 1),(0, -2)],
                "Z":[(-1, -1),(0, -1),(0, 0),(1, 0)]
            }
            # 设置格子的颜色
            SHAPESCOLOR = {
                "O":"blue",
                "S":"red",
                "T":"yellow",
                "I":"green",
                "L":"purple",
                "J":"orange",
                "Z":"Cyan",
            }
            # 在画板上绘制格子
            def draw_cell_background(canvas, col, row, color="#CCCCCC"):
                x0 = col * cell_size
                y0 = row * cell_size
                x1 = col * cell_size + cell_size
                y1 = row * cell_size + cell_size
                # 创建矩形
                canvas.create_rectangle(x0, y0, x1, y1, fill=color, outline="white", width=2)
            def draw_blank_board(canvas):
                for ri in range(Row):
                    for cj in range(Col):
                        draw_cell_background(canvas, cj, ri)
            def draw_cells(canvas, col, row, cell_list, color="#CCCCCC"):
                """
                :param canvas: 画板对象
                :param col: 这个形状的的原点所在的列
                :param row: 这个形状所的原点所在的行
                :param cell_list: 这个形状各个格子相对于自身的原点所处的位置坐标
                :param color: 这个形状的颜色
                :return:
                """
                for cell in cell_list:
                    cell_col, cell_row = cell
                    ci = cell_col + col
                    ri = cell_row + row
                    # 判断是否越界
                    if 0 
                'kind': 'O', # 对应俄罗斯方块的类型
                'cell_list': SHAPES['O'], # 对应的每个俄罗斯方块的坐标
                'cr': [3, 3], # 对应的行列坐标
            }
            draw_block_move(canvas, one_block)
            # 让游戏不断循环 通过递归实现
            def game_loop():
                win.update()
                # 往下走
                down = [0, 1]
                draw_block_move(canvas, one_block, down)
                win.after(FPS, game_loop) # 注意的是这个game_loop后面不能加括号
            game_loop()
            win.mainloop()
            
                "Z": [(-1, -1), (0, -1), (0, 0), (1, 0)],
                "O": [(-1, -1), (0, -1), (-1, 0), (0, 0)],
                "S": [(-1, 0), (0, 0), (0, -1), (1, -1)],
                "T": [(-1, 0), (0, 0), (0, -1), (1, 0)],
                "I": [(0, 1), (0, 0), (0, -1), (0, -2)],
                "L": [(-1, 0), (0, 0), (-1, -1), (-1, -2)],
                "J": [(-1, 0), (0, 0), (0, -1), (0, -2)]
            }
            # 设置格子的颜色
            SHAPESCOLOR = {
                "O":"blue",
                "S":"red",
                "T":"yellow",
                "I":"green",
                "L":"purple",
                "J":"orange",
                "Z":"Cyan",
            }
            # 在画板上绘制格子
            def draw_cell_background(canvas, col, row, color="#CCCCCC"):
                x0 = col * cell_size
                y0 = row * cell_size
                x1 = col * cell_size + cell_size
                y1 = row * cell_size + cell_size
                # 创建矩形
                canvas.create_rectangle(x0, y0, x1, y1, fill=color, outline="white", width=2)
            # 绘制板块
            def draw_blank_board(canvas):
                for ri in range(Row):
                    for cj in range(Col):
                        draw_cell_background(canvas, cj, ri)
            # 绘制单元格
            def draw_cells(canvas, col, row, cell_list, color="#CCCCCC"):
                """
                :param canvas: 画板对象
                :param col: 这个形状的的原点所在的列
                :param row: 这个形状所的原点所在的行
                :param cell_list: 这个形状各个格子相对于自身的原点所处的位置坐标
                :param color: 这个形状的颜色
                :return:
                """
                for cell in cell_list:
                    cell_col, cell_row = cell
                    ci = cell_col + col
                    ri = cell_row + row
                    # 判断是否越界
                    if 0 
                'kind': 'O', # 对应俄罗斯方块的类型
                'cell_list': SHAPES['O'], # 对应的每个俄罗斯方块的坐标
                'cr': [3, 3], # 对应的行列坐标
            }
            # 测试代码
            # draw_block_move(canvas, one_block)
            def product_new_block():
                # 随机生成新的俄罗斯方块
                kind = random.choice(list(SHAPES.keys()))
                cr = [Col // 2, 0]
                new_block = {
                    "kind": kind,
                    "cell_list": SHAPES[kind],
                    'cr': cr
                }
                return new_block
            def check_move(block, direction=[0,0]):
                """
                :param block:俄罗斯方块的前身
                :param direction: 移动方向
                :return: boolean 是否可以朝着指定的方向移动
                """
                cc, cr = block['cr']
                cell_list = block['cell_list']
                for cell in cell_list:
                    cell_c, cell_r = cell
                    c = cell_c + cc + direction[0]
                    r = cell_r + cr + direction[1]
                    # 判断边界
                    if c 
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]