C语言开发打气球小游戏

C语言开发打气球小游戏

首先我们写一下项目所需要的头文件

#include<stdio.h>//标准输入输出头文件
#include<math.h>//数学库头文件
#include<graphics.h>//EasyX图形库头文件
#include<mmsystem.h>//多媒体音乐库头文件
#pragma comment(lib,"winmm.lib")//导入winmm库
#pragma warning(disable : 4996)//4996警告杂注

接下来在涵盖几个宏定义进来

#define WIDTH 600//窗口宽度
#define WEIGHT 400//窗口高度
#define NUM 10//屏幕上所产生气球,子弹的最大数量

然后我们开始打造一个漂亮的欢迎界面,这里需要二张图片,我把它贴出来。
1.jpg:
1.jpg
2.jpg:
2.jpg
图片有了,上代码,首先先在全局部分定义图片属性

IMAGE img[2];
void Welcome()//实现欢迎界面的函数
{
 loadimage(&img[0], "1.jpg",150,400);//加载图片
 loadimage(&img[1], "2.jpg", 450, 400);//参数含义(图片地址,图片路径,图片宽,图片高)
 putimage(0,0,&img[0]);//显示图片
 putimage(150, 0, &img[1]);//参数含义(显示坐标x,y+图片属性)
 while (1)
 {
  if (MouseHit())//判断是否有鼠标消息
  {
   MOUSEMSG msg = GetMouseMsg();//获取当前鼠标消息
   if (msg.uMsg == WM_LBUTTONDOWN)//如果鼠标左键按下
   {
    return;//返回主函数
   }
  }
 }
}

接下来我们开始准备音乐部分(音乐不方便贴出来,可以自己去网上找合适的)
我们为了不影响程序运行效率,决定使用多线程的方式实现音乐播放
背景音乐:

DWORD WINAPI Music(LPVOID lpParamter)
{
 mciSendString("open music.mp3 alias BGM", 0, 0, 0);//加载音乐
 mciSendString("play BGM repeat", 0, 0, 0);//播放音乐
 //repeat代表无限循环播放
 while (1);
}

气球爆炸音效:

DWORD WINAPI MCC(LPVOID lpParamter)
{
 mciSendString("open fill.mp3 alias BCC", 0, 0, 0);
 mciSendString("play BCC", 0, 0, 0);
 return 0;
}

做游戏之前,我们先把游戏中的炮台,气球,子弹这3个元素用结构体抽象出来

struct Battery//炮台
{
//炮管二点的横纵坐标
 int x;
 int y;
 int endx;
 int endy;
 int len;
 //炮管发射出来的子弹的速度
 int speed;
 //炮管倾斜的弧度
 double radian;
 //玩家的游戏得分
 int score;
}bat;
struct bullet
{
//子弹的横纵坐标
 int x;
 int y;
 //子弹的半径
 int r;
 //子弹向炮管方向的位移量
 int vx;
 int vy;
 //子弹是否存在的标志
 bool falg;
 //炮管倾斜的弧度
 double radian;
 //子弹的颜色
 DWORD color;
}ball[NUM];
struct Balloon
{
//气球的横纵坐标
 int x;
 int y;
 //气球的颜色
 DWORD color;
 //气球是否存在的标志
 bool falg;
}boon[NUM];

下面我们来初始化数据

void GameInit()
{
 srand(GetTickCount());
 bat.x = WIDTH / 2;
 bat.y = WEIGHT - 10;
 bat.len = 50;
 bat.endx = bat.x;
 bat.endy = bat.y-bat.len;
 bat.speed = 7;
 bat.score = 0;
 for (int i = 0; i < NUM; i++)
 {
  ball[i].falg = false;
 }//因为一开始子弹不存在,子弹需要鼠标点击才生成一个,所以我们先初始化为不存在(false代表不存在)
 for (int i = 0; i < NUM; i++)
 {
 //随机坐标
  boon[i].x = rand() % (WIDTH-30);
  boon[i].y = rand() % (WEIGHT-60);
  //随机颜色
  boon[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);
  boon[i].falg = true;
 }//因为气球是游戏一开始就要有的,所以我们把它全部初始化为true(存在),并且初始化坐标,颜色
}

