【源码】用Win32 SDK写的贪吃蛇,欢迎交流

用Windows API 编写的简单贪吃蛇游戏 一、基础知识笔记           一种结构体,用于在控制台屏幕上定位一个字符的坐标。           应用程序中 的不同对象和同类中的不同的实例,增加了系统对引用对象的控制,句柄不是指针,但是功能类似指针。           SetConsoleCursorPosition(HANDLE Hout,COORD pos) ,定位光标的地址。           SetConso 阅读详情

先看运行效果吧:


使用mingw编译,语言为C++,下面开始源代码,分为两个文件:

以下是header.h:

Code:
  1. /* LiZhuohua 
  2.    2010/7/6  */  
  3. #ifndef _SNAKE_HEADER_H_  
  4. #define _SNAKE_HEADER_H_  
  5. #define N 16  
  6. struct SNAKE  
  7. {  
  8.     int x[N];//横坐标  
  9.     int y[N];//纵坐标  
  10.     int direct;//方向:1、上 2、下 3、左 4、右  
  11.     int node;//节数  
  12.     int life;//生命  
  13. } snake;  
  14.   
  15. struct FOOD  
  16. {  
  17.     int x;  
  18.     int y;  
  19.   
  20. } food;  
  21.   
  22. void foodset(struct FOOD*,struct SNAKE*);  
  23. #endif // _SNAKE_HEADER_H_  

以下是main.cpp:

