python tkinter实现俄罗斯方块基础版 —— 五、后续优化

Python复刻20款经典童年游戏:从贪吃蛇到坦克大战的完整开发指南 游戏开发是理解编程核心概念与工程实践的重要途径,其本质是将复杂逻辑拆解为数据、状态与交互的协同运作。从基础的状态机与队列应用,到网格化算法与碰撞检测原理,经典游戏如贪吃蛇、俄罗斯方块和飞机大战,分别诠释了数据结构、算法设计与面向对象编程的技术价值。这些项目不仅适用于Python初学者巩固语法,更能帮助开发者掌握事件循环、资源管理与性能优化等实战技能。通过Pygame、Tkinter等库,开发者可将理论应用于**游戏开发**与**Python项目实战**,在复刻童年记忆的过程中,系统提升从脚本编写到完整应用构 阅读详情

作者自我介绍:大爽歌, b站小UP主 ,直播编程+红警三 ,python1对1辅导老师 。

1 - 答评论问——卡顿优化

之前做过python tkinter实现俄罗斯方块的教程:
https://www.bilibili.com/video/BV1eJ411h7ZV
对应博客:https://blog.youkuaiyun.com/python1639er/article/details/104069590

后来有一些观众朋友反馈:玩到后面特别的卡顿。

由于我自己玩的时候感觉不卡(三五分钟都没啥卡顿感觉)
所以当时没有细想,以为是他们电脑配置或者改了代码的原因。

直到前不久,我直播写代码的时候,有个老哥又提到了这个卡顿的问题。
当时刚好有空,仔细看了下代码,发现确实有问题会导致卡顿。

那是什么问题导致了卡顿呢

是清理方块的方式有问题

游戏里面清理方块的方式:
是通过绘制一个新的背景色的方格覆盖来实现的。

具体的来讲

  • 当俄罗斯方块下落(左右移动同理)时
    其过程如示意图
    在这里插入图片描述

每一次移动都会新增四个方块进行绘制。

  • 当下落的俄罗斯方块填满一行,要清除的时候

代码里面是重新绘制整个面板所有方块。

每一次清理都会新增R*C个方块进行绘制
代码里面行数R为12,列数C为20
所以总数为240。
即每一次清理都会新增240个。

问题来了,所有这些新增的方块从未被清理过。
那么我们不难发现,随着时间的推移,方块越来越多,游戏因此越来越卡顿。

那么这个问题怎么解决呢?

修改清理方式,之前是通过用背景色覆盖来假清理。

下来我们需要想办法,对要去除的方块,实现真正的清理。

补充说明:
用背景色覆盖来进行清理的方法,在pygame里面经常会用到。
其在pygame里面应该是不会卡顿的,因为pygame的具体机制有些不同。

tkinter Canvas 类 提供了类方法delete来实现这样的清理。

该方法的详细解释可以看我最近的博客文章:
tkinter Canvas delete 方法详解

这里我们用该方法通过tag去删除已绘制的对象
代码示例如下

canvas.create_rectangle(50, 50, 100, 150, fill="red", tag="one")  # 绘制
canvas.delete("one")  # 清除tag为"one"的绘制对象,即上面的绘制
代码思路

既然要通过tag来删除绘制对象,那么我们就需要思考应该有几种tag。
或者说,有几种要清理的场景

通过上文的分析,不难想到有两种。

  1. 正在下落的俄罗斯方块,移动时要清理移动之前的俄罗斯方块。
    那么对正在下落的俄罗斯方块,不妨记其tag为"falling"
    移动正在下落的俄罗斯方块后,先清理掉tag为"falling"的,再绘制一遍俄罗斯方块。
  2. 已经落地的俄罗斯方块,凑齐一行后需要按行来清除。
    那么对于这些方块,记其tag为"row-%s" % r

所以tag有两类

  • "falling"
  • "row-%s" % r,记其 tag_kind 为"row"

而背景色方块只需要游戏开始时绘制一遍,后面不用再绘制,所以不需要清理,不设置tag。