接下来我们来把数据变得“看的见”

void GameDraw()
{
 BeginBatchDraw();//开始双缓冲
 setbkcolor(RGB(114, 191, 207));//设置窗口背景颜色
 cleardevice();//清屏
 for (int i = 0; i < NUM; i++)//遍历所有气球(所有包括存在和不存在)
 {
  if (boon[i].falg==true)//如果气球存在
  {
   //画气球
   setlinestyle(PS_SOLID, 0.1);//设置线条风格  PS_SOLID表示实线,0.1表示线条粗细程度
   setlinecolor(WHITE);//设置线条颜色
   setfillcolor(boon[i].color);//设置填充颜色
   fillellipse(boon[i].x, boon[i].y, boon[i].x + 40, boon[i].y + 50);//画填充椭圆
   //画气泡
   arc(boon[i].x + 5, boon[i].y + 5, boon[i].x + 35, boon[i].y + 45, 0, 1.4);//画弧
   //画绳子
   arc(boon[i].x + 15, boon[i].y + 50, boon[i].x + 25, boon[i].y + 75, 5.2, 1.5);
  }
 }
 //画炮台
 setlinestyle(PS_SOLID, 2);
 circle(bat.x,bat.y, 40);//画圆
 setfillcolor(BLACK);
 solidcircle(bat.x, bat.y, 5);//画实心圆
 //画炮管
 setlinecolor(BLACK);
 setlinestyle(PS_SOLID, 5);
 line(bat.x, bat.y, bat.endx, bat.endy);
 //绘制子弹
 for (int i = 0; i < NUM; i++)//遍历所有子弹(所有包括存在和不存在)
 {
  if (ball[i].falg == true)//如果子弹存在
  {
   setfillcolor(ball[i].color);
   solidcircle(ball[i].x, ball[i].y, ball[i].r);
  }
 }
 char bar[80];//初始化字符串
 sprintf(bar, "分数:%d", bat.score);//往这个字符串里写东西
 setbkmode(0);//去掉文字背景
 settextcolor(YELLOW);//设置文字颜色
 settextstyle(40, 0, "楷体");//设置文字字体大小和字体样式(注:0表示编译器自适应)
 outtextxy(0, 0, bar);//设置文字显示位置,以及所需要显示的字符串
 EndBatchDraw();//结束双缓冲
}

我们的炮管现在还是固定的,我们需要让它跟着鼠标动起来,走,现在我们去实现鼠标操作

void MouseEvent()
{
 if (MouseHit())//如果有鼠标消息
 {
  MOUSEMSG msg = GetMouseMsg();//获取当前鼠标消息
  bat.radian = atan2((double)bat.y - msg.y, (double)msg.x - bat.x);//使用数学的正切求出炮台的炮管的倾斜弧度
  //同样使用数学知识求出二条直角边的长度
  bat.endx = bat.x + cos(bat.radian) * bat.len;//正弦
  bat.endy = bat.y - sin(bat.radian) * bat.len;//余弦
  if (msg.uMsg == WM_LBUTTONDOWN)//如果鼠标左键按下
  {
   CreatBullet();//产生子弹
  }
 }
}

那么鼠标操作这一步又涉及到子弹的产生,所以我们一起去看看子弹是如何产生的

//生成子弹
void CreatBullet()
{
 for (int i = 0; i < NUM; i++)//遍历所有子弹(所有包括存在和不存在)
 {
  if (ball[i].falg == false)//如果子弹不存在才生成
  {
   ball[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);//颜色
   //设置子弹坐标,让子弹从炮管出来
   ball[i].x = bat.endx;
   ball[i].y = bat.endy;
   ball[i].radian = bat.radian;//让子弹运动方向的水平弧度等于当前炮管的水平弧度
   //利用数学的正弦,余弦知识求出子弹的位移量,bat.speed是子弹的速度,一开始已经在炮台的结构体里面定义好了
   ball[i].vx = cos(ball[i].radian) * bat.speed;
   ball[i].vy = sin(ball[i].radian) * bat.speed;
   //设置子弹的大小(圆的半径)
   ball[i].r = 5;
   //最后一定要把子弹改为存在,好让GameDraw函数绘制出来
   ball[i].falg = true;
   //生成完一个子弹一定要break跳出for循环,否则程序会把所有子弹全部生成完,但我只要一个
   break;
  }
 }
}

