wxPython和pycairo练习记录15

3天干完6个月的活,Claude把模型搬上AMD 一条挺刺激的消息:Anthropic 给投资人的材料里有一张幻灯片,写着它的 Claude Mythos Preview 只花了大约​,就摸清了怎么让另一个 Claude 模型在 AMD 的 MI355X 上跑起来。同一处还写了个对照数字:过去给一块新芯片做推理适配,通常要几十名工程师、​。3 天对 6 个月,这个比值太扎眼,当天中文互联网上就冒出一堆「英伟达的护城河塌了」的说法。我把能翻到的材料都翻了一遍,越看越觉得,塌掉的那一小块是真的,可塌的位置和很多人想的不一样。 阅读详情

wxPython和pycairo练习记录15

BitMask

BitMask 有翻译成位掩码,也有翻译成位遮罩的。BitMask 用作碰撞检测的原理是将屏幕划分成二维网格,每个网格用一个 bit 表示,没有碰撞体填0,有碰撞体填1。这样,将屏幕划分为 N行 * N列 的矩形网格,网格宽度和高度都设定为8像素,当主角的像素坐标是 (100, 100) 时,向下取整 100/8 即网格坐标为 (12, 12),只要判断这一格是1还是0,就可以判断它能否碰撞了。

来源:位遮罩(BitMask)碰撞检测技术 https://zhuanlan.zhihu.com/p/425402147 作者:皮皮关​

Bitmask

pygame 中每个像素都分别表示一格,需要根据每个像素的值来计算存储0还是1,那像素到底是什么?

什么是像素

像素:是指在由一个数字序列表示的图像中的一个最小单位,称为像素。来源:https://baike.baidu.com/item/%E5%83%8F%E7%B4%A0/95084

这里的像素并非我们平时所说的眼睛看到的点,它更像是屏幕上的一个网格,不同的显示设备可能有不同大小的格子。在 Python 中,我们可以方便地通过一些库读取图像的某个像素值。以 PIL 为例(安装 pip install Pillow):

# -*- coding: utf-8 -*-
from io import BytesIO
import requests
from PIL import Image


resp = requests.get("https://img-home.csdnimg.cn/images/20201124032511.png")
stream = BytesIO(resp.content)
img = Image.open(stream).convert('RGBA')
# img.show()
# print(img.size)
print(img.getpixel((10, 44)))
# (215, 149, 113, 210)

这个例子中,返回的像素值是 RGBA 数值元组。

collide_mask

collide_mask 方法正是通过 BitMask 来检测碰撞的,它会先检查 Sprite 对象有没有 mask 属性,如果没有就根据 surface 创建 mask。有时候需要不同于 surface 形状的 mask,还是有必要区分开的,所以得在原来坦克游戏的 Sprite 类中添加 mask 属性。

先看看 mask 到底是什么,文档中说 Mask 是用于表示二维位掩码的 pygame 对象。pygame.mask.from_surface是通过判断像素透明度值来填充0或1,默认透明度阈值是127,0为完全透明,255为完全不透明,默认大于127即填充为1,小于等于127填充为0,返回的结果就是0和1组成的一维数组,通过除以行宽得到类似二维数组。

创建 10*10 的透明 surface,在坐标 (0, 0) 画上红色填充的 5*5 矩形,转换为 mask,最终得到 10 * 10 的01数组
>>> import pygame
>>> surface = pygame.Surface((10, 10), pygame.SRCALPHA, 32)
>>> pygame.draw.rect(surface, (255, 0, 0, 255), pygame.Rect(0, 0, 5, 5), 1)

>>> surface.get_at((0, 0))
(255, 0, 0, 255)
>>> surface.get_at((5, 5))
(0, 0, 0, 0)
>>> surface.get_at((4, 4))
(255, 0, 0, 255)

>>> mask = pygame.mask.from_surface(surface)
>>> mask.get_size()
(10, 10)
>>> mask.get_at((0, 0))
1
>>> mask.get_at((5, 5))
0
>>> mask.get_at((4, 4))
1

文档:
https://www.pygame.org/docs/ref/mask.html
Mask

源码查看:

