微信小程序小游戏《别踩白块》源码完整剖析及实践

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:该资源提供了微信小程序平台上的小游戏《别踩白块》的完整源代码和游戏运行时截图。源代码覆盖了程序设计、逻辑处理和用户界面等多个关键开发领域,游戏的目标是玩家通过不断点击黑色方块来获得高分,同时避免白色方块。附带的截图有助于开发者直观理解游戏界面和交互效果,文件中还包含多个关键文件和文件夹,为学习微信小程序开发提供了丰富资源。 微信小程序

1. 微信小程序平台的小游戏开发

微信小程序已经成为移动互联网行业的一大趋势,它不仅为开发者提供了便捷的平台,也为用户带来了全新的应用场景和娱乐方式。本章将从微信小程序的发展历程、小游戏的市场现状与趋势两个方面出发,探究微信小游戏的开发奥秘。

1.1 微信小程序的发展历程

1.1.1 微信小程序的起源

微信小程序的原型在2016年9月21日正式推出,其目的在于为用户提供更加便捷的服务和更为丰富的内容体验,同时给予开发者更多的商业变现机会。小程序不同于传统的手机App,它无需下载安装,即用即走,极大地降低了用户使用的门槛。

1.1.2 微信小程序的市场表现和用户基础

自推出以来,微信小程序以其轻便性和高效性迅速积累了庞大的用户基础。截至2023年,微信小程序的数量已超过数百万,覆盖了电商、游戏、生活服务等多个领域,成为众多企业数字化转型的重要工具之一。市场数据显示,微信小程序正持续呈现快速增长的态势,为移动互联网行业注入了新的活力。

1.2 微信小游戏的市场现状与趋势

1.2.1 微信小游戏的市场现状

微信小游戏作为小程序生态的一部分,自2017年推出以来,已经吸引了众多游戏开发者和玩家的关注。目前,微信小游戏种类丰富,玩法多样,不仅有休闲游戏,还覆盖了角色扮演、策略等多个游戏品类。微信小游戏为用户提供了碎片化娱乐的新选择,成为用户日常生活中不可或缺的娱乐方式。

1.2.2 微信小游戏的发展趋势分析

随着技术的发展和用户需求的变化,微信小游戏正朝着更加丰富化、社交化和商业化的方向发展。未来,小游戏可能会集成更多人工智能技术,提高游戏的互动性和趣味性;同时,社交元素的强化和游戏电商的结合,也将进一步拓宽小游戏的盈利渠道,为开发者创造更多价值。此外,小游戏的跨平台开发能力也将得到加强,使游戏开发的门槛进一步降低,吸引更多开发者参与。

2. 源代码解析及游戏逻辑实现

2.1 游戏主逻辑的代码结构

2.1.1 游戏主循环的实现方式

游戏的主循环是游戏逻辑中的心脏,负责驱动游戏世界状态的更新和渲染。在微信小程序中,主循环通常通过 onLoad onShow onHide 等生命周期函数来实现。以 onLoad 为例,它会在小程序启动或者页面被创建时调用一次,可以用来初始化游戏状态。接着,在 onShow 函数中可以处理游戏继续运行的逻辑,而 onHide 则用于暂停或结束游戏。

// game.js
Page({
  onLoad: function() {
    // 初始化游戏状态
    this.initGameState();
    // 开始游戏主循环
    this.gameLoop();
  },
  onShow: function() {
    // 游戏显示时的逻辑,例如重新开始游戏
  },
  onHide: function() {
    // 游戏隐藏时的逻辑,例如暂停游戏
  },
  initGameState: function() {
    // 初始化游戏相关变量和状态
  },
  gameLoop: function() {
    // 游戏主循环
    const self = this;
    // 使用setTimeout实现循环,避免阻塞主线程
    self.gameInterval = setInterval(function() {
      self.update(); // 更新游戏状态
      self.render(); // 渲染游戏画面
    }, 16); // 每16ms更新一次,大约60帧每秒
  },
  update: function() {
    // 更新游戏逻辑,例如玩家位置、得分等
  },
  render: function() {
    // 渲染游戏画面
  },
  clearGameLoop: function() {
    // 清除定时器,停止游戏主循环
    clearInterval(this.gameInterval);
  }
});