子弹生成完了我们也不能让它摆在那里不动,我们得让它飞,所以我们去实现一个函数让子弹移动

void BulletMove()
{
 for (int i = 0; i < NUM; i++)
 //遍历所有子弹(所有包括存在和不存在)
 {
  if (ball[i].falg==true)//子弹存在才移动
  {
  //ball[i].vx,ball[i].vy我们在生成子弹里面就求出来了,这里我们就直接用
   ball[i].x += ball[i].vx;
   ball[i].y -= ball[i].vy;
   }
 }
}

这时你会发现你打掉(宏定义)NUM个子弹后就没有了,这是什么原因呢?走,我们一起去升级一下这个函数

void BulletMove()
{
 for (int i = 0; i < NUM; i++)
 //遍历所有子弹(所有包括存在和不存在)
 {
  if (ball[i].falg==true)//子弹存在才移动
  {
  //ball[i].vx,ball[i].vy我们在生成子弹里面就求出来了,这里我们就直接用
   ball[i].x += ball[i].vx;
   ball[i].y -= ball[i].vy;
   if (ball[i].x<0 || ball[i].x>WIDTH || ball[i].y<0 || ball[i].y>WEIGHT)
   {
    ball[i].falg = false;
   }//如果子弹打出窗口了,就把该子弹设置为不存在,这样鼠标点击就可以继续生成子弹了(保证窗口一直可以容纳(宏定义)NUM个子弹)
   }
 }
}

子弹移动了该气球了