Code:
  1. /* LiZhuohua 
  2.    2010/7/6  */  
  3. #include <windows.h>  
  4. #include <stdlib.h>  
  5. #include <time.h>  
  6. #include "header.h"  
  7. /*  Declare Windows procedure  */  
  8. LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);  
  9.   
  10. /*  Make the class name into a global variable  */  
  11. char szClassName[ ] = "LiZhuohuaWindowsApp";  
  12.   
  13. int WINAPI WinMain (HINSTANCE hThisInstance,  
  14.                     HINSTANCE hPrevInstance,  
  15.                     LPSTR lpszArgument,  
  16.                     int nCmdShow)  
  17. {  
  18.     HWND hwnd;               /* This is the handle for our window */  
  19.     MSG messages;            /* Here messages to the application are saved */  
  20.     WNDCLASSEX wincl;        /* Data structure for the windowclass */  
  21.   
  22.     /* The Window structure */  
  23.     wincl.hInstance = hThisInstance;  
  24.     wincl.lpszClassName = szClassName;  
  25.     wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */  
  26.     wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */  
  27.     wincl.cbSize = sizeof (WNDCLASSEX);  
  28.   
  29.     /* Use default icon and mouse-pointer */  
  30.     wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);  
  31.     wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);  
  32.     wincl.hCursor = LoadCursor (NULL, IDC_ARROW);  
  33.     wincl.lpszMenuName = NULL;                 /* No menu */  
  34.     wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */  
  35.     wincl.cbWndExtra = 0;                      /* structure or the window instance */  
  36.     /* Use Windows's default colour as the background of the window */  
  37.     wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;  
  38.   
  39.     /* Register the window class, and if it fails quit the program */  
  40.     if (!RegisterClassEx (&wincl))  
  41.         return 0;  
  42.   
  43.     /* The class is registered, let's create the program*/  
  44.     hwnd = CreateWindowEx (  
  45.                0,                   /* Extended possibilites for variation */  
  46.                szClassName,         /* Classname */  
  47.                "贪吃蛇",       /* Title Text */  
  48.                WS_DLGFRAME|WS_SYSMENU, /* default window */  
  49.                CW_USEDEFAULT,       /* Windows decides the position */  
  50.                CW_USEDEFAULT,       /* where the window ends up on the screen */  
  51.                506,                 /* The programs width */  
  52.                428,                 /* and height in pixels */  
  53.                HWND_DESKTOP,        /* The window is a child-window to desktop */  
  54.                NULL,                /* No menu */  
  55.                hThisInstance,       /* Program Instance handler */  
  56.                NULL                 /* No Window Creation data */  
  57.            );  
  58.   
  59.     /* Make the window visible on the screen */  
  60.     ShowWindow (hwnd, nCmdShow);  
  61.   
  62.     /* Run the message loop. It will run until GetMessage() returns 0 */  
  63.     while (GetMessage (&messages, NULL, 0, 0))  
  64.     {  
  65.         /* Translate virtual-key messages into character messages */  
  66.         TranslateMessage(&messages);  
  67.         /* Send message to WindowProcedure */  
  68.         DispatchMessage(&messages);  
  69.     }  
  70.   
  71.     /* The program return-value is 0 - The value that PostQuitMessage() gave */  
  72.     return messages.wParam;  
  73. }  
  74.   
  75.   
  76. /*  This function is called by the Windows function DispatchMessage()  */  
  77.   
  78. LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)  
  79. {  
  80.     switch (message)                  /* handle the messages */  
  81.     {  
  82.     case WM_CREATE:                   /*窗口创建时初始化snake结构,计时器和食物坐标*/  
  83.     {  
  84.         int i,j;  
  85.         snake.direct=4;  
  86.         snake.node=4;  
  87.         snake.life=1;  
  88.         for(i=0,j=200; i<snake.node; ++i,j-=25)  
  89.         {  
  90.             snake.x[i]=j;  
  91.             snake.y[i]=100;  
  92.         }  
  93.         SetTimer(hwnd,1,300,NULL); //计时器每300毫秒发出一次WM_TIMER消息,可以自己调  
  94.   
  95.         foodset(&food,&snake);  
  96.     }  
  97.     break;  
  98.     case WM_PAINT:  
  99.     {  
  100.         int i;  
  101.         PAINTSTRUCT ps;  
  102.         HDC hdc;  
  103.         HPEN hpen;  
  104.         HBRUSH hbrush;  
  105.         hdc=BeginPaint(hwnd,&ps);  
  106.         hpen=CreatePen(PS_SOLID, 1, RGB (255, 0, 0)) ; //红色边框  
  107.         hbrush=CreateSolidBrush(RGB(255,0,0));  //红色填充  
  108.         SelectObject(hdc,hpen);  
  109.         SelectObject(hdc,hbrush);  
  110.         Rectangle(hdc,food.x,food.y,food.x+25,food.y+25); //绘制食物  
  111.         hbrush=CreateSolidBrush(RGB(0,0,255));  //蓝色填充  
  112.         SelectObject(hdc,hbrush);  
  113.         for(i=0; i<snake.node; ++i) /*绘制矩形作为蛇身*/  
  114.             Rectangle(hdc,snake.x[i],snake.y[i],snake.x[i]+25,snake.y[i]+25);  
  115.         EndPaint(hwnd,&ps);  
  116.     }  
  117.     break;  
  118.     case WM_KEYDOWN:  
  119.     {  
  120.         switch(wParam)  
  121.         {  
  122.         case VK_LEFT:             /*不能反方向拐弯*/  
  123.             if(snake.direct!=4)  
  124.                 snake.direct=3;  
  125.             break;  
  126.         case VK_RIGHT:  
  127.             if(snake.direct!=3)  
  128.                 snake.direct=4;  
  129.             break;  
  130.         case VK_UP:  
  131.             if(snake.direct!=2)  
  132.                 snake.direct=1;  
  133.             break;  
  134.         case VK_DOWN:  
  135.             if(snake.direct!=1)  
  136.                 snake.direct=2;  
  137.             break;  
  138.         }  
  139.     }  
  140.     break;  
  141.     case WM_TIMER:  //计时器到时的时候  
  142.     {  
  143.         int i;  
  144.         for(i=snake.node-1; i>0; i--)  //关键代码,实现蛇身跟着蛇头走  
  145.         {  
  146.             snake.x[i]=snake.x[i-1];  
  147.             snake.y[i]=snake.y[i-1];  
  148.         }  
  149.         switch(snake.direct)  
  150.         {  
  151.         case 1:  
  152.         {  
  153.             snake.y[0]-=25;  
  154.         }  
  155.         break;  
  156.         case 2:  
  157.         {  
  158.             snake.y[0]+=25;  
  159.         }  
  160.         break;  
  161.         case 3:  
  162.         {  
  163.             snake.x[0]-=25;  
  164.         }  
  165.         break;  
  166.         case 4:  
  167.         {  
  168.             snake.x[0]+=25;  
  169.         }  
  170.         break;  
  171.         }  
  172.   
  173.         if(snake.x[0]==food.x&&snake.y[0]==food.y)   //判断是否吃到食物  
  174.         {  
  175.             snake.node++;  
  176.             snake.x[snake.node-1]=snake.x[snake.node-2];  
  177.             snake.y[snake.node-1]=snake.y[snake.node-2];  
  178.             foodset(&food,&snake);  
  179.         }  
  180.         if(snake.x[0]==500||snake.x[0]==-25||snake.y[0]==400||snake.y[0]==-25)  //判断是否撞墙  
  181.         {  
  182.             snake.life=0; //蛇死了  
  183.             KillTimer(hwnd,1);  
  184.             MessageBox(hwnd,TEXT("撞墙了!"),TEXT("贪吃蛇"),MB_OK);  
  185.         }  
  186.         for(int i=3; i<snake.node; ++i)   /*判断是否吃到自己,从第4节开始判断,因为第三节无论如何也转不过来*/  
  187.         {  
  188.             if(snake.x[0]==snake.x[i]&&snake.y[0]==snake.y[i])  
  189.             {  
  190.                 snake.life=0;  //蛇死了  
  191.                 KillTimer(hwnd,1);  
  192.                 MessageBox(hwnd,TEXT("巨能啊!自己吃自己?"),TEXT("贪吃蛇"),MB_OK);  
  193.             }  
  194.         }  
  195.         if(snake.life==1) //如果没死就重绘屏幕  
  196.         {  
  197.             InvalidateRect(hwnd,NULL,1);  
  198.             UpdateWindow(hwnd);  
  199.         }  
  200.         if(snake.node==16)  //蛇长到16节就赢了,这个可以自己调  
  201.         {  
  202.             KillTimer(hwnd,1);  
  203.             MessageBox(hwnd,TEXT("你赢了!"),TEXT("贪吃蛇"),MB_OK);  
  204.         }  
  205.     }  
  206.     break;  
  207.     case WM_DESTROY:  
  208.         PostQuitMessage (0);       /* send a WM_QUIT to the message queue */  
  209.         break;  
  210.     default:                      /* for messages that we don't deal with */  
  211.         return DefWindowProc (hwnd, message, wParam, lParam);  
  212.     }  
  213.   
  214.     return 0;  
  215. }  
  216.   
  217. void foodset(struct FOOD *a,struct SNAKE *b)  //这是设置食物的函数  
  218. {  
  219.     while(1)  
  220.     {  
  221.         int i,boolfood=1;  
  222.         srand((unsigned)time(NULL));  
  223.         a->x=rand()%451;  
  224.         a->y=rand()%351;  
  225.         while((a->x%25)!=0)  //必须被25整除才可,否则蛇吃不到  
  226.             (a->x)++;  
  227.         while(a->y%25!=0)  
  228.             (a->y)++;  
  229.         for(i=0; i<b->node; ++i)  //食物不能与蛇身重合  
  230.             if((b->x[i]==a->x)&&(b->y[i]==a->y))  
  231.             {  
  232.                 boolfood=0;  
  233.                 break;  
  234.             }  
  235.         if(boolfood)  
  236.         {  
  237.             break;  
  238.         }  
  239.   
  240.     }  
  241. }  

