【python+情人节】玩个俄罗斯方块都是爱你的形状——二、手动拼图(通过gui辅助实现)

俄罗斯方块辅助资料 这是俄罗斯方块的数据设计,源码请看我的博客。 立即下载

本项目效果如图
动画过程已投稿b站:https://www.bilibili.com/video/av88671119
在这里插入图片描述

目录

一、思路分析

二、手动拼图

三、自动拼图

四、动画展示

======================= 大爽歌作,made by big shuang =======================

二、手动拼图

1、介绍

手动拼图这里通过一个gui来辅助实现
这个gui类似于玩俄罗斯方块的。
但是具体的功能有一些改动:
1 - 背景色提示 :背景会展示一个淡红色的爱心,方便参考移动
2 - 按左右键移动俄罗斯方块
3 - 按下键降落俄罗斯方块
4 - 按上键回退到上一个俄罗斯方块
5 - 按c键切换俄罗斯方块
6 - 按v键旋转俄罗斯方块
详细效果可以前往我的b站观看动画,点击观看视频
实现的思路则可以参考我之前的博客:python tkinter实现俄罗斯方块基础版
不过有点不同的是之前的博客是面向过程的思路写的
这回的代码则是面向对象的思路。
手动拼图拼出来的一种结果如图,当然也可以拼出别的效果,如果你愿意尝试的话
在这里插入图片描述
由于代码量比较大
这里将它拆分成了好几个py文件
分别如下,其中puzzle为主文件
constants.py :记录要用到的常量
drawer.py :用于绘制的画板类
puzzle.py :gui辅助实现拼图主入口
util.py :用于绘制的画板类

其他辅助文件
love3.txt: 迷宫文本
results.py: 拼图结果

2、完整代码

完整代码如下,
也可以前往我的github里面下载(稍后会上传)
constants.py

# usr/bin/env python
# -*- coding:utf-8- -*-

C = 20
R = 20
CELL_SIZE = 30

FPS = 100

# 定义各种形状
SHAPES = {
    "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)],
}

# 定义各种颜色
ALL_COLORS = {
    # 七种俄罗斯方块的颜色
    "O": "#d25b6a",
    "S": "#d2835b",
    "T": "#e5e234",
    "I": "#83d05d",
    "L": "#2862d2",
    "J": "#35b1c0",
    "Z": "#5835c0",

    # 其他颜色
    "": "#CCCCCC",
    "R": "#ffcccc",
    "D": "#ff3366",
    "line": "red"
}

SHAPE_LIST = ["O", "S", "T", "I", "L", "J", "Z"]

drawer.py

# usr/bin/env python
# -*- coding:utf-8- -*-

import tkinter as tk
from constants import ALL_COLORS


class Drawer(tk.Canvas):
    def __init__(self, master, c, r, cell_size):
        self.c = c
        self.r = r
        self.cell_size = cell_size
        height = r * cell_size
        width = c * cell_size
        super().__init__(master, width=width, height=height)
        self.pack()

    def draw_background(self, board):
        for ri in range(self.r):
            for ci in range(self.c):
                color = ALL_COLORS[board[ri][ci]]
                self.draw_cell_by_cr(ci, ri, color)

    def draw_cell_by_cr(self,c, r, color, tag=None):
        x0 = c * self.cell_size
        y0 = r * self.cell_size
        x1 = c * self.cell_size + self.cell_size
        y1 = r * self.cell_size + self.cell_size
        # tag用于在后面删除指定tag的方格
        if tag is None:
            # 没有tag代表的是背景色
            self.create_rectangle(x0, y0, x1, y1, fill=color, outline="white", width=2)
        else:
            # 有tag 代表的是俄罗斯方块
            _tag = "b%s" % tag
            self.create_rectangle(x0, y0, x1, y1, fill=color,
                                  outline=color, tag=_tag)

    def draw_block(self, block, block_id):
        c, r = block['cr']
        shape_type = block['kind']
        cell_list = block['cell_list']
        for cell in cell_list:
            cell_c, cell_r = cell
            ci = cell_c + c
            ri = cell_r + r
            # 判断该位置方格在画板内部(画板外部的方格不再绘制)
            if 0 <= c < self.c and 0 <= r < self.r:
                self.draw_cell_by_cr(ci, ri, ALL_COLORS[shape_type], block_id)

    def clean_by_block_id(self, block_id):
        _tag = "b%s" % block_id
        self.delete(_tag)

