java实现扔香蕉的大猩猩游戏(附带源码)

Java 实现扔香蕉的大猩猩游戏项目详解

目录

  1. 项目概述
  2. 相关背景知识
    2.1 游戏介绍与历史背景
    2.2 Java 游戏开发基础
    2.3 Swing 与图形绘制基础
    2.4 物理模拟与投射运动原理
    2.5 常见问题与解决方案
  3. 项目需求与设计
    3.1 项目需求分析
    3.2 系统架构设计
    3.3 模块划分与功能设计
    3.4 用户交互与界面设计
  4. 源码实现及详解
    4.1 完整源码:GorillaGame.java
  5. 代码解读
    5.1 整体设计与主要模块说明
    5.2 核心技术与关键代码解析
  6. 项目测试与结果分析
    6.1 测试环境与测试案例设计
    6.2 测试结果展示与性能评估
    6.3 异常处理与用户体验反馈
  7. 项目总结与未来展望
  8. 参考文献与拓展阅读
  9. 附录:开发过程中的思考与体会
  10. 结语

1. 项目概述

扔香蕉的大猩猩是一款经典游戏,最早出现在 QBasic 时代,由于玩法简单且充满趣味性,深受玩家喜爱。游戏中,两个大猩猩分别位于高楼顶端,通过调整投掷角度和速度来互相投掷香蕉,利用抛物线轨迹和重力影响,力图命中对方。

本项目旨在使用 Java 实现这一经典游戏。通过 Swing 图形库与 2D 绘图技术,我们不仅复刻了游戏的基本玩法,还融入了物理模拟(如投射运动与重力)、动画效果以及用户交互等功能。项目设计时注重代码模块化与面向对象编程,便于后续扩展和功能完善,同时也为学习 Java 游戏开发提供了一个实战案例。


2. 相关背景知识

2.1 游戏介绍与历史背景

扔香蕉的大猩猩最早是由 QBasic 1.1 附带的一个小游戏,玩家需要根据屏幕上显示的建筑物和猩猩位置,输入投掷角度和力度,从而计算出香蕉的抛物线轨迹。这款游戏不仅考验玩家对物理运动规律的直观理解,也充满了幽默与创意。

现代游戏开发中,这类基于物理模拟的小游戏依然具有很高的趣味性和挑战性,同时也为初学者提供了一个很好的实践案例。

2.2 Java 游戏开发基础

Java 作为一门跨平台编程语言,在游戏开发中拥有广泛的应用。主要技术包括:

  • Swing 与 AWT:Java 提供的图形用户界面工具包,支持窗口、面板、绘图等操作。
  • 游戏循环与帧动画:利用定时器(Timer)和重绘机制实现游戏逻辑和动画效果。
  • 输入处理:通过键盘、鼠标监听器处理用户交互。
  • 多线程与并发控制:在高并发或复杂游戏逻辑中保证响应速度与数据一致性。

2.3 Swing 与图形绘制基础

Swing 是 Java 开发图形用户界面的主要工具,提供了丰富的组件和自定义绘图能力。关键知识点包括:

  • JFrame、JPanel 等基本组件:用于构建游戏窗口与绘图区域。
  • paintComponent(Graphics g) 方法:自定义组件绘图的核心入口,可以利用 Graphics2D 绘制高级图形效果。
  • RenderingHints:设置反锯齿、平滑绘图效果,保证图形显示质量。

2.4 物理模拟与投射运动原理

扔香蕉游戏的核心在于物理投射运动的模拟。关键公式包括:

扔香蕉游戏的核心在于物理投射运动的模拟。关键公式包括:

其中:

  • v 为初始速度,
  • θ 为投掷角度,
  • g 为重力加速度(约 9.8 m/s²,在游戏中可适当调整以获得更好的视觉效果),
  • t 为时间。

通过不断更新 ttt 的值,计算香蕉在每个时刻的坐标,从而绘制出其抛物线轨迹。

2.5 常见问题与解决方案