2.1.2 游戏状态管理及切换

游戏状态的管理是确保游戏逻辑正确运行的关键。微信小程序的状态管理可以使用Vue.js等数据驱动框架,也可以使用小程序官方提供的 Page 对象和 data 属性。

// game.js
Page({
  data: {
    isGameOver: false, // 游戏是否结束
    score: 0          // 玩家得分
  },
  // 更新游戏状态的函数
  updateScore: function(scoreDelta) {
    this.setData({
      score: this.data.score + scoreDelta
    });
  },
  // 游戏结束,更新状态
  gameOver: function() {
    this.setData({
      isGameOver: true
    });
    this.clearGameLoop(); // 清除游戏循环
  }
});

2.2 核心逻辑功能的代码解析

2.2.1 游戏开始、结束的逻辑判断

游戏开始和结束的逻辑判断是游戏流程中重要的一环。通常在初始化游戏状态或用户进行某些操作后,会触发游戏的开始或结束逻辑。

// game.js
Page({
  startGame: function() {
    // 开始游戏时初始化一些状态
    this.initGameState();
    // 开始游戏主循环
    this.gameLoop();
  },
  gameOver: function() {
    // 游戏结束
    this.setData({
      isGameOver: true
    });
    // 停止游戏循环
    this.clearGameLoop();
    // 可能需要更新游戏得分等
    // 更新游戏得分
    this.updateScore(/* 得分计算 */);
  }
});

2.2.2 用户操作处理及游戏响应

用户操作的处理和游戏响应是确保游戏互动性的基础。对于点击、长按、滑动等操作,需要在小程序的 touchStart touchMove touchEnd 等事件监听函数中处理。

// game.js
Page({
  // 处理用户触摸开始事件
  touchStartHandler: function(event) {
    // 根据游戏需要,记录触摸开始的坐标等信息
  },
  // 处理用户触摸移动事件
  touchMoveHandler: function(event) {
    // 根据触摸信息更新游戏状态
  },
  // 处理用户触摸结束事件
  touchEndHandler: function(event) {
    // 根据触摸结束的动作触发游戏响应
  },
  // 绑定事件到小程序视图层
  bindViewTap: function() {
    // 这里可以绑定一个点击事件来处理用户的点击操作
    this.setData({
      // 更新数据
    });
  }
});

在实际开发中,游戏逻辑会比这里展示的代码更加复杂,通常会涉及到多个函数和状态变量来实现。此外,游戏的性能优化也是开发过程中必须要考虑的因素,以确保游戏运行流畅,用户交互响应快速。

3. 用户界面设计与交互效果

用户界面设计与交互效果是游戏吸引玩家的重要因素之一。一个直观、美观且反应灵敏的界面能够为用户提供愉悦的体验,而良好的交互效果则能增强游戏的沉浸感和可玩性。在微信小程序的小游戏开发中,设计师和开发者需要关注用户界面布局、设计原则以及交互效果的实现与优化。

3.1 用户界面布局与设计原则

3.1.1 界面元素与布局规划

用户界面的设计始于对界面元素的合理布局。微信小程序平台提供了灵活的布局机制,开发者可以使用标准的CSS样式和布局技术来规划界面。微信小程序的界面布局通常由 view image text 等基础组件构成,结合 flexbox grid 布局可以实现复杂的布局设计。

布局规划过程中,首先需要明确界面的信息结构,区分核心内容和次要内容,确保核心操作的便捷性。例如,在一个简单的消除类游戏中,游戏的得分、剩余步数和游戏菜单等信息可以放在界面上方,游戏主画面放在中央,底部则可以设置快速访问功能的按钮。

3.1.2 设计原则与用户体验

微信小程序小游戏的设计原则应遵循简洁性、一致性和响应性。简洁性意味着界面不应过于复杂,避免不必要的干扰元素。一致性的原则要求游戏的各个界面和组件风格保持一致,便于用户快速学习和操作。响应性则是指界面设计要适应不同屏幕尺寸和分辨率。

用户体验的提升,还需要考虑色彩、字体、图标和动画的合理运用。色彩搭配要符合游戏主题,字体大小和颜色要保证可读性,图标要简洁明了,动画效果要流畅自然。

3.2 交互效果的实现与优化

3.2.1 触摸反馈与交互动画