自我感觉不足的地方就是筛选食物坐标的算法,很慢,在游戏的时候会有卡的感觉,请大家帮忙改一下!

计算机软件实习二----贪吃蛇项目 本项目使用MFC框架实现了贪吃蛇游戏的基本功能,包括蛇的移动、吃食物、碰撞检测和绘制等。代码结构清晰,使用了面向对象的编程思想,使得代码易于理解和扩展。在项目开发过程中,可以根据需要添加更多的功能,如计分、难度调整、游戏音效等,以增加游戏的趣味性和可玩性。 阅读详情

相关推荐

贪吃蛇(Windows SDK)

图形用windows api绘制,逻辑思路在类Snake中, 用list存储蛇坐标.初学者可以参考一下.

贪吃蛇详解Windows编程(四)

控制区的代码就不详细讲解了,自己看看就能明白,并没有什么难点。如果有兴趣的画还可以把界面做好一点,把功能做丰富一点。但是我觉得点到为止就行了。我用的是Win32空项目写的,你也可以用自动生成的代码写,但是我觉得那个太乱代码太多。 接下来是全部的代码: #include <windows.h> #include <vector> #include <time.h>//游戏区和控制区宽度高度 #def

_ACME_的博客 3312

windows_sdk实现贪吃蛇过程