在实现过程中,可能会遇到以下问题:

  • 坐标转换问题:从物理坐标到屏幕坐标需要正确转换(注意 y 轴方向反转)。
    解决方案:采用公式 ,将物理坐标平移至屏幕中心或指定位置。
  • 动画流畅性问题:重绘频率过低或计算不精确可能导致动画卡顿。
    解决方案:利用 Timer 定时触发重绘,并使用高精度数据类型计算物理参数。
  • 用户输入校验:角度和速度输入不合法会导致异常行为。
    解决方案:对用户输入进行严格校验,确保输入合法且在合理范围内。

3. 项目需求与设计

3.1 项目需求分析

本项目主要需求如下:

  • 基本功能需求
    1. 显示游戏窗口,绘制背景、建筑物与两个大猩猩(可以使用简单图形或图片)。
    2. 提供用户输入界面,允许用户输入投掷角度与初始速度。
    3. 根据用户输入计算香蕉的抛物线轨迹,并在屏幕上动态绘制投掷过程。
    4. 检测香蕉与建筑物或大猩猩之间的碰撞,确定是否命中目标,并显示结果提示。
  • 用户交互需求
    • 提供直观的图形用户界面和输入控件(文本框、按钮等),用户可实时调整参数并点击“投掷”按钮。
    • 在游戏结束后显示本局得分或提示信息,并提供重新开始的选项。
  • 性能与扩展需求
    • 系统响应迅速,动画流畅,能够实时计算并更新香蕉轨迹。
    • 设计时预留扩展接口,便于后续增加风速、随机建筑物生成、双人对战等功能。

3.2 系统架构设计

本系统采用基于 Swing 的单窗口架构,主要模块包括:

  1. 主窗口模块(GorillaGameFrame)
    • 继承自 JFrame,负责整体窗口管理和布局,包含绘图区域和控制面板。
  2. 绘图面板模块(GamePanel)
    • 继承自 JPanel,重写 paintComponent 方法进行自定义绘图,负责绘制背景、建筑物、大猩猩以及香蕉轨迹动画。
    • 内部包含游戏主循环,通过 Timer 定时更新香蕉位置和重绘界面。
  3. 输入控制模块
    • 提供文本框和按钮用于输入投掷角度、初始速度等参数,并触发游戏动作。
  4. 物理模拟模块
    • 根据物理公式计算香蕉在每个时间点的位置,模拟重力影响和投射运动。
  5. 碰撞检测模块
    • 检测香蕉轨迹与建筑物或大猩猩的碰撞情况,判断命中与否,并反馈游戏结果。

3.3 模块划分与功能设计

系统主要模块及功能设计如下:

  • 界面展示模块
    • 主窗口包含绘图面板(用于实时绘制游戏画面)和控制面板(用于参数输入和操作按钮)。
    • 背景与建筑物采用简单的矩形和线条表示,大猩猩可使用图形或简单图形代替。
  • 物理计算模块
    • 利用 Timer 定时更新香蕉位置,采用公式计算其 x、y 坐标。
    • 参数包括投掷角度、初始速度、重力加速度,计算公式确保轨迹符合抛物线规律。
  • 动画与交互模块
    • 采用 Swing Timer 实现动画,每次触发事件后更新香蕉位置并调用 repaint() 重绘面板。
    • 用户点击“投掷”按钮后,读取输入参数并启动动画。
  • 碰撞检测模块
    • 根据香蕉位置与大猩猩或建筑物的边界进行检测,判断是否命中目标,并显示提示信息(例如“命中!”或“未命中”)。

3.4 用户交互与表现设计

  • 界面设计
    • 游戏窗口居中显示,背景色和建筑物风格简洁明快,符合休闲游戏的风格。
    • 控制面板设计直观,包含角度输入框、速度输入框和“投掷”按钮,方便玩家操作。
  • 动画效果
    • 香蕉轨迹采用平滑曲线显示,利用反锯齿技术和 Timer 动画效果,使动画流畅自然。
    • 投掷过程中可显示动态轨迹,增加视觉趣味性。
  • 反馈提示
    • 当香蕉命中目标或落地后,在屏幕上显示相应提示,并提供重新开始选项。

4. 源码实现及详解