https://www.pygame.org/docs/ref/mask.html#pygame.mask.from_surface
from_surface(surface) -> Mask
from_surface(surface, threshold=127) -> Mask


https://www.pygame.org/docs/ref/mask.html#pygame.mask.Mask
Mask(size=(width, height)) -> Mask
Mask(size=(width, height), fill=False) -> Mask


https://github.com/pygame/pygame/blob/main/src_c/mask.c#L826
static PyObject *
mask_from_surface(PyObject *self, PyObject *args, PyObject *kwargs)
    int threshold = 127; /* default value */
    int use_thresh = 1;
    maskobj = CREATE_MASK_OBJ(surf->w, surf->h, 0);
    use_thresh = (SDL_GetColorKey(surf, &colorkey) == -1);
    if (use_thresh) {
        set_from_threshold(surf, maskobj->mask, threshold);
    }
    else {
        set_from_colorkey(surf, maskobj->mask, colorkey);
    }

static void
set_from_threshold(SDL_Surface *surf, bitmask_t *bitmask, int threshold)
{
    SDL_PixelFormat *format = surf->format;
    Uint8 bpp = format->BytesPerPixel;
    Uint8 *pixel = NULL;
    Uint8 rgba[4];
    int x, y;

    for (y = 0; y < surf->h; ++y) {
        pixel = (Uint8 *)surf->pixels + y * surf->pitch;

        for (x = 0; x < surf->w; ++x, pixel += bpp) {
            SDL_GetRGBA(get_pixel_color(pixel, bpp), format, rgba, rgba + 1,
                        rgba + 2, rgba + 3);
            if (rgba[3] > threshold) {
                bitmask_setbit(bitmask, x, y);
            }
        }
    }
}


https://github.com/pygame/pygame/blob/main/src_c/include/pygame_mask.h#L28
typedef struct {
    PyObject_HEAD bitmask_t *mask;
    void *bufdata;
} pgMaskObject;


https://github.com/pygame/pygame/blob/main/src_c/include/bitmask.h#L53
#define BITMASK_W unsigned long int
#define BITMASK_W_LEN (sizeof(BITMASK_W) * CHAR_BIT)
#define BITMASK_W_MASK (BITMASK_W_LEN - 1)
#define BITMASK_N(n) ((BITMASK_W)1 << (n))

typedef struct bitmask {
    int w, h;
    BITMASK_W bits[1];
} bitmask_t;

/* Sets the bit at (x,y) */
static INLINE void
bitmask_setbit(bitmask_t *m, int x, int y)
{
    m->bits[x / BITMASK_W_LEN * m->h + y] |= BITMASK_N(x & BITMASK_W_MASK);
}