这是上学期程序设计与实践3课程的一部分,用windows sdk写一个贪吃蛇。此项目由教师在课堂上演示、查SDK手册和解释、design和实现及解释代码,学生观摩。一共进行了五次课。持续五周,每周一次课,每次课90分钟。

Snake Game---贪吃蛇WINAPI版

    经过几天的构思, 终于有一点思路了. 现把雏形贴上, 供大家指点一二. 只实现了移动, 其它的未完成.   用VC++6.0 Win32 Application工程编译通过. /* include files and constant variables here.*/#ifndef _RESOURCE_H_#define _RESOURCE_H_

eryar 939

win32 SDK做得贪吃蛇

用windows API做的贪吃蛇,按空格开始、暂停,比较简单。

win32 sdk版 贪吃蛇 300行代码

win32 sdk版 贪吃蛇 300行代码

【C/C++实战项目】贪吃蛇游戏

C语言代码实现贪吃蛇游戏设计、游戏机制、游戏界面、文件读写、自定义设置

phoenixFlyzzz的博客 7320

win32版贪吃蛇源码,值得新手学习,框架清晰,方便添加功能

win32版贪吃蛇源码C++,值得新手学习,框架清晰,方便添加功能,可以帮助熟练掌握stl关于容器的使用,以及对学习win32的铁子帮助很大,可以添加很多新功能,值得新手学习,如有发现bug,欢迎指正交流,一起进步

win 32sdk编写贪吃蛇(附源代码)

某天晚上闲着无聊就写了个贪吃蛇链表,然后第二天就开始就主程序了,很快就写完了,所以大家如果有好的思路,不妨也动动手嘛。好记性不如烂笔头嘛。贪吃蛇的思路挺简单的,就是用一个链表来保存蛇的路线,不过这个链表是经过特殊构造的,主要思路就是把客户区分成若干个小方格子,然后链表会保存x和y坐标,这个算是最重要的了,其它的都挺简单的,在这里就不赘述了。 打开vc6,然后新建一个win32空项目就可以了。

complety的专栏 3916

告别ROS1!在Ubuntu 22.04上为VINS-Fusion适配ROS2 Humble的完整踩坑记录

本文详细记录了在Ubuntu 22.04上将VINS-Fusion从ROS1迁移到ROS2 Humble的完整过程,包括环境搭建、依赖管理、核心代码适配及性能优化。通过实战案例和调试技巧,帮助开发者高效解决迁移过程中的常见问题,提升系统稳定性和性能。

weixin_42628688的博客 280

北航论文模板:解决XeLaTeX中Font shape'TU/SimSun(1)/b/n' undefined(font) using 'TU/SimSun(1)/m/n' instead

北航论文模板:解决XeLaTeX中Font shape ‘TU/SimSun(1)/b/n’ undefined(font) using ‘TU/SimSun(1)/m/n’ instead 问题 问题描述: 在使用北航论文模板时,产生了warning:Font shape 'TU/SimSun(1)/b/n' undefined(font) using 'TU/SimSun(1)/m/n' i...