puzzle.py

# usr/bin/env python
# -*- coding:utf-8- -*-

import tkinter as tk
import time


from drawer import Drawer
from util import *
from constants import CELL_SIZE, C, R, SHAPE_LIST, SHAPES, FPS



class PuzzleApp:
    def __init__(self, c, r, txt_path):
        self.win = tk.Tk()
        self.love_list = read_love_from_txt(txt_path)

        # 获取love_list 的长宽
        self.love_r = len(self.love_list)
        self.love_c = len(self.love_list[0])

        self.r = r
        self.c = c
        self.pr = r - self.love_r
        self.pc = (c - self.love_c) // 2

        self.generate_board()

        self.drawer = Drawer(self.win, self.c, self.r, CELL_SIZE)
        self.drawer.draw_background(self.board)

        self.block_id = -1  # 记录是第几个俄罗斯方块
        self.block = {}  # 俄罗斯方块的信息
        self.block_list = []  # 记录已经着陆的俄罗斯方块

        self.win.bind("<KeyPress-Left>", self.move_block)
        self.win.bind("<KeyPress-Right>", self.move_block)
        self.win.bind("<KeyPress-v>", self.rotate_block)  # 按v键旋转俄罗斯方块
        self.win.bind("<KeyPress-c>", self.change_block)  # 按c键切换俄罗斯方块
        self.win.bind("<KeyPress-Down>", self.land)
        self.win.bind("<KeyPress-Up>", self.back)

        self.win.bind("<KeyPress-p>", self.print_block_list)

        self.generate_new_block()

        self.win.mainloop()

    def print_block_list(self, event):
        if self.block_list:
            print('[')
            for block in self.block_list:
                print(block)
            print(']')

    def generate_board(self):
        # 生成全空的二维列表 board
        self.board  = [
            ['' for ci in range(self.c)] for ri in range(self.r)
        ]
        # 生成全空的二维列表 block_blard ,用于记录俄罗斯方块的存储情况
        self.block_board = [
            ['' for ci in range(self.c)] for ri in range(self.r)
        ]

        # 二维列表 board 中记录 love_list,将里面的粉红色方格记录为'R'
        for ri in range(len(self.love_list)):
            for ci in range(len(self.love_list[0])):
                if self.love_list[ri][ci] == "1":
                    self.board [ri+self.pr][ci + self.pc] = "R"

    def generate_new_block(self):
        self.block_id += 1
        cr = [self.pc + self.love_c // 2, 2]
        _kind = SHAPE_LIST[0]
        self.block = {
            'cr': cr,
            'kind': _kind,
            'cell_list': SHAPES[_kind],
            'angle': 0,  # 角度
        }
        self.drawer.draw_block(self.block, self.block_id)

    def check_move(self, cr, cell_list, direction):
        # 判断某个俄罗斯方块的方格能否在某个位置摆放
        cc, cr = cr
        cell_list = 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 < 0 or c >= self.c or r >= self.r:
                return False

            # 必须要判断r不小于0才行,具体原因你可以不加这个判断,试试会出现什么效果
            if r >= 0 and self.block_board[r][c] not in ['', 'R']:
                return False

        return True

    def move_block(self, event):
        """
        响应鼠标按键移动俄罗斯方块
        """
        direction = [0, 0]
        if event.keysym == 'Left':
            direction = [-1, 0]
        elif event.keysym == 'Right':
            direction = [1, 0]
        else:
            return

        cr = self.block['cr']
        cell_list = self.block['cell_list']

        if self.check_move(cr, cell_list, direction):
            # 先清除原有的
            self.drawer.clean_by_block_id(self.block_id)
            # 再绘制新的
            new_cr = [cr[0]+direction[0], cr[1]+direction[1]]
            self.block['cr'] = new_cr
            self.drawer.draw_block(self.block, self.block_id)
            self.win.update()

    def rotate_block(self, event):
        angle = self.block['angle']
        angle += 1
        angle %= 4  # 除4取余数,避免角度超过4
        cell_list = self.block['cell_list']
        rotate_list = get_cell_list_by_angle(cell_list, 1)

        if self.check_move(self.block['cr'], rotate_list, [0, 0]):
            # 先清除原有的
            self.drawer.clean_by_block_id(self.block_id)
            # 再绘制新的
            self.block['angle'] = angle
            self.block['cell_list'] = rotate_list
            self.drawer.draw_block(self.block, self.block_id)
            self.win.update()

    def change_block(self, event):
        kind_index = SHAPE_LIST.index(self.block['kind'])
        next_kind = SHAPE_LIST[(kind_index + 1) % len(SHAPE_LIST)]

        if self.check_move(self.block['cr'], SHAPES[next_kind], [0, 0]):
            # 先清除原有的
            self.drawer.clean_by_block_id(self.block_id)
            # 再绘制新的
            self.block['angle'] = 0
            self.block['kind'] = next_kind
            self.block['cell_list'] = SHAPES[next_kind]
            self.drawer.draw_block(self.block, self.block_id)
            self.win.update()

    def land(self, event):
        # 俄罗斯方块直接着陆
        c, r = self.block['cr']
        cell_list = self.block['cell_list']

        new_r = self.get_land_r(cell_list, c)
        while r < new_r:
            # 先清除原有的
            self.drawer.clean_by_block_id(self.block_id)
            # 再绘制新的
            r += 1
            self.block['cr'] = [c, r]
            self.drawer.draw_block(self.block, self.block_id)
            self.win.update()
            time.sleep(0.01)

        self.block_list.append(self.block)
        self.refresh_block_board()
        self.generate_new_block()
        self.win.update()

    def get_land_r(self, cell_list, ci):
        # 获取当前俄罗斯方块降落后的行位置
        ri = 0
        for ri in range(2, self.r):
            # 从上到下依次尝试能否移动该行,如果这行移动不到,则说明上一行是降落的着陆点
            if not self.check_move((ci, ri), cell_list, (0, 0)):
                return ri - 1

        return self.r - 1

    def refresh_block_board(self):
        self.block_board = [
            ['' for ci in range(self.c)] for ri in range(self.r)
        ]

        for block in self.block_list:
            shape_type = block['kind']
            cc, cr = block['cr']
            cell_list = block['cell_list']

            for cell in cell_list:
                cell_c, cell_r = cell
                c = cell_c + cc
                r = cell_r + cr

                self.block_board[r][c] = shape_type

    def back(self, event):
        if self.block_id>0:
            # 先隐藏当前的俄罗斯方块
            self.drawer.clean_by_block_id(self.block_id)

            # 再回退到上一个俄罗斯方块
            self.block = self.block_list.pop()
            self.block['cr'][1] = 2
            self.drawer.clean_by_block_id(self.block_id-1)
            self.block_id -= 1
            self.drawer.draw_block(self.block, self.block_id)
            self.refresh_block_board()
            self.win.update()


if __name__ == '__main__':
    txt_path = "love3.txt"
    app = PuzzleApp(C, R, txt_path)

util.py

# usr/bin/env python
# -*- coding:utf-8- -*-


def read_love_from_txt(txt_path):
    # 从txt中读取二维爱心列表,并返回
    with open(txt_path, 'r') as f:
        fl = f.readlines()

    love_list = []
    for line in fl:
        line = line.strip('\n')
        new_line = line.split(' ')
        love_list.append(new_line)

    return love_list


def get_cell_list_by_angle(cell_list, angle):
    # 将当前的 cell_list旋转指定的角度
    angle_dict = {
        0: (1, 0, 0, 1),
        1: (0, 1, -1, 0),
        2: (-1, 0, 0, -1),
        3: (0, -1, 1, 0),
    }
    a, b, c, d = angle_dict[angle]
    if angle == 0:
        return cell_list

    rotate_cell_list = []
    for cell in cell_list:
        cc, cr = cell
        rc, rr = a * cc + b * cr, c*cc+d*cr
        rotate_cell_list.append((rc, rr))

    return rotate_cell_list

其他辅助文件
love3.txt

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 1 0 0 0 0
0 0 0 0 1 1 1 1 1 1 0 1 1 1 1 1 1 0 0 0
0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0
0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0
0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0
0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0
0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0
0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0

results.py

#usr/bin/env python
#-*- coding:utf-8- -*-

res1 = [
    {'cr': [10, 18], 'kind': 'T', 'cell_list': [(1, 0), (0, 0), (0, 1), (-1, 0)], 'angle': 2},
    {'cr': [10, 16], 'kind': 'I', 'cell_list': [(0, 1), (0, 0), (0, -1), (0, -2)], 'angle': 0},
    {'cr': [9, 17], 'kind': 'O', 'cell_list': [(-1, -1), (0, -1), (-1, 0), (0, 0)], 'angle': 0},
    {'cr': [12, 17], 'kind': 'O', 'cell_list': [(-1, -1), (0, -1), (-1, 0), (0, 0)], 'angle': 0},
    {'cr': [7, 15], 'kind': 'T', 'cell_list': [(1, 0), (0, 0), (0, 1), (-1, 0)], 'angle': 2},
    {'cr': [13, 15], 'kind': 'T', 'cell_list': [(1, 0), (0, 0), (0, 1), (-1, 0)], 'angle': 2},
    {'cr': [9, 14], 'kind': 'S', 'cell_list': [(0, 1), (0, 0), (-1, 0), (-1, -1)], 'angle': 1},
    {'cr': [12, 14], 'kind': 'Z', 'cell_list': [(-1, 1), (-1, 0), (0, 0), (0, -1)], 'angle': 1},
    {'cr': [13, 14], 'kind': 'J', 'cell_list': [(0, -1), (0, 0), (1, 0), (2, 0)], 'angle': 3},
    {'cr': [7, 13], 'kind': 'L', 'cell_list': [(0, 1), (0, 0), (-1, 1), (-2, 1)], 'angle': 1},
    {'cr': [5, 13], 'kind': 'T', 'cell_list': [(-1, 0), (0, 0), (0, -1), (1, 0)], 'angle': 0},
    {'cr': [15, 13], 'kind': 'T', 'cell_list': [(-1, 0), (0, 0), (0, -1), (1, 0)], 'angle': 0},
    {'cr': [4, 12], 'kind': 'O', 'cell_list': [(-1, -1), (0, -1), (-1, 0), (0, 0)], 'angle': 0},
    {'cr': [17, 12], 'kind': 'O', 'cell_list': [(-1, -1), (0, -1), (-1, 0), (0, 0)], 'angle': 0},
    {'cr': [14, 12], 'kind': 'S', 'cell_list': [(-1, 0), (0, 0), (0, -1), (1, -1)], 'angle': 0},
    {'cr': [6, 12], 'kind': 'Z', 'cell_list': [(-1, -1), (0, -1), (0, 0), (1, 0)], 'angle': 0},
    {'cr': [10, 13], 'kind': 'T', 'cell_list': [(-1, 0), (0, 0), (0, -1), (1, 0)], 'angle': 0},
    {'cr': [9, 12], 'kind': 'O', 'cell_list': [(-1, -1), (0, -1), (-1, 0), (0, 0)], 'angle': 0},
    {'cr': [12, 12], 'kind': 'O', 'cell_list': [(-1, -1), (0, -1), (-1, 0), (0, 0)], 'angle': 0},
    {'cr': [10, 10], 'kind': 'T', 'cell_list': [(1, 0), (0, 0), (0, 1), (-1, 0)], 'angle': 2},
    {'cr': [13, 10], 'kind': 'T', 'cell_list': [(1, 0), (0, 0), (0, 1), (-1, 0)], 'angle': 2},
    {'cr': [7, 10], 'kind': 'T', 'cell_list': [(1, 0), (0, 0), (0, 1), (-1, 0)], 'angle': 2},
    {'cr': [13, 8], 'kind': 'L', 'cell_list': [(0, 1), (0, 0), (-1, 1), (-2, 1)], 'angle': 1},
    {'cr': [7, 9], 'kind': 'J', 'cell_list': [(0, -1), (0, 0), (1, 0), (2, 0)], 'angle': 3},
    {'cr': [16, 10], 'kind': 'T', 'cell_list': [(-1, 0), (0, 0), (0, -1), (1, 0)], 'angle': 0},
    {'cr': [4, 10], 'kind': 'T', 'cell_list': [(-1, 0), (0, 0), (0, -1), (1, 0)], 'angle': 0},
    {'cr': [6, 9], 'kind': 'O', 'cell_list': [(-1, -1), (0, -1), (-1, 0), (0, 0)], 'angle': 0},
    {'cr': [15, 9], 'kind': 'O', 'cell_list': [(-1, -1), (0, -1), (-1, 0), (0, 0)], 'angle': 0},
]
python numpy矩阵信息说明,shape,size,dtype 我就废话不多说了,大家还是直接看例子吧! import numpy as np from numpy import random matrix1 = random.random(size=(2,4)) #矩阵每维的大小 print matrix1.shape #矩阵所有数据的个数 print matrix1.size #矩阵每个数据的类型 print matrix1.dtype 补充知识:Python:查看矩阵大小,查看列表大小 对于Python3.5 查看矩阵大小 >>>import numpy as np >>>from numpy import random >>>matr 立即下载

相关推荐

元器件应用中的RI系列RT1760N集成电路实用检测数据

RT1760N是滚动码发生器集成电路,为14脚双列直插式塑料封装,在普及型汽车遥控防盗系统遥控发射器上的正常工作电压典型检测数据如表所列,用MF14型三用表测得(DC挡)。  表 RT1760N在普及型汽车遥控防盗系统上的检测数据   来源:ks99

【python+情人节】玩个俄罗斯方块都是爱你的形状——三、自动拼图

本项目效果如图 动画过程已投稿b站:https://www.bilibili.com/video/av88671119 目录 一、思路分析 二、手动拼图 三、自动拼图 四、动画展示 ======================= 大爽歌作,made by big shuang ======================= 三、自动拼图 1、介绍分析 这里再先介绍一遍 本部分要通过算法实现俄...

大爽老师的博客 2423

二维otsu算法python_OpenCV-Python系列之OTSU算法

上一个教程中,我们谈到了关于图像二值化的两种方法,一种是固定阈值法,另一种是自适应阈值法,总的来说,自适应阈值法在某些方面要由于固定阈值法,但还没完,这次我们将隆重介绍我们的重量级选手,也就是OTSU算法(又称为大津算法和最大类间方差法)。最大类间方差法是1979年由日本学者大津提出的,是一种自适应阈值确定的方法,又叫大津法,简称OTSU,是一种基于全局的二值化算法,它是根据图像的灰度特性,将图像...

weixin_28834169的博客 1426

【python+情人节】玩个俄罗斯方块都是爱你的形状——一、思路分析

本项目效果如图 动画过程已投稿b站:https://www.bilibili.com/video/av88671119 目录 一、思路分析 二、自动拼图 三、手动拼图 四、动画展示 ======================= 大爽歌作,made by big shuang ======================= 0、项目介绍 如最上面的图所示,本项目实际上就是通过俄罗斯方块拼出一...

大爽老师的博客 2572

Python | 处理CMIP6 NC数据,以tas为例

各位同学,一般在文章最后一章我们可能会做不同气候情景下变量的未来时空变化特征,类似上图。从cmip6下载的nc数据常需要转换格式、裁剪到研究区和重采样等,本期代码可以解决这类问题。

qq_48539301的博客 1384

ESP32-S3 SPI接口实战:从引脚分配到高速通信配置

本文详细解析了ESP32-S3的SPI接口配置与高速通信优化技巧,从引脚分配到软件配置,再到DMA传输和时钟优化,帮助开发者快速掌握SPI通信技术。特别针对ESP32-S3的SPI2接口进行了实战演示,包括硬件连接和常见问题排查,适用于各类嵌入式开发项目。

weixin_29189373的博客 679

小学生python游戏编程5----拼图游戏继

接前两篇文章,[小学生python游戏编程3----拼图游戏-准备](https://blog.youkuaiyun.com/fqfq123456/article/details/127173684),[小学生python游戏编程4----拼图游戏今天](https://blog.youkuaiyun.com/fqfq123456/article/details/127177781)此主拼图游戏做完整 ,上次写到可以打乱图片,拼成游戏界面,今天主要写要如何通过点击图块互换位置,如何全局判断输赢,显示用时间及历史最高记录。

fqfq123456的专栏 2412

基于DO-178C/331的飞控软件研发环境的研究

本研究提出了一套基于DO-178C/331标准的飞控系统软件开发和验证框架。通过优化模型库的设计、代码生成配置和测试验证流程,显著提升了飞控系统软件的开发效率和安全性。未来的研究可以进一步扩展模型库的功能,以适应更复杂的飞控系统需求。

qq_41854911的博客 561

【python+情人节】玩个俄罗斯方块都是爱你的形状——四、动画展示

本项目效果如图 动画过程已投稿b站:https://www.bilibili.com/video/av88671119 目录 一、思路分析 二、手动拼图 三、自动拼图 四、动画展示 ======================= 大爽歌作,made by big shuang ======================= 四、动画展示 1、介绍 动画只展示拼图结果,不展示结果的求解方法 结...

大爽老师的博客 954

YOLO26涨点改进 | 小目标损失函数独家改进篇 | TGRS 2025 | 引入AdaFocalLoss损失函数,改进小目标检测,自适应聚焦小目标与样本分布不平衡,提升检测精度与训练稳定性

目录一、前言:YOLO26原生损失函数在小目标检测中的核心痛点(涨点瓶颈)1.1 小目标权重不足,聚焦能力薄弱1.2 样本分布不平衡适配性差,正负样本权重失衡1.3 训练不稳定,易出现梯度消失/震荡1.4 未区分小目标与背景的冗余干扰,误检率高二、TGRS 2025顶刊灵感解析:自适应聚焦损失的核心逻辑三、全网独家创新:AdaFocalLoss损失函数设计与YOLO26适配(核心重点,可复现)3.1 AdaFocalLoss函数整体设计(独家设计,清晰可复现)3.2 各核心模块详细设计(独家创新,可直接复现

qq_36130719的博客 202

爆肝整理:微信公众号文章HTML编写完整规范,运营必备手册

微信公众号文章排版总是出错?📱 这份完整的HTML编写规范文档帮你彻底解决!文档包含所有支持的标签、CSS属性、实用代码模板和注意事项 📋,让你快速掌握微信文章的HTML编写技巧,告别第三方编辑器依赖 ✅

XiaoqiangClub的博客 2310

2021-01-28

python编写俄罗斯方块 代码: import tkinter as tk from tkinter import messagebox import random R = 20 C = 12 cell_size = 30 height = R * cell_size width = C * cell_size FPS = 200 # 刷新页面的毫秒间隔为0.2秒 #定义各种形状 SHAPES = { “O”: [(-1, -1), (0, -1), (-1, 0), (0, 0)], “S”: [(-

linhfrty的博客 438

SAP ATP可用性检查简介

系统中建立此单时,SAP就会做一个所谓的检查,检查一下我们预先设定的考虑因素,能否满足客户的要求,什么时候可以满足,这就是可用性检查的功能。2、同样的在创建生产订单的时候也有ATP的检查,生产订单是100PC,要求2024-07-01生产完成,系统就会根据配置进行物料的可用性的检查,看物料是否能够满足生产同时能够满足交期。14: 表示相关预留的选项,与10的区别在于,10是一般是表示我们用MB21建立的,而14是表示由于相关预留,即此预留是来自于其他物料,如生产订单所产生的预留。

我小时候很黑的博客 3377

signature=9d230a533b0bb2e0d774cd9af4e91613,react-native-dialogs/yarn.lock at 8653282ee0fb6f8d3516f4a...

# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.# yarn lockfile v1"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.8.3":version "7.8.3"resolved "https://registry.yarnpkg.com/@babel/co...

weixin_31342203的博客 4万+

CANoe之I/O功能采集电压

在进入ECU自动化测试中,有时会用到采集ECU电压,CANoe除了可以仿真、监听CAN、ETH、LIN等网络报文外,部分设备(如VN5650、VN1630等)上还有一个I/O口,这个I/O口就可以用来满足我们自动化测试中采集电压的需求。CANoe上的I/O功能用处还是特别大,比如网络管理测试、相关诊断都会用到。

测试领域技术分享 4827

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

python俄罗斯方块代码34行_python,基于tkinter模块编写的完整俄罗斯方块游戏代码...

使用python编写小游戏挺容易的,常用的模块是pygame, 本文用tkinter,实现了俄罗斯方块小游戏,感觉还是比较容易的。import tkinter as tkimport timeimport randomfrom tkinter import messageboximport pygamepygame.mixer.pre_init(44100, -16, 2, 512)pygame....

weixin_39863759的博客 673

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

基于ijkplayer封装ffmpeg播放器的录屏实现

关于ijkplayer我自己提出的issue的https://github.com/Bilibili/ijkplayer/issues/1166的一个小总结,还先不要期望我有完整代码给出,如果只想知道实现思路请直接跳看第二步,抱歉 本文已加入保护代码,请勿转载!!! --by cjz010 项U@iA0d3.@?t$U目做TaAScvuNyTYe了N年,6+^NtoMq$做个sPSZAAn...

cjz010的专栏 1万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

史上最全的机器学习面试技巧【程序员小依】

程序员小依IT派 - {技术青年圈}持续关注互联网、区块链、人工智能领域

IT派 929

Python(拼图)游戏

# coding: utf-8 # 滑雪小游戏 import sys import pygame import random from pygame.locals import * # 滑雪者类 class SkierClass(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self) ...

微笑的丁总的个人博客 2430

七夕情人节,让python来为表白助力吧!

今天是七夕,在这个有情人终成眷属的好日子里,小刘在这里给大家带来Python的小福利,在七夕利用Python制造两个人之间的甜蜜。将表白的话做成一个心爱的甜心和一朵粉红的玫瑰,在七夕节的当天送给自己的另一半。这样既用心,而且还很甜蜜的操作,是不是很酷!说干就干,接下来,小刘就带领大家制作一个七夕节的小惊喜。 生成爱心词云图 不多说,直接上代码 导入库 定义函数 调用函数 import jie...

liuzuoping的博客 1189

Python绘图Turtle库详解&情人节玫瑰花

https://blog.youkuaiyun.com/zengxiantao1994/article/details/76588580

酒逢知己千杯少,欢迎驾临 2600

python小欢喜(八)俄罗斯方块 (5) 生成各种组合形状

前面的文章《python小欢喜(八)俄罗斯方块 (2)由方块组成复杂的形状》只是实现了“横条”与“竖条”两种组合形状。接下来介绍生成更多复杂的组合形状。 下面是L形状的效果图 下面是“品”字形状的效果图: 由于由多个方块组合生成的形状很多,因此使用一种较为直观的方式 来生成组合形状的坐标值 即用二维矩阵图示方式来表示形状,1表示该处有方块,0表示没有 #方块组合形状的二维矩阵图示,1表示该处有...

littlezhuhui的专栏 1342

Python 告诉你,情人节该送什么礼物?

作者 | 丁彦军责编 | 伍杏玲掐指一算明天就是情人节了!还没来得及准备的人要么被打断腿,要么注孤生不过目测已经有一大批直男已经为送什么礼物发愁了还在送掺杂着布偶的鲜花束...

优快云资讯 4435

python小欢喜(八)俄罗斯方块 (2)由方块组成复杂的形状

在前一篇文章《python小欢喜(八)俄罗斯方块 (1) 基本界面的准备》介始了如何让小方块自由下落,并且可以用方向键控制左右移动,接下来介绍如何组成各种形状的方块。 4个方块组成一个模条的效果如下 ...

littlezhuhui的专栏 881

免费公开微博小助手源代码---基于Autojs4的

各位老铁支持我这么久小弟首先感谢了~ 微博小助手UI 刷微博的项目是个老项目,多少年了,我也参于一下,其实没啥东西很简单就是会遇到个三无的ad控件。我实在是没办法了就强制停止在打开了,AD就没了。另外就是做任务有个0-2的任务做起来也不难,我测试了3个手机问题不大。最主要的是微博专业版我做了2个群刷模式,一个是切号模式一个是分身模式,分身我就不多说了大家都知道而且我在之前的快手、凹音和秘乐都说过,今天就简单说说切号模式。其实就是一个给客户端多个帐号来回登录和登出。 分身模式也做了很多修改可以保

zy0412326的专栏 4万+

俄罗斯方块的设计思路

前段时间帮人写了个俄罗斯方块的Demo,今天有时间分享下设计思路。 分析: 游戏中会出现7种形状,每种形状在游戏中都能够旋转,形成新的形状。每种形状都是由方形的色块组成的。 数据类: Shape:形状类,总共7个。 Block:方块类,其实只有一个贴图的属性。 关于旋转: 为每个形状寻找旋转点,每个形状的旋转点都是固定的。 红色的点为参考点,所在行列为(x,y) 在S

Freedom! 2万+
上一篇: 【python+情人节】玩个俄罗斯方块都是爱你的形状——一、思路分析
下一篇: 【python+情人节】玩个俄罗斯方块都是爱你的形状——四、动画展示
大爽歌
博客等级 码龄9年 422粉丝 92原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值