修改draw_cell_by_cr

原来的draw_cell_by_cr为

def draw_cell_by_cr(canvas, c, r, color="#CCCCCC"):
    x0 = c * cell_size
    y0 = r * cell_size
    x1 = c * cell_size + cell_size
    y1 = r * cell_size + cell_size
    canvas.create_rectangle(x0, y0, x1, y1,fill=color, outline="white", width=2)

修改后为

def draw_cell_by_cr(canvas, c, r, color="#CCCCCC", tag_kind=""):
    x0 = c * cell_size
    y0 = r * cell_size
    x1 = c * cell_size + cell_size
    y1 = r * cell_size + cell_size
    if tag_kind == "falling":
        canvas.create_rectangle(x0, y0, x1, y1, fill=color,outline="white", width=2, tag=tag_kind)
    elif tag_kind == "row":
        canvas.create_rectangle(x0, y0, x1, y1, fill=color, outline="white", width=2, tag="row-%s" % r)
    else:
        canvas.create_rectangle(x0, y0, x1, y1, fill=color, outline="white", width=2)
修改对draw_cell_by_cr的调用
  • draw_board
    原来为
def draw_board(canvas, block_list):
    for ri in range(R):
        for ci in range(C):
            cell_type = block_list[ri][ci]
            if cell_type:
                draw_cell_by_cr(canvas, ci, ri, SHAPESCOLOR[cell_type])
            else:
                draw_cell_by_cr(canvas, ci, ri)

修改后为

# 绘制面板, 只有在第一次绘制时才绘制背景色方块
def draw_board(canvas, block_list, isFirst=False):
    # 删掉原来所有的行
    for ri in range(R):
        canvas.delete("row-%s" % ri)

    for ri in range(R):
        for ci in range(C):
            cell_type = block_list[ri][ci]
            if cell_type:
                draw_cell_by_cr(canvas, ci, ri, SHAPESCOLOR[cell_type], tag_kind="row")
            elif isFirst:
                draw_cell_by_cr(canvas, ci, ri)

同时修改原来,初始调用draw_board的代码(大概在91行左右的地方)
修改原来的draw_board(canvas, block_list)
为draw_board(canvas, block_list, True)

  • draw_cells
    原来为
def draw_cells(canvas, c, r, cell_list, color="#CCCCCC"):
    for cell in cell_list:
        cell_c, cell_r = cell
        ci = cell_c + c
        ri = cell_r + r
        # 判断该位置方格在画板内部(画板外部的方格不再绘制)
        if 0 <= c < C and 0 <= r < R:
            draw_cell_by_cr(canvas, ci, ri, color)

修改后为

def draw_cells(canvas, c, r, cell_list, color="#CCCCCC"):
    for cell in cell_list:
        cell_c, cell_r = cell
        ci = cell_c + c
        ri = cell_r + r
        # 判断该位置方格在画板内部(画板外部的方格不再绘制)
        if 0 <= c < C and 0 <= r < R:
            draw_cell_by_cr(canvas, ci, ri, color, tag_kind="falling")
  • draw_block_move
    原来为
def draw_block_move(canvas, block, direction=[0, 0]):
    shape_type = block['kind']
    c, r = block['cr']
    cell_list = block['cell_list']

    # 移动前,先清除原有位置绘制的俄罗斯方块,也就是用背景色绘制原有的俄罗斯方块
    draw_cells(canvas, c, r, cell_list)

    dc, dr = direction
    new_c, new_r = c+dc, r+dr
    block['cr'] = [new_c, new_r]
    # 在新位置绘制新的俄罗斯方块就好
    draw_cells(canvas, new_c, new_r, cell_list, SHAPESCOLOR[shape_type])

修改后为