在微信小程序的小游戏中,用户与游戏的交互主要是通过触摸操作。良好的触摸反馈能够提供即时的操作反馈,增强用户的操作信心和满意度。开发者可以通过设置 tap touchstart touchend 等触摸事件来实现触摸反馈。

交互动画是提升游戏交互体验的另一关键因素。动画不仅可以引导用户的注意力,还能增强游戏的视觉效果。在微信小程序中,可以使用 wx.createAnimation 接口创建自定义动画,并将其应用于界面元素。

3.2.2 交互效果的调试与性能优化

实现交互效果后,需要对游戏进行充分的测试,确保交互操作流畅,无卡顿现象。微信开发者工具提供了性能分析器,可以监控游戏的运行情况,帮助开发者定位和优化性能瓶颈。

性能优化可以从减少DOM操作、优化资源加载和使用Canvas渲染等方面入手。例如,通过减少不必要的重绘和回流,优化图片和动画资源的大小,以及利用Canvas的硬件加速特性提升渲染性能。

3.2.3 具体代码实现和分析

为了实现触摸反馈,开发者可以编写如下代码示例:

// 绑定点击事件并处理反馈逻辑
Page({
  data: {},
  bindTapEvent: function() {
    const ctx = wx.createCanvasContext('myCanvas');
    // 游戏中的点击事件处理
    this.canvas.addEventListener('touchstart', event => {
      ctx.setFillStyle('red');
      ctx.fillRect(event.touches[0].x, event.touches[0].y, 10, 10);
      ctx.draw();
      // 处理点击逻辑,例如添加游戏中的得分点
    });
  }
});

在上述代码中,我们创建了一个Canvas,并在 touchstart 事件发生时绘制了一个小红点作为触摸反馈。此外,可以设置 setTimeout requestAnimationFrame 来动态改变对象的属性,生成更加丰富和流畅的动画效果。

3.2.4 性能分析与优化

在性能优化方面,开发者可以使用开发者工具中的性能分析功能来检测和优化性能:

// 使用性能分析器检测性能
const util = require('util');
const performance = require('performance');
const perfData = performance.getEntriesByType('mark');
util.inspect.defaultOptions.colors = true;
console.log(util.inspect(perfData, { colors: true }));

执行上述代码,可以在控制台输出性能数据,分析游戏的性能瓶颈,并据此进行针对性优化。

在微信小程序的开发过程中,遵循良好的用户界面设计原则和交互效果实现策略,是提升用户体验的关键。通过合理规划布局、运用交互动画和优化性能,开发者可以为玩家提供一个既美观又高效的微信小游戏环境。

4. 游戏源码文件结构和组成

4.1 源码文件的组织结构

4.1.1 文件和目录的组织方式

在开发微信小程序游戏时,代码的组织结构显得至关重要,它不仅影响开发的效率,还对后期的维护和升级起到决定性的作用。通常,微信小程序的游戏项目会包含多个文件和目录。为了方便管理和查阅,合理的文件和目录组织方式如下:

  • /images/ :存放游戏中使用的图片资源。
  • /audio/ :存放游戏相关的音频文件,如背景音乐和音效。
  • /pages/ :存放小程序页面的源代码,每一个页面是一个独立的目录,通常包含 .json 配置文件, .wxml 结构文件, .wxss 样式文件,以及 .js 脚本文件。
  • /utils/ :存放一些工具类文件,如数据处理、辅助功能函数等。
  • /games/ :存放与游戏相关的逻辑实现代码,通常包含游戏的主逻辑文件和各个子模块的实现文件。
  • app.js :小程序的入口文件,初始化全局变量和全局数据。
  • app.json :小程序的全局配置文件,可以配置小程序的窗口背景色、导航条样式等。
  • app.wxss :全局的样式表文件,可以在此统一设置全局的 CSS 规则。
  • project.config.json :项目配置文件,可以设置项目名称、项目id、模板等信息。

4.1.2 源码文件功能划分