qq_39560620的博客 1万+

C#语言编写的仅有8KB大小的简易贪吃蛇开源游戏

今天大姚给大家分享一款由C#语言编写的仅有8KB大小的简易贪吃蛇开源游戏:SeeSharpSnake。

专注于C#/.NET/.NET Core学习、工作、面试干货和实战教程分享。这里聚焦了大量的C#/.NET/.NET Core优质文章、开源项目、实用工具和学习、工作、面试心得。 674

企业信息化系统的组成模块-核心业务系统

通过标准化的数据流形成完整的业务闭环,CRM生成的销售订单驱动ERP的生产和采购,ERP将生产计划传递给MES执行,MES报工数据返回ERP进行成本核算,ERP再将交付信息同步给CRM供客户查询。生产管理确保高效交付,缩短订单周期。某贸易公司实施ERP供应链模块后,库存周转率从每年4次提升到8次,库存资金占用从2000万降到1200万,释放800万现金流,同时缺货率从15%降到5%。│ │库存 │ │ MRP │ │ ERP │ │ 云ERP/ │ │。

weiyvyy的博客 694

sdk编程实现贪吃蛇(c++)

题目是我们c++的一个课设题目,用了将近一个礼拜的的时间写成了贪吃蛇的大框,写了两个版本的贪吃蛇,第二个版本的相较于第一个版本有点画面和功能上有了一定的改善,但是内部逻辑是基本没有变化的 源码如下 1 #include<windows.h> #include<tchar.h> #include<math.h> #include<stdio.h> #include<time.h> #define NUM 1000 BOOL InitInstance(

weixin_45695535的博客 349

基于多头注意力时间卷积网络(MATCN)的虚拟电厂短期功率预测模型

​时空特征解耦​:TCN负责时间模式,注意力捕捉空间关联​动态门控机制​:自适应调整两种特征的融合比例​多尺度感知​:膨胀卷积覆盖5分钟到24小时的时间跨度​轻量化设计​:参数量比传统Transformer减少52%

hasakie的博客 322

密码学与信息安全面试题及参考答案(2万字长文)

密码学是一门研究信息安全的学科,它涉及加密、解密以及保护数据免受非授权访问的技术和方法。这门学科的核心在于设计并分析各种协议,使通信双方即使在存在潜在敌手的环境中也能安全地传输信息。保密性:确保信息只能被预期的接收方读取,阻止未经授权的第三方获取信息的真实内容。完整性:保证数据在传输过程中不被篡改,确保接收方接收到的信息与发送方发送的信息完全一致。认证性:验证信息的来源,即确认信息确实是由声称的发送方发出的。不可否认性:确保发送方不能在事后否认曾经发送过某条信息。访问控制。

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

使用VS开发桌面程序--贪吃蛇小程序

为了更好的理解Windows程序的运行机制,笔者当年尝试写了第一个程序--贪吃蛇,逐渐从事公司部分Windows开发工作(当然主业还是嵌入式开发啦) 前期准备: 开发环境:Visual Studio 2015 编程语言:C/C++ 那我们一起开始VS开发吧。 创建工程 【文件】->【新建】->【项目】选择Visual C++ 空项目(空项目让我们从头搭建,能有更深刻的理解)完成后,这时候在资源管理器一栏看到的也是什么也没有的。 新建资源文件 这里我们需要添加W...

weixin_38426553的博客 8952

TIA protal与SCL从入门到精通(4)——软件单元使用

平台: TIA portal 15.1 1.添加软件单元 添加软件单元如下图: 关于软件单元使用基本限制,看如下文章即可 TIA protal与SCL从入门到精通(3)——软件单元基本介绍 每个软件单元是一个独立结构,所以每个软件单元的运行方式与实际PLC类似,所以首先添加主函数块: 注意:无论系统是否是具有并发性(这里不要混淆并行与并发的概念),在PLC所有主函数执行总是按主函数依次完成...