//气球移动
void BalloonMove(int speed)
{
 for (int i = 0; i < NUM; i++)//遍历所有气球(所有涵盖存在和不存在)
 {
  if (boon[i].falg == true)//如果气球存在
  {
  //  %50的概率,让气球随风摇摆
   if (rand() % 2 == 1)
   {
    boon[i].x++;
   }
   else
   {
    boon[i].x--;
   }
   //气球上升
   boon[i].y -= speed;
 }
}

然后我们会发现会产生与子弹移动同样的问题,气球一去不复返,所以我们升级一下这个函数

//气球移动
void BalloonMove(int speed)
{
 for (int i = 0; i < NUM; i++)//遍历所有气球(所有涵盖存在和不存在)
 {
  if (boon[i].falg == true)//如果气球存在
  {
  //  %50的概率,让气球随风摇摆
   if (rand() % 2 == 1)
   {
    boon[i].x++;
   }
   else
   {
    boon[i].x--;
   }
   //气球上升
   boon[i].y -= speed;
   if (boon[i].x-40<0 || boon[i].x>WIDTH+40 || boon[i].y+50<0 || boon[i].y>WEIGHT)//如果气球升到了窗口之外
   {
    boon[i].falg = false;//把气球设置为不存在
    CreatBall();//调用产生气球的函数(气球飞离窗口)
   }
 }
}

好,接下来我们来实现一下产生气球的函数

//产生气球
void CreatBall()
{
 for (int i = 0; i < NUM; i++)//遍历所有气球(所有涵盖存在与不存在)
 {
  if (boon[i].falg == false)//如果气球不存在
  {
  //随机气球坐标
   boon[i].x = rand() % (WIDTH - 30);
   boon[i].y = (rand() % 100) + WEIGHT;
   //随机气球颜色
   boon[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);
   //生成完成把气球设置为存在
   boon[i].falg = true;
   break;//同理,只需要一个,break
  }
 }
}

现在一切准备就绪,开始打气球

//开始游戏
void PlayGame()
{
 for (int i = 0; i < NUM; i++)//遍历所有气球(所有涵盖存在和不存在)
 {
  if (boon[i].falg == false)//如果气球不存在
   continue;//跳过此次循环剩余部分,执行下一次循环判定
   for (int j = 0; j < NUM; j++)
   //遍历所有子弹(所有涵盖存在和不存在)
   {
    if (ball[j].falg == false)//如果子弹不存在
     continue;//跳过此次循环剩余部分,执行下一次循环判定
    if (ball[j].x > boon[i].x && ball[j].x<boon[i].x + 40 &&
     ball[j].y>boon[i].y && ball[j].y < boon[i].y + 50)
     //如果子弹与气球重叠(打到了气球)
    {
     CreateThread(NULL, 0, MCC, NULL, 0, NULL);//执行多线程,播放气球爆炸音效
     ball[j].falg = false;//子弹设置为不存在
     boon[i].falg = false;//气球设置为不存在
     bat.score++;//玩家分数加  1
     CreatBall();//生成气球(气球被打)
    }
   }
 }
}

下面我们把主函数(程序的入口,程序的主干)写出来

int main()
{
 initgraph(WIDTH, WEIGHT);//创建窗口
 CreateThread(NULL, 0, Music, NULL, 0, NULL);//调用多线程,循环播放背景音乐
 Welcome();//欢迎界面
 GameInit();//数据初始化
 while (1)//死循环
 {
  MouseEvent();//鼠标操作
  GameDraw();//绘制(让游戏可视化)
  BulletMove();//子弹移动
  BalloonMove(1);//气球移动
  Sleep(1);//适当延时
  PlayGame();//开始打气球
 }
 getchar();//防止闪屏
}

最后,博主送你源代码,感谢你认真的观看(因为我自己写代码很少注释,所以源代码注释少)但上面的详解可是注释慢慢,为了方便大家理解。

#include<stdio.h>
#include<math.h>
#include<graphics.h>
#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")
#pragma warning(disable : 4996)
#define WIDTH 600
#define WEIGHT 400
#define NUM 10
struct Battery
{
 int x;
 int y;
 int endx;
 int endy;
 int len;
 int speed;
 double radian;
 int score;
}bat;
struct bullet
{
 int x;
 int y;
 int r;
 int vx;
 int vy;
 bool falg;
 double radian;
 DWORD color;
}ball[NUM];
struct Balloon
{
 int x;
 int y;
 DWORD color;
 bool falg;
}boon[NUM];
IMAGE img[2];
DWORD WINAPI MCC(LPVOID lpParamter)
{
 mciSendString("open fill.mp3 alias BCC", 0, 0, 0);
 mciSendString("play BCC", 0, 0, 0);
 return 0;
}
DWORD WINAPI Music(LPVOID lpParamter)
{
 mciSendString("open music.mp3 alias BGM", 0, 0, 0);
 mciSendString("play BGM repeat", 0, 0, 0);
 while (1);
}
void Welcome()
{
 loadimage(&img[0], "1.jpg",150,400);
 loadimage(&img[1], "2.jpg", 450, 400);
 putimage(0,0,&img[0]);
 putimage(150, 0, &img[1]);
 while (1)
 {
  if (MouseHit())
  {
   MOUSEMSG msg = GetMouseMsg();
   if (msg.uMsg == WM_LBUTTONDOWN)
   {
    return;
   }
  }
 }
}
void GameInit()
{
 srand(GetTickCount());
 bat.x = WIDTH / 2;
 bat.y = WEIGHT - 10;
 bat.len = 50;
 bat.endx = bat.x;
 bat.endy = bat.y-bat.len;
 bat.speed = 7;
 bat.score = 0;
 for (int i = 0; i < NUM; i++)
 {
  ball[i].falg = false;
 }
 for (int i = 0; i < NUM; i++)
 {
  boon[i].x = rand() % (WIDTH-30);
  boon[i].y = rand() % (WEIGHT-60);
  boon[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);
  boon[i].falg = true;
 }
}
void GameDraw()
{
 BeginBatchDraw();
 setbkcolor(RGB(114, 191, 207));
 cleardevice();
 for (int i = 0; i < NUM; i++)
 {
  if (boon[i].falg==true)
  {
   //画气球
   setlinestyle(PS_SOLID, 0.1);
   setlinecolor(WHITE);
   setfillcolor(boon[i].color);
   fillellipse(boon[i].x, boon[i].y, boon[i].x + 40, boon[i].y + 50);
   //画气泡
   arc(boon[i].x + 5, boon[i].y + 5, boon[i].x + 35, boon[i].y + 45, 0, 1.4);
   //画绳子
   arc(boon[i].x + 15, boon[i].y + 50, boon[i].x + 25, boon[i].y + 75, 5.2, 1.5);
  }
 }
 //画炮台
 setlinestyle(PS_SOLID, 2);
 circle(bat.x,bat.y, 40);
 setfillcolor(BLACK);
 solidcircle(bat.x, bat.y, 5);
 //画炮管
 setlinecolor(BLACK);
 setlinestyle(PS_SOLID, 5);
 line(bat.x, bat.y, bat.endx, bat.endy);
 //绘制子弹
 for (int i = 0; i < NUM; i++)
 {
  if (ball[i].falg == true)
  {
   setfillcolor(ball[i].color);
   solidcircle(ball[i].x, ball[i].y, ball[i].r);
  }
 }
 char bar[80];
 sprintf(bar, "分数:%d", bat.score);
 setbkmode(0);
 settextcolor(YELLOW);
 settextstyle(40, 0, "楷体");
 outtextxy(0, 0, bar);
 EndBatchDraw();
}
//产生气球
void CreatBall()
{
 for (int i = 0; i < NUM; i++)
 {
  if (boon[i].falg == false)
  {
   boon[i].x = rand() % (WIDTH - 30);
   boon[i].y = (rand() % 100) + WEIGHT;
   boon[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);
   boon[i].falg = true;
   break;
  }
 }
}
//开始游戏
void PlayGame()
{
 for (int i = 0; i < NUM; i++)
 {
  if (boon[i].falg == false)
   continue;
   for (int j = 0; j < NUM; j++)
   {
    if (ball[j].falg == false)
     continue;
    if (ball[j].x > boon[i].x && ball[j].x<boon[i].x + 40 &&
     ball[j].y>boon[i].y && ball[j].y < boon[i].y + 50)
    {
     CreateThread(NULL, 0, MCC, NULL, 0, NULL);
     ball[j].falg = false;
     boon[i].falg = false;
     bat.score++;
     CreatBall();
    }
   }
 }
}
//气球移动
void BalloonMove(int speed)
{
 for (int i = 0; i < NUM; i++)
 {
  if (boon[i].falg == true)
  {
   if (rand() % 2 == 1)
   {
    boon[i].x++;
   }
   else
   {
    boon[i].x--;
   }
   boon[i].y -= speed;
   if (boon[i].x-40<0 || boon[i].x>WIDTH+40 || boon[i].y+50<0 || boon[i].y>WEIGHT)
   {
    boon[i].falg = false;
    CreatBall();
   }
  }
 }
}
//生成子弹
void CreatBullet()
{
 for (int i = 0; i < NUM; i++)
 {
  if (ball[i].falg == false)
  {
   ball[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);
   ball[i].x = bat.endx;
   ball[i].y = bat.endy;
   ball[i].radian = bat.radian;
   ball[i].vx = cos(ball[i].radian) * bat.speed;
   ball[i].vy = sin(ball[i].radian) * bat.speed;
   ball[i].r = 5;
   ball[i].falg = true;
   break;
  }
 }
}
//移动子弹
void BulletMove()
{
 for (int i = 0; i < NUM; i++)
 {
  if (ball[i].falg==true)
  {
   ball[i].x += ball[i].vx;
   ball[i].y -= ball[i].vy;
   if (ball[i].x<0 || ball[i].x>WIDTH || ball[i].y<0 || ball[i].y>WEIGHT)
   {
    ball[i].falg = false;
   }
  }
 }
}
//鼠标操作
void MouseEvent()
{
 if (MouseHit())
 {
  MOUSEMSG msg = GetMouseMsg();
  bat.radian = atan2((double)bat.y - msg.y, (double)msg.x - bat.x);
  bat.endx = bat.x + cos(bat.radian) * bat.len;
  bat.endy = bat.y - sin(bat.radian) * bat.len;
  if (msg.uMsg == WM_LBUTTONDOWN)
  {
   CreatBullet();
  }
 }
}
int main()
{
 initgraph(WIDTH, WEIGHT);
 CreateThread(NULL, 0, Music, NULL, 0, NULL);
 Welcome();
 GameInit();
 while (1)
 {
  MouseEvent();
  GameDraw();
  BulletMove();
  BalloonMove(1);
  Sleep(1);
  PlayGame();
 }
 getchar();
}

Say your GoodBey!!!
好了,祝大家学习愉快,趁青春,上代码。

  • 27
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
### 回答1: C语言是一种非常流行的编程语言,适用于各种应用场景,包括开发游戏。 要开发一个小游戏,首先需要确定游戏的类型,比如是角色扮演游戏,射击游戏,益智游戏等。然后,根据游戏类型,可以制定游戏的规则和流程。接下来,使用C语言编写代码,实现游戏的逻辑和功能。 在开发过程中,需要考虑图形学,声音,输入输出等问题,可以使用图形库和声音库等外部工具帮助实现。 开发一个游戏可能需要一定的时间和经验,但是可以通过学习和实践不断提高能力。 ### 回答2: C语言是一种强大的编程语言,适用于开发各种类型的小游戏。在使用C语言开发小游戏时,我们可以利用其各种功能和特性,实现独特有趣的游戏体验。 首先,选择一个适合的游戏类型。我们可以选择迷宫游戏、打字游戏、贪吃蛇或其他简单的游戏,这些都可以用C语言来实现。 其次,根据游戏的需求,我们可以使用C语言提供的图形库或者终端界面来创建游戏的界面。使用图形库可以实现更丰富的视觉效果,而终端界面则更加简洁方便。我们可以使用C语言的绘图函数来绘制游戏中的元素,如角色、敌人、背景等。 然后,我们需要实现游戏的逻辑和交互。通过编写C语言的程序,我们可以处理游戏中的各种事件,如按键输入、碰撞检测等。我们可以使用条件判断、循环语句和函数等,使游戏具备动态的特性,如移动、计分、关卡等。 最后,优化游戏的性能。我们可以使用C语言的优化技术,如合理使用变量、细化算法、避免重复计算等,以提高游戏的运行效率和体验。 总的来说,用C语言开发小游戏是一项有趣又有挑战的任务。通过合理的设计和编程,我们可以创造出令人愉快的游戏,给玩家带来乐趣和挑战。无论是对编程初学者还是对有经验的开发者来说,用C语言开发小游戏都是一个很好的学习和实践机会。 ### 回答3: C语言是一种功能强大且广泛应用的编程语言,非常适合用来开发小游戏。下面我将介绍一个用C语言开发小游戏的示例。 我将以一个经典的贪吃蛇游戏为例。首先,我们需要使用C语言的图形库(如OpenGL)来创建游戏窗口,并实现游戏界面的绘制。 游戏开始时,贪吃蛇会在窗口的中心位置生成,并开始往一个方向移动。玩家可以通过键盘上的方向键来控制蛇的移动方向。贪吃蛇在移动过程中会遇到果实,当贪吃蛇吃掉一个果实时,蛇的长度会增加一格,并在窗口的其他位置生成一个新的果实。 贪吃蛇的移动速度可以逐渐加快,难度会随着时间的推移而增加。如果贪吃蛇碰到自己的身体或者窗口边界,游戏就会结束。玩家可以通过记分系统来记录自己的得分。 在开发过程中,我们需要使用C语言的一些基本概念,如循环、条件语句和函数等。我们还可以利用C语言提供的数据结构来实现贪吃蛇的身体和果实的存储和管理。 开发这个贪吃蛇游戏可以锻炼我们对C语言语法的理解和应用能力,同时也可以提高我们的逻辑思维和问题解决能力。此外,C语言的高效性和跨平台性也使得我们可以轻松地将这个小游戏移植到其他平台上。 总之,用C语言开发小游戏是一个非常有趣且具有挑战性的项目。通过这个项目,我们可以提高自己的编程技能,并享受到创造和实现一个完整游戏的成就感。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值