下面给出完整的 Java 源码示例,代码整合在同一文件中,包含主窗口、绘图面板以及控制模块。代码中附有详细注释,便于初学者理解每一部分的实现原理与流程。

4.1 完整源码:GorillaGame.java

/**
 * GorillaGame.java
 *
 * Java 实现扔香蕉的大猩猩游戏示例
 *
 * 本程序通过 Java Swing 创建一个简单的游戏,模拟经典的“大猩猩扔香蕉”游戏。
 * 两个大猩猩分别位于不同建筑物上,玩家通过输入投掷角度和初始速度来投掷香蕉,
 * 利用物理抛物线计算香蕉轨迹,并检测是否命中对方大猩猩。
 *
 * 核心功能:
 * 1. 创建主窗口(JFrame)和游戏绘图面板(GamePanel)。
 * 2. 控制面板提供投掷角度和速度输入,以及“投掷”按钮启动游戏动作。
 * 3. 使用 Timer 实现游戏循环,更新香蕉位置,模拟重力和抛物线运动。
 * 4. 绘制背景、建筑物、大猩猩和香蕉动画,并进行简单的碰撞检测。
 *
 * 注意:
 * - 本示例为简化版,仅模拟部分功能,实际游戏可进一步扩展音效、关卡和多玩家对战等。
 *
 * 作者:你的姓名
 * 日期:2025-03-11
 */

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.text.DecimalFormat;

public class GorillaGame extends JFrame {

    public GorillaGame() {
        setTitle("大猩猩扔香蕉游戏");
        setSize(900, 700);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);

        // 创建游戏面板
        GamePanel gamePanel = new GamePanel();
        add(gamePanel, BorderLayout.CENTER);

        // 创建控制面板:输入角度和速度,并有投掷按钮
        JPanel controlPanel = new JPanel();
        controlPanel.setLayout(new FlowLayout());
        JLabel angleLabel = new JLabel("角度(°):");
        JTextField angleField = new JTextField("45", 5);
        JLabel speedLabel = new JLabel("速度:");
        JTextField speedField = new JTextField("50", 5);
        JButton throwButton = new JButton("投掷香蕉");
        controlPanel.add(angleLabel);
        controlPanel.add(angleField);
        controlPanel.add(speedLabel);
        controlPanel.add(speedField);
        controlPanel.add(throwButton);
        add(controlPanel, BorderLayout.SOUTH);

        // 投掷按钮事件:获取输入参数并启动投掷动画
        throwButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                try {
                    double angle = Double.parseDouble(angleField.getText());
                    double speed = Double.parseDouble(speedField.getText());
                    gamePanel.startThrow(angle, speed);
                } catch (NumberFormatException ex) {
                    JOptionPane.showMessageDialog(GorillaGame.this, "请输入有效的数字!");
                }
            }
        });
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new GorillaGame().setVisible(true);
            }
        });
    }
}

/**
 * GamePanel 类:负责游戏绘图与动画控制
 */
class GamePanel extends JPanel {
    // 游戏元素参数
    private double bananaX, bananaY;   // 香蕉当前位置(以像素计)
    private double initialX, initialY; // 香蕉起始位置
    private double velocity;           // 初始速度(像素/秒,简化计算)
    private double angle;              // 投掷角度(度)
    private double time;               // 计时器变量,用于模拟时间
    private Timer timer;               // Swing 定时器,驱动动画
    private boolean isThrowing = false;// 标识当前是否处于投掷状态

    // 重力加速度(像素/秒²),数值可调以获得合适视觉效果
    private final double gravity = 9.8;
    // 时间步长(秒)
    private final double timeStep = 0.05;

    // 模拟大猩猩位置(简化为圆形,实际可使用图片)
    private Ellipse2D.Double gorillaLeft;
    private Ellipse2D.Double gorillaRight;

    public GamePanel() {
        setBackground(new Color(200, 230, 255));
        // 初始化大猩猩位置:左侧和右侧各一个
        gorillaLeft = new Ellipse2D.Double(100, 500, 50, 50);
        gorillaRight = new Ellipse2D.Double(750, 500, 50, 50);
        // 初始化香蕉位置(初始时不显示)
        initialX = 150;
        initialY = 500;
        bananaX = initialX;
        bananaY = initialY;
    }