将源码文件按功能进行划分可以更清晰地管理不同部分的代码。微信小程序游戏的源码文件主要包括以下几个方面:

  • 游戏引擎初始化 :通常会有一个单独的文件或目录负责游戏引擎的初始化,包括游戏的启动、初始化场景和资源加载等。
  • 游戏逻辑控制 :这个部分包含了游戏的主要逻辑控制代码,比如分数计算、关卡控制、游戏状态管理等。
  • 用户交互处理 :包括用户输入的监听、处理以及相关的反馈逻辑,如触摸操作的响应和处理。
  • 资源管理 :负责游戏资源的加载、缓存以及释放,确保游戏运行流畅。
  • 动画和渲染 :这部分主要处理游戏中的动画效果和画面渲染,是游戏用户体验的关键部分。

通过这种划分,每个文件或目录都有明确的职责,这样在开发过程中可以做到分工明确,便于协作和后期的代码维护。

4.2 模块划分与接口设计

4.2.1 各功能模块的划分依据

在微信小程序游戏开发中,功能模块的划分依据主要在于其职责和复用性。每一个模块应该只负责一个具体的职能,这样可以降低模块之间的耦合度,提高代码的可维护性和可重用性。下面列举几个核心模块的划分依据:

  • 游戏引擎模块 :作为游戏的运行基础,负责游戏循环、场景管理、资源加载等核心功能。
  • 玩家控制模块 :负责处理玩家的输入和游戏响应,包括角色移动、跳跃、射击等操作。
  • 数据管理模块 :负责游戏数据的加载、存储、同步和持久化,如玩家分数、排行榜等。
  • UI界面模块 :负责游戏用户界面的渲染和交互反馈,如显示分数、生命值等。

4.2.2 模块间的接口设计与实现

模块间的接口设计需要保证模块之间能够正确、高效地通信。设计良好的接口可以使得模块之间的耦合度降到最低,而模块内的内聚度达到最高。在微信小程序游戏开发中,常用的接口设计方法包括:

  • 事件驱动 :通过自定义事件来实现模块间的通信,这种模式可以使得模块之间的依赖最小化。
  • 观察者模式 :一个模块作为观察者,另一个模块作为被观察者,被观察者状态变化时通知观察者。
  • Promise/Async/Await :使用现代JavaScript的异步编程模式,使得异步操作的控制和结果处理变得清晰。

以下是一个事件驱动接口设计的简单代码示例:

// 游戏引擎模块
class GameEngine {
    constructor() {
        this.addEventListener('update', this.update.bind(this));
    }

    emitUpdate() {
        this.emit('update');
    }

    update() {
        // 更新游戏状态,如位置、分数等
    }
}

// 玩家控制模块
class PlayerControls {
    constructor(engine) {
        this.engine = engine;
        this.engine.addEventListener('update', this.handleUpdate.bind(this));
    }

    handleUpdate() {
        // 根据用户输入更新角色状态
    }
}

// 初始化游戏引擎和玩家控制
const engine = new GameEngine();
const controls = new PlayerControls(engine);
engine.emitUpdate(); // 开始游戏循环

在上面的代码中, GameEngine 模块负责游戏的核心更新逻辑,而 PlayerControls 模块通过监听游戏引擎的 'update' 事件来更新玩家的操作状态。这样模块之间的通信清晰,耦合度低,易于维护和扩展。

以上就是游戏源码文件结构和组成的详细介绍。合理的设计和组织代码结构不仅能提高开发效率,还能让项目后期的维护和扩展变得更加便捷。下一章节,我们将深入探讨游戏开发中的关键功能,如计分系统、动画效果和音效处理的实现。

5. 关键功能如计分系统、动画、音效处理的实现

5.1 计分系统的设计与实现

计分系统是游戏的核心组成部分之一,它不仅提供了玩家的游戏进度反馈,还能够激励玩家追求更高的分数。要设计一个有效的计分系统,需要考虑以下几个要素:

5.1.1 计分算法的设计原理

计分算法需要公平、透明,并能够正确地反映出玩家的游戏表现。通常,计分算法会基于玩家完成任务的时间、难度、完成的质量等因素进行综合评价。

例子 : 如果是一个动作类游戏,玩家在规定时间内完成的关卡数量、击败敌人的数量、收集的道具数量等都会被计入总分。

在设计计分算法时,还需要考虑到难度平衡,保证游戏对于不同水平的玩家都有吸引力。可以通过设置动态难度调整机制,让玩家的得分随着他们技能的提高而提升。

5.1.2 计分系统的技术实现