除了碰撞检测,暂时没有对 Mask 进行其他操作的需求,就不单独创建类了,使用 namedtuple 记录 Mask 的属性。bitmask.c 里转换来转换去,看着有点懵,其实就是通过尺寸和坐标差判断有没有相交,确定相交形成的矩形的左上角顶点分别相对于两个 Mask 矩形左上角作为原点的坐标,遍历相交部分有没有某个点的值同时为1。用 PIL 转换 cairo.ImageSurface-> wx.Bitmap -> wx.Image -> Image 要么提示 format 不对,要么提示 buffer 不够大,最后还是直接用 wx.Image.GetAlpha() 直接获取透明值列表。
https://github.com/pygame/pygame/blob/main/src_py/sprite.py#L1664
https://github.com/pygame/pygame/blob/main/src_c/bitmask.c#L258

    @staticmethod
    def collide_mask(left, right):
        xoffset = right.GetX() - left.GetX()
        yoffset = right.GetY() - left.GetY()
        leftmask = left.GetMask() or Collision.mask_from_surface(left.GetSurface())
        rightmask = right.GetMask() or Collision.mask_from_surface(right.GetSurface())
        return Collision.mask_overlap(leftmask, rightmask, xoffset, yoffset)

    @staticmethod
    def mask_from_surface(surface, threshold=127):
        bmp = wx.lib.wxcairo.BitmapFromImageSurface(surface)
        img = bmp.ConvertToImage()
        alphas = list(img.GetAlpha())
        # pilimg = Image.frombuffer("RGBA", (surface.get_width(), surface.get_height()), img.GetDataBuffer())
        #
        # bits = []
        # for y in range(pilimg.height):
        #     for x in range(pilimg.width):
        #         alpha = pilimg.getpixel((x, y))[-1]
        #         bits[pilimg.width * y + x] = (alpha > threshold) and 1 or 0
        bits = []
        for alpha in alphas:
            bits.append((alpha > threshold) and 1 or 0)

        return Collision.Mask(surface.get_width(), surface.get_height(), bits)

    @staticmethod
    def mask_overlap(a, b, xoffset, yoffset):
        if ((xoffset >= a.w) or (yoffset >= a.h) or (yoffset <= -b.h) or
                (xoffset <= -b.w) or (not a.h) or (not a.w) or (not b.h) or (not b.w)):
            return False

        if xoffset >= 0:
            a_entry_x = abs(xoffset)
            b_entry_x = 0
            overlap_w = a.w - abs(xoffset)
        else:
            a_entry_x = 0
            b_entry_x = abs(xoffset)
            overlap_w = b.w - abs(xoffset)

        if yoffset >= 0:
            a_entry_y = abs(yoffset)
            b_entry_y = 0
            overlap_h = a.h - abs(yoffset)
        else:
            a_entry_y = 0
            b_entry_y = abs(yoffset)
            overlap_h = b.h - abs(yoffset)

        for y in range(overlap_h):
            for x in range(overlap_w):
                if (a.bits[a.w * (a_entry_y + y) + a_entry_x + x] == 1 and
                        b.bits[b.w * (b_entry_y + y) + b_entry_x + x] == 1):
                    return True

单元测试

https://github.com/pygame/pygame/blob/main/test/sprite_test.py#L198

    def test_collide_mask__opaque(self):
        # create before wx.lib.wxcairo.BitmapFromImageSurface
        app = App()
        # make some fully opaque sprites that will collide with masks.
        for s in [self.s1, self.s2, self.s3]:
            surface = s.GetSurface()
            ctx = Context(surface)
            ctx.set_source_rgba(255, 255, 255, 255)
            ctx.paint()
            s.SetSurface(surface, surface.get_width(), surface.get_height())

        # masks should be autogenerated from image if they don't exist.
        self.assertTrue(Collision.collide_mask(self.s1, self.s2))
        self.assertFalse(Collision.collide_mask(self.s1, self.s3))

        for s in [self.s1, self.s2, self.s3]:
            surface = s.GetSurface()
            mask = Collision.mask_from_surface(surface)
            s.SetMask(mask)

        # with set masks.
        self.assertTrue(Collision.collide_mask(self.s1, self.s2))
        self.assertFalse(Collision.collide_mask(self.s1, self.s3))

    def test_collide_mask__transparent(self):
        # create before wx.lib.wxcairo.BitmapFromImageSurface
        app = App()
        # make some sprites that are fully transparent, so they won't collide.
        for s in [self.s1, self.s2, self.s3]:
            surface = s.GetSurface()
            ctx = Context(surface)
            ctx.set_source_rgba(255, 255, 255, 0)
            ctx.paint()
            mask = Collision.mask_from_surface(surface, 255)
            s.SetMask(mask)

        self.assertFalse(Collision.collide_mask(self.s1, self.s2))
        self.assertFalse(Collision.collide_mask(self.s1, self.s3))

还没有实际使用,有些问题可能暂时没发现。

如何处理动态语言(Python / JS)的“隐形”调用链? 本文揭示动态语言(Python/JS)中静态AST解析导致调用链“断链”的核心问题,提出通过运行时追踪补全图谱的解决方案。基于Code-Graph-RAG的cgr trace机制,分别利用pytest插件与V8 Profiler捕获真实调用路径,将动态边合并至静态图谱,并在权重体系中提升动态边优先级。实践表明,该方法可显著提升图谱覆盖率,实现“结构+行为”双视角理解代码,为MCP与Rerank系统提供可靠支持。 阅读详情

相关推荐

Playwright: Pytest vs Library vs LibraryAsync:三者如何选?