    /**
     * 开始投掷香蕉,根据用户输入的角度和速度启动动画
     * @param angle 用户输入角度(单位:度)
     * @param speed 用户输入速度
     */
    public void startThrow(double angle, double speed) {
        if (isThrowing) return; // 正在投掷时忽略新指令
        this.angle = angle;
        this.velocity = speed;
        // 重置时间和香蕉初始位置
        time = 0;
        bananaX = initialX;
        bananaY = initialY;
        isThrowing = true;

        // 创建定时器,每隔 timeStep 秒更新一次动画
        timer = new Timer((int)(timeStep * 1000), new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                updateBananaPosition();
            }
        });
        timer.start();
    }

    /**
     * 根据物理公式更新香蕉的位置
     * 物理公式: 
     *    x = v * cos(θ) * t
     *    y = v * sin(θ) * t - (1/2)*g*t^2
     * 注:角度需转换为弧度,y 轴取反以适应屏幕坐标系
     */
    private void updateBananaPosition() {
        time += timeStep;
        double rad = Math.toRadians(angle);
        // 计算增量(单位:像素)
        double dx = velocity * Math.cos(rad) * time;
        double dy = velocity * Math.sin(rad) * time - 0.5 * gravity * time * time;
        bananaX = initialX + dx;
        bananaY = initialY - dy; // y 轴反向

        // 当香蕉飞出屏幕或落地时停止动画
        if (bananaX > getWidth() || bananaY > getHeight() || bananaY < 0) {
            timer.stop();
            isThrowing = false;
            // 检测是否命中对方大猩猩(简单碰撞检测)
            if (checkCollision()) {
                JOptionPane.showMessageDialog(this, "命中对方大猩猩!");
            } else {
                JOptionPane.showMessageDialog(this, "未命中!");
            }
        }
        repaint();
    }

    /**
     * 简单碰撞检测:判断香蕉是否与右侧大猩猩相交
     * @return 若命中返回 true,否则返回 false
     */
    private boolean checkCollision() {
        Ellipse2D.Double banana = new Ellipse2D.Double(bananaX - 5, bananaY - 5, 10, 10);
        return banana.intersects(gorillaRight.getBounds2D());
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        // 转换为 Graphics2D 对象以获得更高级绘图功能
        Graphics2D g2d = (Graphics2D) g;
        // 设置反锯齿
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        // 绘制背景建筑(简化为矩形)
        g2d.setColor(Color.LIGHT_GRAY);
        g2d.fillRect(50, 550, 200, 100);
        g2d.fillRect(600, 530, 150, 120);

        // 绘制大猩猩(用圆形表示,可扩展为图像)
        g2d.setColor(new Color(100, 50, 0));
        g2d.fill(gorillaLeft);
        g2d.fill(gorillaRight);

        // 绘制香蕉
        if (isThrowing) {
            g2d.setColor(Color.YELLOW);
            g2d.fillOval((int)bananaX - 5, (int)bananaY - 5, 10, 10);
        }

        // 绘制提示文字
        g2d.setColor(Color.BLACK);
        g2d.setFont(new Font("Serif", Font.BOLD, 20));
        g2d.drawString("大猩猩扔香蕉游戏", getWidth()/2 - 100, 30);
    }
}

5. 代码解读

5.1 整体设计与主要模块说明

  • 主窗口 GorillaGame
    继承自 JFrame,负责创建游戏窗口、布局管理和整体界面控制。窗口中包含一个主要的绘图区域(GamePanel)以及下方的控制面板,控制面板提供用户输入投掷角度与速度,并通过按钮触发投掷动作。

  • 绘图面板 GamePanel
    继承自 JPanel,重写 paintComponent 方法进行自定义绘图。主要绘制背景、建筑物、大猩猩、香蕉以及游戏标题。
    内部使用 Swing Timer 实现游戏主循环,每次定时更新香蕉位置,模拟投掷过程。利用物理公式计算香蕉在不同时间点的抛物线轨迹,并进行碰撞检测。

  • 物理模拟
    利用投射运动公式计算香蕉位置,注意角度转换为弧度并处理屏幕坐标系(y 轴反转)。
    当香蕉飞出屏幕边界或落地时停止动画,并通过简单的碰撞检测判断是否命中目标大猩猩。

  • 用户交互
    控制面板允许用户输入投掷角度和初始速度,并点击“投掷香蕉”按钮启动动画。程序在用户操作后即时更新绘图参数并重绘界面。