def draw_block_move(canvas, block, direction=[0, 0]):
    shape_type = block['kind']
    c, r = block['cr']
    cell_list = block['cell_list']

    # 移动前,清除原有位置绘制的俄罗斯方块
    canvas.delete("falling")

    dc, dr = direction
    new_c, new_r = c+dc, r+dr
    block['cr'] = [new_c, new_r]
    # 在新位置绘制新的俄罗斯方块就好
    draw_cells(canvas, new_c, new_r, cell_list, SHAPESCOLOR[shape_type])
  • save_block_to_list
    原来为
def save_block_to_list(block):
    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
        # block_list 在对应位置记下其类型draw_cells
        block_list[r][c] = shape_type

修改后为

def save_block_to_list(block):
    # 清除原有的打上了 falling 标签的方块
    canvas.delete("falling")

    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
        # block_list 在对应位置记下其类型
        block_list[r][c] = shape_type

        draw_cell_by_cr(canvas, c, r, SHAPESCOLOR[shape_type], tag_kind="row")

到这里,就改好了。
此时运行软件,应该就没有越玩越卡顿的问题了。

如果还卡,那可能又有其他bug(雾

Python递归图形绘制:从谢尔宾斯基到分形艺术 递归算法是计算机科学中的基础概念,通过函数自我调用实现复杂问题的分解。在图形绘制领域,递归尤其适合生成具有自相似特性的分形结构,如著名的谢尔宾斯基地毯和三角形。这类算法不仅展示了数学之美,更能训练程序员的抽象思维能力。使用Python的turtle模块可以直观实现这些图形,过程中涉及递归深度控制、坐标计算优化等关键技术点。分形图形在数据可视化、游戏设计、艺术创作等领域都有广泛应用,本文通过谢尔宾斯基结构的实现案例,演示了如何将递归思维转化为可视化成果,并分享性能调优的工程实践经验。 阅读详情

相关推荐

软件工程毕业设计选题指南:50个题目精析与避坑策略

软件工程毕业设计是学生综合运用所学知识、完成工程实践的关键环节,其选题直接关系到项目的可行性与最终成果的价值。一个优秀的选题需要平衡个人技术栈、课题创新性与可实现性,遵循“黄金三角”原则。在技术实现层面,无论是采用主流的Spring Boot+Vue前后端分离架构开发Web应用,还是运用微服务、容器化技术构建分布式系统,亦或是集成深度学习模型开发智能应用,其核心都在于将工程思维与具体技术栈有效结合,解决实际问题。本文聚焦软件工程毕业设计,提供了涵盖Web应用、移动开发、人工智能、系统工具等六大类共50个具体

weixin_34301132的博客 319

四、当一行满了之后就消除,Python基于thinker实现的简单的俄罗斯方块小游戏

*功能:**当一行满了之后就消除。

2301_76484015的博客 402

即梦 AI 全功能零基础详细教程(纯技术版)

即梦 AI 是一款多模态 AI 生成工具,主打文本生成视频、图片生成视频、角色一致性生成、音画同步等核心功能,依托自研 AI 视觉模型,实现从文本 / 图片 / 音频素材输入,到高清视频、图像内容输出的全流程 AI 创作,支持短视频、短剧、创意素材等多场景创作,具备操作门槛低、生成效率高、画面可控性强的技术特点。@为工具内置引用指令,作用是锁定指定素材 / 角色,强制 AI 按照该素材的核心特征生成内容,无额外付费、解锁要求,免费使用。剧本拆分:将短剧拆分为单镜头(15 秒内 / 个)

2501_92061023的博客 5830

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

【SigmaStar SSC335系列】空片用Flash_Tool烧写

简介 本文主要讲新拿到的PCBA,板上spi nand flash还是空的,如何在这种情况下烧录固件,这里讲解用官方Flash_Tool烧写的方式。 但只讲一些注意的地方和坑,其它的官方文档里说的比较清楚,不多说。 准备 Flash_Tool烧写软件 编译打包好烧写镜像 串口烧录小板 ----- 这个是个坑,在官方文档里并没有提及,刚开始用的平时调试的USB转串口,怎么都没反应,一度不知烧写软件不对还是硬件有问题,最后通过厂家技术支持才得知,除了专门的Flash_Tool外,还要专门的串口烧录器

老K 4699

从原理到应用:深入解析双编码器在机器人关节力矩感知中的实现

本文深入解析了双编码器方案在机器人关节力矩感知中的实现原理与应用。该方案通过在电机侧和输出侧分别安装编码器,利用两者位置差异间接高精度计算外力,克服了传统电流环精度不足和扭矩传感器成本高昂的缺点。它为实现协作机器人的丝滑拖动示教、灵敏碰撞检测以及足式机器人的动态平衡与柔顺控制提供了关键技术支撑,是目前高性能机器人力控的主流选择。

t8u9v0w1x的博客 662

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

实战分享:如何利用svchost进程绕过360防护(附完整Shellcode注入教程)

本文深入解析系统进程安全防护机制,探讨svchost等关键进程的安全特性与防护策略。详细分析安全软件的行为检测和内存保护技术,提供系统加固与监控实践建议,助力企业构建多层次防御体系,有效应对潜在安全威胁。

weixin_30752699的博客 99

Python tkinter还原俄罗斯方块学习笔记

python tkinter实现俄罗斯方块 学习笔记

a_diligenter的博客 929

英飞凌AURIX™ Development Studio(ADS)工程调试与烧录实战指南

本文详细介绍了英飞凌AURIX™ Development Studio(ADS)的工程调试与烧录实战指南。从调试环境搭建、硬件连接到断点设置、变量监控等核心调试技巧,帮助开发者快速掌握ADS安装使用教程,提升多核处理器开发效率。

k8l9m0n的博客 574

2026最新openclaw(clawbot/moltbot)真正在自己个人电脑上搭建部署,配置飞书远程远程让AI助理操控电脑完成任务,以及结合ollama无限token实现7*24小时工作(附配置)

2026最新openclaw(clawbot/moltbot)真正在自己个人电脑上搭建部署,配置飞书远程远程让AI助理操控电脑完成任务,以及结合 ollama 无限token实现7*24小时工作,以及部署安装需要的 skills 完成复杂的工作任务(附完整可以运行的配置文件)。 很多人已经会配置安装 openclaw 了 ,但是 安装完成之后真正让电脑自动运行起来的很好,完成出色工作的更少,最常见的就是聊聊天,或者执行一些简单的命令,理解要让电脑自动化工作,openclaw、skills、大模型这三样。

代码讲故事 2963

vue watch深度监控一个对象下新增属性不生效问题

先简单还原下项目中遇到的问题: adc为一个空对象,watch深度监听abc下的pageNum属性(此时还没有)。 data() { return { abc: { } } }, watch:{ 'abc': { deep:true, immediate:true, handler(newV){ this.pageNum = newV.pageNum } } }

qq_40106513的博客 1311

【网络安全】零基础入门网络安全劝退指北

作为从16年接触网络安全的小白,谈谈零基础如何入门网络安全,有不对的地方,请多多指教。 这些年最后悔的事情莫过于没有把自己学习的东西积累下来形成一个知识体系。 后续我也会陆续的整理网络安全的相关学习资料及文章,与大家一起探讨学习。 如何入门 简单了解网络安全 网络安全就是指的确保网络系统中的数据不被别人破坏,而网安工程师就是涉及程序来维护网络安全。 网安方向有很多职位,比如安全产品工程师,安全分析师,数据恢复工程师,网络架构工程师,安全编程工程师,以及网络集成工程师等。 工作内容主要包括: 安全评测,风

互联网老辛 4586

用python自带的tkinter做游戏(二)—— 俄罗斯方块 篇

俄罗斯方块相信大家都玩过

znix1116的博客 6496

Cesium+Vue3教程(003):基于Vue3的Cesium自定义地图和地图叠加

在 Cesium 中,是用于加载地表影像图层的核心接口。通过它,您可以将各种地图服务(如卫星影像、街道地图、自定义瓦片等)加载到 Cesium 的地球上。Cesium 提供了多个内置的。

WwLK123的博客 635

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

100行Python代码实现俄罗斯方块,不需要第三方依赖

100行实战项目已开启,每日分享100行小项目,今日分享100使用python 实现俄罗斯方块,感兴趣的朋友快来看看吧,我们不定期更新100行实战项目

ruzhila的博客 1336

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

用python的tkinter做游戏(九)—— 坦克大战 正式篇

用python的tkinter做游戏 系列: 用python自带的tkinter做游戏(一)—— 贪吃蛇 篇 用python自带的tkinter做游戏(二)—— 俄罗斯方块 篇 用python自带的tkinter做游戏(三)—— 推箱子简易版 篇 用python的tkinter做游戏(四)—— 推箱子重制版 篇 用python的tkinter做游戏(五)—— 魔塔 篇 用python的tkinter做游戏(六)—— 坦克大战或射击游戏Demo 篇 用python的tkinter做游戏(七)—— 双人射击游戏

znix1116的博客 1万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

用python的tkinter做游戏(四)—— 推箱子重制版

今天继续:用python自带的tkinter做游戏系列的第四弹,推箱子重制版 篇 之前的三篇博文介绍的分别是贪食蛇和俄罗斯方块,还有推箱子的简易版。 用python自带的tkinter做游戏(一)—— 贪吃蛇 篇 用python自带的tkinter做游戏(二)—— 俄罗斯方块 篇 用python自带的tkinter做游戏(三)—— 推箱子简易版 篇 上回发布的推箱子游戏中,我后来发现一个BUG,就是在大地图的关卡中(第六关),如果人物远离初始地后,按J键复位的话画面不会返回到人物所在的坐标处。今天要讲的重制

znix1116的博客 3367

深入解析Tkinter pack布局:从核心算法到复杂界面实战

在Python GUI开发中,布局管理器是构建用户界面的基础组件,它决定了控件在窗口中的排列与自适应方式。Tkinter作为Python标准GUI工具包,提供了pack、grid和place三种布局管理器,其中pack以其独特的“打包”算法著称。其核心原理是基于“剩余空间”的自动分配与填充机制,通过side、fill、expand等参数的协同,实现控件的顺序排列与动态扩展。这一机制的技术价值在于能够快速构建自适应界面,显著提升开发效率,尤其适用于工具栏、设置面板、导航栏等线性或区块化布局场景。本文将聚焦pa

weixin_34416754的博客 404

《青少年Python趣学编程(微课视频版)》,开启你的数字建筑师之旅!

未来已来,你准备好迎接挑战了吗?在这个AI时代,市面上的Python书籍常常过于枯燥,难以激发青少年的兴趣。而《青少年Python趣学编程(微课视频版)》通过 精美的图像 🎨、炫酷的动画效果 ✨、有趣的小游戏 🎮,打造了一种轻松愉快的学习方式,非常适合青少年在玩中学、学中玩!🎉更是加入了全新的趣味原创案例:跳动的爱心动画移动爱心界面消消乐小游戏球球大作战小游戏书中的每个案例都进行了长期的丰富与优化,以最有趣的方式呈现给大家!🎨💡购书链接 🛒。

weixin_41851599的博客 1026

Python贪吃蛇游戏开发全流程:从零实现经典游戏

游戏开发是编程学习中的重要实践领域,它融合了算法逻辑、状态管理和用户交互等核心计算机概念。其基本原理是通过事件循环驱动游戏状态更新,结合图形渲染实现动态可视化。在技术价值上,游戏项目能系统训练程序员的模块化设计、调试和问题解决能力,是巩固编程基础的绝佳方式。典型的应用场景包括教学演示、算法验证和休闲娱乐工具开发。本文以经典的贪吃蛇游戏为例,详细拆解其开发全流程,涵盖环境搭建、核心逻辑实现和界面美化等关键环节,为初学者提供一套可直接复用的Python代码和清晰的实现思路,帮助开发者通过动手实践提升编程技能。

weixin_34413802的博客 349

PyGame游戏开发入门:从零构建弹跳方块与接球游戏

游戏开发是编程学习的重要实践领域,其核心在于理解游戏循环、事件处理和状态管理。游戏循环作为程序的“心脏”,通过持续的事件轮询、状态更新和画面渲染,将静态代码转化为动态交互体验。在Python生态中,PyGame作为基于SDL库的经典模块,为初学者提供了理解底层逻辑、亲手实现游戏功能的绝佳起点。它封装了跨平台的多媒体处理功能,让开发者能专注于游戏逻辑本身,如碰撞检测和精灵管理。通过构建弹跳方块和接球游戏等小项目,开发者可以掌握图像绘制、精灵系统、声音处理等关键技术,为后续学习更专业的游戏引擎打下坚实基础。

weixin_33875564的博客 421

Python小游戏项目实战:从环境搭建到源码魔改的进阶指南

Python作为一门广泛应用于自动化、数据分析及Web开发的高级编程语言,其核心价值在于通过清晰的语法和丰富的库生态,帮助开发者高效构建各类应用。理解Python编程不仅需要掌握基础语法和数据结构,更需通过实际项目来深化对事件驱动、面向对象等编程范式的认知。在游戏开发这一具体应用场景中,Python凭借Pygame等库,为学习图形渲染、碰撞检测和游戏循环等核心概念提供了绝佳实践平台。通过系统学习Python小游戏源码,开发者能有效提升代码调试、功能扩展和项目重构能力,这正是从“摸鱼”消遣转向“精进”技能的关

weixin_34318326的博客 435

Tetris 开源项目教程

Tetris 开源项目教程 项目介绍 该项目是基于GitHub的"Tetris"实现,由k-vernooy开发。它提供了一个简单的命令行界面或可能是一个网页版本的俄罗斯方块游戏,允许玩家体验这一经典游戏的编程实现。尽管原仓库未详细说明技术栈和具体功能,传统的Tetris实现通常涉及基础的数据结构(如数组或列表)来管理游戏板,以及事件处理机制来响应用户输入。 项目快速启动 要开...

gitblog_00355的博客 847

基于Python与Pygame的多功能游戏系统设计与实现

基于Python与Pygame的多功能游戏系统是一个集成了多种经典小游戏与实用工具的综合系统,专为计算机科学和软件工程专业的毕业设计项目而开发。该系统不仅包含了丰富的游戏模块,如飞船大战、坦克大战、扫雷、俄罗斯方块、五子棋、贪吃蛇和数字游戏,还整合了成绩管理系统与天气查询系统,以及使用turtle库绘制小猪佩奇、皮卡丘和哆啦A梦的趣味功能。系统采用模块化架构设计,确保各功能模块独立且易于扩展,同时结合事件驱动架构和GUI架构,提供流畅的用户交互体验。 在技术实现上,系统主要基于Python编程语言,利用N

ztt123654的博客 995

Python游戏编程实战:100个小游戏源码解析与学习路径规划

Python作为一门易学易用的编程语言,其核心语法和数据结构是初学者入门的关键。通过理解变量、循环、函数和列表等基础概念,开发者可以掌握程序运行的基本原理。在工程实践中,将这些原理应用于具体项目能显著提升技术能力,而游戏开发正是绝佳的实践场景。它融合了算法逻辑、状态管理和用户交互,让学习过程更具趣味性和目标感。本文聚焦于利用Python游戏项目进行高效学习,通过分析贪吃蛇、2048等经典案例的源码,深入探讨游戏循环、碰撞检测和矩阵操作等关键技术,并结合Pygame库的应用,为不同阶段的开发者规划了一条从模仿

weixin_30522183的博客 369
上一篇: tkinter Canvas delete 方法详解
下一篇: python从入门到撩妹 2 —— 30行代码实现520小彩蛋
大爽歌
博客等级 码龄9年 422粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值