Python中Playwright的3个Target:Pytest(推荐用于E2E自动化测试,支持报告、并行、重试)、Library(同步脚本,适合爬虫与简单任务,需手动管理浏览器)、LibraryAsync(异步脚本,适用于高并发批量操作)。选择依据:测试项目选Pytest,轻量脚本选Library,高并发场景选LibraryAsync。

SmallBull的博客 215

windows上放弃使用PyGTK

windows上放弃使用PyGTK windows上放弃使用PyGTK - riag的专栏 - 博客频道 - youkuaiyun.com windows上放弃使用PyGTK 分类: python 2010-03-31 16:47 710人阅读 评...

106

python + QXDM5高通平台通过自动化截取log方法及代码

python + QXDM5高通平台通过自动化截取log方法及代码

dgzj2001的博客 1821

本地化部署 DeepSeek,构建单细胞与空间转录组 AI 分析平台

本地化部署 DeepSeek,构建单细胞与空间转录组 AI 分析平台

weixin_53637133的博客 177

WSL2离线安装Ubuntu终极指南:绕过Microsoft Store慢速下载(附最新22.04 LTS离线包)

本文提供WSL2离线安装Ubuntu 22.04 LTS的完整指南,帮助开发者绕过Microsoft Store下载慢的问题。通过PowerShell命令配置环境、获取离线安装包并完成安装,同时包含初始配置、资源优化及常见问题解决方案,助您快速搭建高效的Linux开发环境。

c8d9e0f1的博客 900

OpenClaw实战系列03:Slack/Telegram国际版接入实战指南

在当今的软件开发和工作流自动化中,将项目管理工具与即时通讯平台集成已成为提高团队协作效率的关键。OpenClaw作为一个开源的自动化工具,通过接入Slack和Telegram国际版,可以实现实时通知、自动化任务触发和团队协作的无缝对接。本文将详细介绍如何实现OpenClaw与这两个主流即时通讯平台的集成。OpenClaw是一个开源的自动化工作流引擎,支持多种触发器和执行器,能够帮助开发团队实现CI/CD流程、任务调度、监控告警等自动化场景。模块化设计:支持插件化扩展多触发器支持。

PeterPan的博客 588

AI全栈实战 | 3.9-01 爬虫入门:requests 加 BeautifulSoup 三分钟跑通,但 90% 的人栽在这 4 个“礼貌“问题上

⚠️:本文内容仅用于。请遵守目标站点的服务条款与相关法律法规,不得对目标服务造成负担,不得采集、传播个人隐私数据。技术是中性的,边界在你手里。爬虫的入门技术(requests 发请求 + BeautifulSoup 解析)三分钟就能学会。真正区分"会用爬虫"和"会做爬虫的人"的,是这篇我们跑通"请求→解析→存储"的最小闭环,然后重点把"合规与礼貌"这根弦给你绷上。

源码获取 | 运行部署 | 定制二开修改,如果回复不及时请耐心等待,请见谅。 425

STC单片机 普通 I/O 口中断功能介绍和使用

STC32单片机 普通 I/O 口中断功能介绍和使用

perseverance51博客 3048

从一段视频到可漫游的 4D 有声场景:思路拆解与最小复现手记

只需一段手机视频,你就能生成可"走进去"的 4D 有声场景:转头时狗叫声方向随之变化,走近时声音更清晰。本文拆解 Video-to-4DAVScene 的核心思路,手把手带你用几十行 Python 搭出最小管线,把视频中的运动物体变成带空间位置的声源,并附上三个真实踩坑的排障经验,代码可直接跑。🎧

helloagent的博客 241

DiffusionDriveV2 (1) : 端到端自动驾驶中受强化学习约束的截断扩散建模