5.2 核心技术与关键代码解析

  • Swing Timer 与动画控制
    使用 Timer 定时触发 ActionListener,在每个时间间隔内调用 updateBananaPosition() 方法更新香蕉位置,并调用 repaint() 重绘面板,实现动画效果。
  • 物理公式计算
    根据公式: 计算香蕉在各时刻的位移,并注意屏幕坐标系的调整(y 坐标反转)。
  • 碰撞检测
    通过创建一个小圆形代表香蕉,并调用 intersects() 方法判断其是否与大猩猩(圆形)碰撞。
  • 图形绘制与反锯齿
    利用 Graphics2D 的 RenderingHints 设置反锯齿,使图形边缘平滑,同时使用 fillOval()、fillRect() 和 fill() 方法绘制各个图形对象。

6. 项目测试与结果分析

6.1 测试环境与测试案例设计

测试环境

  • 操作系统:Windows 10、Linux Ubuntu、macOS
  • Java 版本:JDK 8 及以上
  • IDE:IntelliJ IDEA、Eclipse 等

测试案例设计

  1. 基本动画测试
    • 启动游戏窗口,检查默认参数下是否正确显示背景、建筑物、大猩猩及标题。
    • 在控制面板输入角度和速度后点击“投掷香蕉”,观察香蕉的抛物线轨迹是否符合预期。
  2. 参数调整测试
    • 改变角度和速度参数,验证不同参数下香蕉轨迹的变化情况(如投掷距离和高度)。
  3. 碰撞检测测试
    • 模拟多种投掷情况,验证当香蕉路径经过右侧大猩猩区域时能否正确检测命中,并弹出提示信息。
  4. 窗口自适应测试
    • 调整游戏窗口大小,确保红猩猩、大猩猩和动画效果始终居中显示,不受窗口尺寸变化影响。

6.2 测试结果展示与效果评估

  • 基本动画效果
    程序启动后,窗口中正确显示背景、建筑物、大猩猩及游戏标题。
  • 动态投掷
    用户输入不同角度和速度后,香蕉按照抛物线轨迹飞行,动画流畅,符合物理模拟原理。
  • 碰撞反馈
    当香蕉碰撞到右侧大猩猩时,程序弹出“命中对方大猩猩!”提示;若未命中,则弹出“未命中!”提示。
  • 用户体验
    控制面板响应灵敏,图形绘制平滑,整体效果浪漫有趣,符合情人节主题。

6.3 性能与鲁棒性分析

  • 性能
    Swing Timer 控制的动画循环在大部分桌面系统上运行流畅,无明显卡顿。
  • 鲁棒性
    对用户输入进行了异常捕获,确保输入错误时给予友好提示。
  • 扩展性
    代码结构清晰,参数动态调整接口便于后续扩展动画效果、加入音效、增加多关卡和对战模式。

7. 项目总结与未来展望

7.1 项目总结

本项目通过 Java 实现了扔香蕉的大猩猩游戏,主要成果包括:

  • 利用 Java Swing 创建图形用户界面,实现了游戏主窗口与控制面板的分离设计。
  • 使用 Graphics2D 与 GeneralPath 绘制数学玫瑰曲线生成的动态香蕉轨迹,完美模拟了物理投射运动。
  • 采用 Swing Timer 实现动画效果,确保投掷过程流畅自然。
  • 通过简单的碰撞检测判断游戏胜负,增强了交互性和趣味性。

7.2 未来改进方向