苦走一口田 7375

贪吃蛇教程

文件1: // Snake4.cpp : 定义应用程序的入口点。 // #include "stdafx.h" #include "Snake4.h" #define MAX_LOADSTRING 100 // 全局变量: HINSTANCE hInst; // 当前实例 TCHAR szTitle[MAX_LOA

青草非鱼 946

量子化学仿真软件:VASP_(9).磁性材料计算

在量子化学仿真软件 VASP 中,磁性材料的计算是一个复杂但重要的过程。通过正确设置磁性状态、分析磁性性质、优化计算参数以及研究磁性相变和磁动力学,可以更准确地描述和预测磁性材料的性能。希望本节的内容能够为研究磁性材料的科研人员提供有用的参考和指导。

kkchenjj的博客 1375

微信小程序(云开发) - 实现微信小程序拼团功能+前后台源码/数据库设计,开团参团、自动成团、微信分享链接URL参与拼团、组团人数/倒计时/实时数据、设置拼团人数限制等(拼团退款处理逻辑、订单同步等)

实现微信小程序云开发拼团功能,云开发小程序--微信拼团设计实现,微信小程序实现秒杀、拼团等效果,微信小程序云开发拼团源码完整版 包含前后台和数据库,拼团商城小程序开发,分销,拼团,社群团购,微信小程序—判断参团人数(设置拼团剩余人数数组)拼多多拼团小程序开发,微信云开发教程怎么实现微信小程序云开发拼团功能?云开发如何实现拼团,拼团小程序怎么弄,微信小程序案例:拼团模块,需要朋友助力,详细源码demo示例,如何做拼团功能,云开发小程序如何做拼团功能,外卖电商拼团,仿拼多多拼团,拼团后退款怎么办,拼团后订单管理

🏆 前端领域优质创作者 4627

贪吃蛇游戏的简单设计

<br /> 最近整理以前写的一些程序,大多数价值不大,都是些学习时练手的简陋程序,很多还是半成品,不过自己看着倍感亲切啊,呵呵!其中有一个贪吃蛇的小游戏,用C++写的,不过没用MFC,呵呵,有点非主流啊!不过当时刚开始学windows程序设计,使用SDK编程,貌似还不知道MFC和KFC有啥不同吧...<br />其实这个设计的很糟糕,不过是我第一次进行相对复杂和完整的面向对象设计吧,还是有纪念意义的。<br /> <br />//**************************************

轻狂书生 959

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【C语言】贪吃蛇项目(1) - 部分Win32 API详解 及 贪吃蛇项目思路

本次实现贪吃蛇会使用到的一些Win32 API知识,接下来我们就学习一下。Windows 这个多作业系统除了协调应用程序的执行、分配内存、管理资源之外,它同时也是一个很大的服务中心,调用这个服务中心的各种服务(每一种服务就是一个函数),可以帮应用程序达到开启视窗、描绘图形、使用周边设备等目的,由于这些函数服务的对象是应用程序(Application),所以便称之为 Application Programming Interface,简称AP|函数。

2301_77954967的博客 1146

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

MetaCogAgent:基于元认知的动态多智能体协作框架解析

多智能体系统是人工智能领域的重要研究方向,旨在通过多个智能体的协同工作解决复杂任务。其核心原理在于模拟人类团队分工,通过智能体间的通信与协作,实现超越单个智能体的能力。这项技术的核心价值在于提升任务处理的可靠性、效率与适应性,尤其在开放式、多步骤的复杂场景中优势明显。应用场景广泛覆盖自动化工作流、深度研究分析、创意生成与复杂问题诊断等领域。本文聚焦的 MetaCogAgent 框架,创新性地引入了元认知层,为系统赋予了动态的自我监控与任务协调能力。该框架通过持续的状态监控、表现评估和智能的任务再委派,有效解

weixin_34296641的博客 471

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

手把手教你实现贪吃蛇

C语言实现贪吃蛇

熵减玩家 1585
AllStarGame
博客等级 码龄16年 0粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值