DiffusionDriveV2:强化学习约束的截断扩散模型在端到端自动驾驶中的应用 本文针对端到端自动驾驶中扩散模型面临的模式崩溃问题,提出DiffusionDriveV2框架。该方法通过引入强化学习约束,解决了DiffusionDrive依赖模仿学习导致的多样性与持续高质量之间的困境。主要创新包括: 采用尺度自适应乘法噪声促进广泛探索 提出锚点内GRPO管理单个锚点样本间的优势估计 设计锚点间截断GRPO整合全局视角,避免不同驾驶意图间的不当比较 实验表明,该方法在NAVSIM基准测试中达到最先进水平(

@bangbang的博客 382

古风仙侠少女三视图提示词,一键生成角色设定

3D中国写实CG风格,CG渲染质感,精细3D建模,PBR物理材质,细腻服装纹理,电影级灯光,丰富表情,高精度场景,次世代引擎画质。平视正交视角,统一光照,纯白背景,无文字无水印,避免强透视和动态变形。3D中国写实CG风格,CG渲染质感,精细3D建模,PBR物理材质,细腻服装纹理,电影级灯光,丰富表情,高精度场景,次世代引擎画质。3D中国写实CG风格,CG渲染质感,精细3D建模,PBR物理材质,细腻服装纹理,电影级灯光,丰富表情,高精度场景,次世代引擎画质。少女,古风仙侠少女气质,灵动、温婉、仙气。

欢迎来到鸾姝淡月博客,专为程序员和编程爱好者打造的技术博客。我们分享编程语言趋势、开发工具、编程哲学、职业发展等,助你掌握新技术,优化技能,激发编程热情。 1081

【每天一个 Python 小案例30】Python 基础知识综合小项目:我的工具盒

作为系列收官,本篇把前 29 篇的知识点合成一个能直接用的命令行工具"我的工具盒":计算器(用 ast 解析表达式,不碰 eval)、单位换算与温度转换(一张换算表 + 特例分支)、记账与分类统计(Decimal + JSON 持久化)、以及用"字典当命令表"把菜单和业务逻辑解耦的主循环。文中对比了 eval 的安全隐患与 ast 白名单的做法,解释了 lambda 闭包在字典里的写法与晚绑定陷阱,并在最后给出整个系列的知识地图,把变量、数据结构、控制流、函数、类、异常、文件、标准库八块内容对应到具体篇目。

xinjiyaya的博客 427

软件产品国际化:前后端及App多语言版本解决方案(超详细实现过程)

多语言版本解决方案是应对全球化趋势的关键策略,它通过构建灵活且可扩展的架构,支持软件产品在不同语言和文化环境下的顺畅运行与展示。此方案涵盖了前端多语言界面实现、后端多语言数据处理及大数据环境下的多语言支持等多个层面,确保公司能够高效地推出适应全球用户多样化需求的软件产品。在前端多语言界面实现方面,解决方案采用了国际化与本地化的结合方法。国际化过程确保软件的功能和代码设计能够处理多种语言和文化习惯,而本地化则针对特定地区进行界面和内容的调整。

大模型大数据攻城狮的专栏 2755

yolo 和 deft 算法的区别

你应该是打错了:是,不是 defrat;

曾大强博客 256

基于STC8G1K08A单片机的7位PWM输出程序(PCA功能实现呼吸灯效果)

摘要:本文展示了基于STC8G单片机的PWM占空比控制实现。通过定时器0中断每5ms调整占空比(0-127范围),实现呼吸灯效果。关键代码包括:1)PWM初始化(7位PWM模式);2)定时器配置(1ms中断);3)主循环根据标志位动态调整占空比。硬件采用P5.4引脚输出PWM信号,通过direction标志实现占空比自动增减循环。该方案适用于LED亮度调节等场景,系统时钟24MHz,采用12T模式。

weixin_74013772的博客 868

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

二进制木马免杀-Python 分离免杀与 Web 挂马

二进制木马免杀-Python 分离免杀与 Web 挂马

2503_94637398的博客 269

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级 备考:莫队算法离线区间查询详解

备赛进行时:第十八届蓝桥杯软件赛报名已于 2026-10-08 10:00 开启、12-18 14:00 截止,省赛定在 2027-04-10(C/C++·Python 程序设计 9:00–13:00);中国电子学会 2026 年 12 月软件编程(C/C++ 一级至十级、Python 一级至六级)考级报名 9/23–12/2 16:00、统考 12-12;全国青少年信息素养大赛 2026—2027 赛季算法应用主题赛也已进入复盘练兵窗口。