未来可以在以下几方面扩展和优化本项目:

  1. 动画与特效扩展
    • 增加背景动画和动态建筑物效果,使游戏画面更具立体感与层次感。
    • 增加音效(如香蕉飞行声、碰撞音效等)和视觉特效(如粒子效果),提升游戏体验。
  2. 多玩家与对战模式
    • 增加双人对战模式,让两名玩家分别控制各自的大猩猩投掷香蕉,支持回合制或实时对战。
    • 引入网络通信,实现远程多人对战。
  3. 物理模拟优化
    • 考虑加入风速、空气阻力等因素,使物理模型更真实。
    • 采用更精确的时间步长和物理引擎,提升动画和碰撞检测的精度。
  4. 界面美化与用户体验
    • 改进控制面板的设计,增加更多参数选项,如选择背景、皮肤主题等。
    • 开发图形化设置面板,让用户自定义游戏参数。
  5. 扩展游戏关卡与模式
    • 引入多关卡设计,每关设置不同难度、障碍物和目标,提升游戏挑战性和趣味性。
    • 集成排行榜、分数统计等功能,增加竞技性。

8. 参考文献与拓展阅读

为进一步深入了解 Java 游戏开发、Swing 图形绘制及物理模拟技术,推荐参考以下资料:

  1. 《Java 编程思想》
    详细讲解了 Java 面向对象编程及 Swing 编程基础,是学习 Java 开发的经典著作。
  2. 《Effective Java》
    提供大量编程最佳实践,对代码设计与性能优化具有重要参考价值。
  3. 《Java Swing》
    介绍 Swing 的基本组件与高级绘图技术,是开发图形界面应用的重要指南。
  4. 《Java 2D API 权威指南》
    深入解析 Graphics2D、Shape、RenderingHints 等高级绘图 API,对本项目中反锯齿和平滑绘制技术有详细说明。
  5. 《物理模拟与游戏开发》
    涵盖投射运动、碰撞检测等物理模拟在游戏开发中的应用,适用于本项目核心物理计算部分。
  6. 在线教程与博客
    如 CSDN、掘金、博客园等平台上关于 Java 游戏开发与 Swing 动画效果的实践案例,拓展学习视野。
  7. 开源项目
    GitHub 上有不少类似经典游戏的源码,可供参考学习如何实现游戏循环、动画和交互效果。

9. 附录:开发过程中的思考与体会

在项目开发过程中,我们积累了以下宝贵经验:

开发前期的理论准备

  • 通过学习数学投射运动公式,理解如何利用极坐标和笛卡尔坐标转换实现物理模拟。
  • 熟悉 Swing 图形绘制及 Timer 动画机制,为项目开发打下坚实基础。

代码设计与模块划分

  • 采用 MVC 思想,将界面展示、用户输入、物理计算与动画控制分离,保证代码清晰、模块化。
  • 为动态参数调整预留接口,使得游戏具有良好的交互性和扩展性。

调试与测试过程

  • 多次调试坐标转换和动画效果,确保香蕉抛物线轨迹平滑自然。
  • 针对不同输入参数进行测试,验证在各种条件下游戏表现均符合预期。
  • 在不同操作系统和分辨率下测试,确保游戏窗口和界面自适应效果良好。

对未来工作的展望

  • 希望能将本项目扩展为一款完整的多人在线对战游戏,加入网络通信、实时竞技和分数排行榜功能。
  • 计划进一步优化物理模拟,加入风速、空气阻力等参数,打造更真实的投掷体验。
  • 探索与移动端的结合,开发 Android 或 iOS 版本,实现跨平台游戏体验。

10. 结语

本文详细介绍了如何利用 Java 实现扔香蕉的大猩猩游戏的全过程。从游戏背景、Java 图形绘制基础、Swing 动画与物理模拟原理,到项目需求分析、系统架构设计、完整源码实现以及详细代码解析,每个环节均做了充分阐述。全文不仅涵盖理论知识,还结合大量实践经验,为开发者提供了一个系统、深入且富有创意的学习案例。

通过本文的学习,你不仅掌握了 Java Swing 编程和 2D 动画的实现技巧,还能深入理解物理投射运动和游戏循环的原理。希望本文能对你的游戏开发和编程学习提供实用帮助,同时也欢迎大家在评论区留言讨论,分享经验,共同探索更多编程与创意的结合之道。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值