技术上,计分系统通常涉及到数据存储和计算。在小程序中,可以使用微信提供的云开发功能,存储玩家的得分数据,并通过小程序的前端展示给玩家。

代码示例 :

// 假设使用微信小程序云函数进行得分计算
// score.js 云函数
const cloud = require('wx-server-sdk');

cloud.init();

// 云函数入口函数
exports.main = async (event, context) => {
  const { userId, score } = event;

  const db = cloud.database();
  const _ = db.command;
  const userScore = db.collection('userScores');

  // 更新用户得分记录
  await userScore.where({ userId }).update({
    data: {
      score: _.inc(score)
    }
  });

  return userScore.doc(userId).get().then(res => {
    return res.data;
  });
};

这段代码定义了一个简单的云函数,用于更新和获取玩家的得分。通过微信小程序的前端调用这个云函数,可以实现玩家得分的计算和记录。

参数说明 : - userId : 玩家的唯一标识符。 - score : 玩家获得的分数。

5.2 动画效果的实现技术

动画效果能够极大地丰富游戏体验,吸引玩家的视觉注意力,增加游戏的趣味性和沉浸感。

5.2.1 动画框架的选择与应用

微信小程序平台支持多种动画效果的实现方式。开发者可以根据项目需求选择使用原生动画API,或者引入第三方动画库,如Taro、WeUI等。

原生动画API示例 :

// 使用微信小程序原生的动画API
const animation = wx.createAnimation({
  duration: 1000,
  timingFunction: 'ease',
});

this.setData({
  animationData: animation.translateY(10).scale(0.5).rotate(45).step().export(),
});

上述代码创建了一个动画实例,并定义了一个位移、缩放、旋转的动画序列。通过在小程序的组件上应用 animationData 数据,可以实现动画效果。

参数说明 : - duration : 动画持续时间,单位毫秒。 - timingFunction : 动画速度曲线。 - translateY(10) : Y轴方向位移10单位。 - scale(0.5) : 缩放为原来的0.5倍。 - rotate(45) : 旋转45度。

5.2.2 动画优化与性能考量

动画优化是提高游戏性能的关键。开发者需要注意到过度复杂的动画效果可能会对小程序的帧率产生负面影响,导致卡顿。

动画优化建议 : - 避免在动画过程中频繁操作DOM。 - 使用 requestAnimationFrame 来优化动画的执行时间。 - 确保动画关键帧使用整数值,以便于GPU进行优化。 - 对于非关键视觉元素,可以考虑使用静态图片代替复杂的动画效果。

5.3 音效处理与实现

音效对于游戏的沉浸感同样至关重要。合适的背景音乐和特效音可以有效提升游戏体验。

5.3.1 音效资源的管理

音效资源需要被合理地管理以减少加载时间,并避免内存溢出。在小程序中,音效资源通常会被压缩并转换为兼容格式(如.mp3)。

代码示例 :

// 加载并播放音效
const backgroundAudioManager = wx.getBackgroundAudioManager();
backgroundAudioManager.title = '背景音乐';
backgroundAudioManager.src = 'path/to/music.mp3';
backgroundAudioManager.play();

上述代码使用了微信小程序的 backgroundAudioManager 对象来控制音乐播放。

参数说明 : - title : 音乐标题,显示在系统音乐控件上。 - src : 音乐文件的路径。

5.3.2 音效的同步与播放控制

开发者需要确保音效与游戏事件同步,无论是背景音乐还是特效音。此外,应允许玩家可以控制音量大小或关闭背景音乐。

代码示例 :

// 控制背景音乐音量
backgroundAudioManager.volume = 0.5;

// 暂停播放
backgroundAudioManager.pause();

// 继续播放
backgroundAudioManager.play();

// 停止播放并清空队列
backgroundAudioManager.stop();

这些控制方法允许开发者在游戏中实现复杂的音效控制逻辑,例如在特定事件发生时播放音效,或者根据玩家的选择调整音量。

通过上述章节的详细介绍,我们可以看到关键功能如计分系统、动画和音效处理在微信小游戏中的实现方法和技术细节。每一部分都是从基础原理出发,通过代码示例和参数解释,深入分析如何在实际开发中应用和优化这些功能。

6. 微信小程序开发流程和API应用