IT_Scratch的博客 170

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

两张表合并之后,行数悄悄多了一倍

pandas merge 行数异常膨胀源于右表键不唯一,导致数据静默复制。实测显示,未聚合的右表(756行)与左表合并后行数增至504行,合计膨胀3.5倍,但无报错。validate 参数仅在检查键唯一性时有效,one_to_one 和 many_to_one 可拦截问题,但需结合 duplicated() 前置检查。正确做法为先按键聚合右表,再合并,避免重复。建议合并前后核对行数、合计,并使用 indicator=True 排查匹配情况,确保数据一致性。

patrickstar231的博客 226

智慧农业实战:育秧车间秧盘计数与苗情分级的Python实现

首先,建立统一的数据结构,保存每盘秧苗的编号、批次、覆盖度、叶色得分和播种天数。A = "壮苗"B = "合格苗"C = "弱苗"@dataclassdays: int。

荆棘鸟智能的博客 118

我用 200 行代码写了个“代码屎山检测器“,扫完公司的老项目后我沉默了

这个工具不能帮你把屎山铲平,但至少能让你知道自己面对的是多大的山,也能在代码评审时用数据说话——“这个 PR 把圈复杂度从 12 推到了 18,能不能拆一下?毕竟,不能量化的东西,就没法改进。

xixiaoyunya的博客 251

智叟云集-手机证据抓取系统的工程结构与应用入口

本文系统阐述手机证据抓取系统的工程结构与应用入口,涵盖四大层面:工程目录划分(Android、Python服务、Web页面、测试与构建工具);Android组件通过Manifest声明可启动页面,主界面由MainActivity管理;Python服务通过run.py解析参数并启动FastAPI应用,支持远程访问;浏览器页面采用HTML/CSS/JS分离架构,静态资源通过路径关联,实现动态交互。各模块分工明确,协同构建可运行的采集系统。

2301_77178996的博客 237

Java Arrays.asList 常见坑详解|UnsupportedOperationException、数组联动、基本类型 bug

解析 Arrays.asList 常见开发陷阱,演示 UnsupportedOperationException、底层数组引用共享、基本类型数组问题,区分 Arrays 内部 ArrayList 与 java.util.ArrayList,给出数组转 List 的各种场景正确代码。

weixin_42617033的博客 494

Spring Boot 自动配置原理

Spring Boot 自动配置由 @EnableAutoConfiguration 导入选择器,读取 jar 中 .imports 候选清单,经去重、排序、排除后逐类做条件判断,通过才注册 Bean。延迟导入让用户 Bean 优先,@ConditionalOnMissingBean 使默认配置让位。失效时查清单和 Negative matches。

2401_89855466的博客 393

【每天一个 Python 小案例29】Python 实现商品购物车

本篇实现一个购物车:商品目录、加入商品、修改数量、移除商品、查看小计、计算满减与 VIP 折扣、结算扣库存。核心设计是"目录与购物车分离"——目录存商品主数据,购物车只存 {商品编号: 数量};金额一律用 Decimal 并做 ROUND_HALF_UP 舍入。折扣部分讲清阶梯满减的匹配顺序(阈值从高到低、命中即停)与叠加顺序(先满减、后打折),并用一次完整结算演示 706 元如何变成 613.70 元。

xinjiyaya的博客 217

【随笔】KV缓存量化:省下的显存,要付出多少数值误差

用可运行量化器解释位宽、比例信息、分组和离群值的关系,核算KV缓存实际载荷,并给出Transformers配置与容量、延迟、质量验收方法。

code2cat的博客 470

Python的字典

Python字典是存储键值对的数据结构,通过键(key)快速查找对应的值(value)。可使用{}定义,支持增删改查操作:通过dict[key]查询或修改值,get()方法安全获取并设置默认值,del dict[key]删除键值对,keys()、values()和items()用于遍历。items()结合双变量循环可高效遍历所有键值对,提升代码可读性与灵活性。

qq_43010954的博客 198
上一篇: wxPython和pycairo练习记录14
下一篇: wxPython和pycairo练习记录16
SmileBasic
博客等级 码龄5年 347粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值