6.1 微信小程序的基本开发流程

6.1.1 开发环境的搭建与配置

在开始微信小程序的开发之前,我们需要搭建并配置合适的开发环境。微信官方提供了一套完整的开发工具,名为微信开发者工具,它集成了代码编辑器、模拟器、调试器和项目管理功能。

  1. 访问微信公众平台官网下载最新版本的微信开发者工具。
  2. 安装下载的程序,并打开微信开发者工具。
  3. 登录微信账号,并在开发者工具中注册新的小程序项目。
  4. 配置项目的AppID,这是小程序的唯一标识,可以从微信公众平台获取。
  5. 选择项目存放的目录,开发工具会自动生成基础的项目结构。

完成以上步骤后,你的开发环境就搭建好了。接下来就可以开始功能模块的开发和调试了。

6.1.2 功能模块开发与调试

微信小程序主要包括四种文件类型:WXML(类似HTML的标记语言)、WXSS(类似CSS的样式表语言)、JS(JavaScript脚本文件)和JSON(配置文件)。在开发一个功能模块时,我们需要遵循以下步骤:

  1. 设计模块的页面结构,编写WXML文件。
  2. 设计模块的样式,编写WXSS文件。
  3. 编写JS文件实现模块的逻辑控制。
  4. 在JSON文件中配置模块的窗口表现和导航设置。

调试时,可以使用开发者工具的模拟器查看效果,使用控制台输出信息来进行代码调试。在模拟器中,开发者可以实时看到代码更改后的效果,并且可以通过快捷键进行真机调试,将小程序部署到手机上进行测试。

6.2 微信小程序API的应用与实践

6.2.1 常用API的介绍与使用

微信小程序提供了大量的API供开发者使用,覆盖了从网络通信、数据存储到设备信息等多个方面。例如:

  • wx.request : 发起网络请求,用于向服务器发送请求获取数据。
  • wx.setStorage wx.getStorage : 分别用于设置和获取本地存储的数据。
  • wx.login : 获取登录凭证(code),用于获取微信提供的openId和sessionKey。

使用API时,通常在JS文件中调用。例如发起一个网络请求的代码示例:

wx.request({
  url: 'https://example.com/api/data', // 你的数据接口地址
  method: 'GET', // 请求方法
  data: {
    // 发送到服务器的参数
  },
  success(res) {
    console.log(res.data); // 处理服务器响应的数据
  },
  fail(err) {
    console.error(err); // 错误处理
  }
});

6.2.2 API的高级应用案例分析

我们通过一个使用API实现用户登录和获取用户信息的高级案例来进一步分析微信小程序的API应用。

// 用户点击登录按钮时触发
login: function() {
  // 使用wx.login获取code
  wx.login({
    success: res => {
      if (res.code) {
        // 发送code到后台换取openId和sessionKey
        wx.request({
          url: 'https://example.com/api/login',
          method: 'POST',
          data: {
            code: res.code
          },
          success: loginRes => {
            // 存储登录凭证
            wx.setStorageSync('token', loginRes.data.token);
            // 跳转到个人信息页面
            wx.navigateTo({
              url: '/pages/userInfo/userInfo'
            });
          },
          fail: err => {
            // 错误处理
            console.error('登录失败', err);
          }
        });
      } else {
        console.log('登录失败!' + res.errMsg);
      }
    }
  });
}

在上面的代码示例中,用户点击登录按钮后,会触发 wx.login 获取登录凭证。之后,将凭证发送到后端API,由后端进行身份验证。验证成功后,将得到的token保存到本地存储,并跳转到个人信息页面。

此外,小程序还提供了 wx.getUserInfo 接口,用于获取用户信息,这通常在用户授权后使用。

请注意,以上代码仅为示例,实际开发中需要根据具体业务逻辑和安全需求进行调整和完善。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:该资源提供了微信小程序平台上的小游戏《别踩白块》的完整源代码和游戏运行时截图。源代码覆盖了程序设计、逻辑处理和用户界面等多个关键开发领域,游戏的目标是玩家通过不断点击黑色方块来获得高分,同时避免白色方块。附带的截图有助于开发者直观理解游戏界面和交互效果,文件中还包含多个关键文件和文件夹,为学习微信小程序开发提供了丰富资源。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值