linux版推箱子(带地图编辑器)

#include"stdio.h"
#include "termios.h"
#include "stdlib.h"
//------------------Game---------------------
int w=39;
int h=20;
struct MapId{          //定义地图结构体
int id;
int EditMapId[18][18];
}m1,m2;
struct Note{          //定义地图结构体
int n;
struct Note *next;
}*head,*p,*pn;  
struct Point{          //定义一个点
int x;
int y;
};
struct Point G1;
struct Point G;     //定义一个光标
struct Point P;     //定义一个人物
struct Point B[10]; //最多10个箱子
int M=0;
int GK=1;
int NGK=0;
int MapId[40][20]={0};
int EditMapId[18][18]={0};
//---------初始化所有关卡---------
//0是路,1是墙,2是人,3是箱子,4是地点
int TMap[9][9]={1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,3,3,3,0,0,1,1,0,2,4,4,4,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1};
int Pmap1[8][9]={0,1,1,1,1,1,1,1,0,0,1,0,2,4,4,4,1,0,0,1,0,0,0,1,1,1,1,1,1,1,3,0,0,0,0,1,1,0,0,0,1,3,1,0,1,1,0,3,0,1,0,0,0,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0};                                         
void gotoxy(int x,int y);         //1光标定位 
int getch();                      //2得到一个字符
void clear();                     //3清屏
void Hit();                       //4隐藏光标
void People(int x,int y);         //5地球人
void Brick(int x,int y);          //6砖头
void Box(int x,int y);            //7箱子
void BoxEnd(int x,int y);         //8目的地
void ClearPB(int x,int y);        //9清除地面
void Map();                       //10初始化地图
int PMmap(int x,int y,int id[x][y]);//11初始化关卡地图
void InitMap(int a[40][20]);      //12初始化文件关卡地图
void PeMove(int F);               //13地球人移动
int BoxMove(int F);               //14箱子移动
int IfEnd(int x,int y);           //15判断人是否在目的地
void Start();                     //16游戏开始
void Over();                      //17游戏结束
int Life();                       //18判断游戏是否结束
int Cunt();                       //19计分
void Menu();                      //20菜单
void ShowStart(int x,int y,int i);//21显示开始文字
void ShowEdit(int x,int y,int i); //22显示地图编辑器
void ShowExit(int x,int y,int i); //23显示退出
void ShowMesMap();                //24显示提示窗口
void ShowEditMap();               //25显示地图编辑
void EditMap();                   //26地图编辑函数
void EditMove(int T);             //27编辑者移动
void EditFileSave(int a[18][18]); //28编辑者地图保存
void EditFileRed(int n);          //29编辑者地图读取
void MapCap();                    //30地图复制
void MapIdC();                    //31地图清零
int EditLen();                    //32计算有多少张地图
void ShowGK();                    //显示关卡
//-------------------------------------------
int getch()
{
struct termios tm,tm_old;
int fd=0,ch;
if(tcgetattr(fd,&tm)<0){//保存现在的终端设置
return -1;
}
tm_old=tm;
cfmakeraw(&tm);//更改终端为原始模式,该模式数据以字节为单位处理
if(tcsetattr(fd,TCSANOW,&tm)<0){
return -1;
}
ch=getchar();
if(tcsetattr(fd,TCSANOW,&tm_old)<0){//更改最初的样子

return -1;
}
return ch;
}
//-------------------------------------
//------------gotoxy()光标定位----------
void gotoxy(int x,int y)
{
printf("%c[%d;%df",0x1B,y,x);
}
//-------------------清屏函数------------
void clear(){
system("clear");
}
//-------------------隐藏光标-------------
void Hit()
{
printf("\033[?25l\033[0m"); //隐藏光标 
}
//------------------显示函数----------------//
//显示一个地球人帮员工
void People(int x,int y)
{
gotoxy(x,y);
printf("\033[44;36m[]\033[0m");
}
//显示一块砖头
void Brick(int x,int y)
{
gotoxy(x,y);
printf("\033[46;36m  \033[0m");

}
//显示一个箱子
void Box(int x,int y)
{
gotoxy(x,y);
printf("\033[41;36m[]\033[0m");
}
//显示一个安放点boxend
void BoxEnd(int x,int y)
{
gotoxy(x,y);
printf("[?");
}
//清除当前显示的东西
void ClearPB(int x,int y)
{
gotoxy(x,y);
printf("\033[43;36m  \033[0m");
}
 //---------------------------------------显示提示窗口
void ShowMesMap(){
clear();
int i;
int j;
for(i=5;i<=w-10;i++)
{
for(j=5;j<=h-5;j++)
{
if(i==5||j==5||i==w-10||j==h-5){
gotoxy(i,j);printf("\033[40;36m  \033[0m");
}
else{ gotoxy(i+1,j);printf("\033[43;36m  \033[0m");
}
}
}

}  
 //---------------------------显示地图编辑            
void ShowEditMap(){
clear();
int i;
int j;
for(i=1;i<=w;i++)
{
for(j=1;j<=h;j++)
{
if(i==1||j==1||i==w||j==h){gotoxy(i,j);printf("\033[40;36m  \033[0m");}
else{ gotoxy(i+1,j);printf("\033[43;36m  \033[0m");
}
}
}
ClearPB(3,h+1);printf("0");
Brick(7,h+1);printf("1");
People(11,h+1);printf("2");
Box(15,h+1);printf("3");
BoxEnd(19,h+1);printf("4");
gotoxy(24,h+1);printf("Put:Enter");
gotoxy(36,h+1);printf("Save:Y");
EditMap();
}  
 //------------------------------地图编辑函数  
void MapIdC(){    //-----------清除所有数据
int i;
int j;
M=0;
P.x=0;
P.y=0;
for(i=0;i<18;i++)
for(j=0;j<18;j++)
{
EditMapId[i][j]=0;
}
for(i=0;i<10;i++){
B[i].x=0;
B[i].y=0;
}
for(i=3;i<40;i+=2)
{
for(j=1;j<20;j++)
{
MapId[i][j]==0;
}
}
}
void EditMap(){
MapIdC();
G.x=3;
G.y=2;
int Type=1;
int ch=49;
while(ch!=121){

switch(ch){

case 48:{       //----------变成路
Type=0;
EditMapId[G.y-2][G.x/2-1]=0;
ClearPB(G.x,G.y);
break;}
case 49:{       //----------变成砖
Type=1;
Brick(G.x,G.y);
break;}
case 50:{       //----------变成人
Type=2;
People(G.x,G.y);
break;}
case 51:{       //----------变成箱子
Type=3;
Box(G.x,G.y);
break;}
case 52:{       //----------变成目的地
Type=4;
BoxEnd(G.x,G.y);
break;}
case 13:{      //----------安放
EditMapId[G.y-2][G.x/2-1]=Type;
gotoxy(3,h+3);printf("%d   %d   ",G.y-2,G.x/2-1);
break;}
case 119:{
if(EditMapId[G.y-2][G.x/2-1]==0)
ClearPB(G.x,G.y);
if(G.y>2)G.y--;
break;}
case 115:{
if(EditMapId[G.y-2][G.x/2-1]==0)
ClearPB(G.x,G.y);
if(G.y<h-1)G.y++;
break;}
case 97:{
if(EditMapId[G.y-2][G.x/2-1]==0)
ClearPB(G.x,G.y);
if(G.x>3)G.x-=2;
break;}
case 100:{
if(EditMapId[G.y-2][G.x/2-1]==0)
ClearPB(G.x,G.y);
if(G.x<w-3)G.x+=2;
break;}


}
EditMove(Type);
ch=getch();
}
EditFileSave(EditMapId);
Menu();

} 
//-------------------------------编辑者地图保存
void MapCap(){
int i;
int j;
for(i=0;i<18;i++)
for(j=0;j<18;j++)
{
m1.EditMapId[i][j]=EditMapId[i][j];
}
}
int EditLen(){
FILE *f=NULL;
int n=1;
f=fopen("Map.hes","rb");
if(f==NULL)return 0;
fread(&m1,sizeof(struct MapId),1,f);
while(!feof(f)){
fread(&m1,sizeof(struct MapId),1,f);
n++;
}
fclose(f);
return n;
}

void EditFileSave(int a[18][18]){

m1.id=EditLen();
if(m1.id==0)m1.id=1;
gotoxy(3,h+4);printf("%d  ",m1.id);
MapCap();
FILE *f;
f=fopen("Map.hes","ab+");
fwrite(&m1,sizeof(struct MapId),1,f);
fclose(f);
} 
//-------------------------------编辑者地图读取


void EditFileRed(int n){
FILE *f;
f=fopen("Map.hes","rb");
while(!feof(f))
{
fread(&m1,sizeof(struct MapId),1,f);
if(n==m1.id)break;
}
fclose(f);


}             
//----------------------------------------------------------------地图链表实现


                         
//------------------------------------------菜单
void Menu(){
G.x=15;
G.y=8;
int ch=0;
//Map();
ShowMesMap();
ShowStart(G.x,G.y,2);
ShowEdit(G.x,G.y+1,1);
ShowExit(G.x,G.y+2,1);
while(1){
ch=getch();
if(ch==13){
switch(G.y){
case 8:{  //  开始菜单
ShowGK(); 
//Start();
break;}
case 9:{
ShowEditMap();
break;}
case 10:{
gotoxy(w+2,h+2);
exit(0);
break;}
}
}
switch(ch){
case 119:{
if(G.y>8)G.y--;
else G.y=10;
if(G.y==8){
ShowStart(G.x,G.y,2);
ShowEdit(G.x,9,1);
ShowExit(G.x,10,1);
}
if(G.y==9){
ShowStart(G.x,8,1);
ShowEdit(G.x,G.y,2);
ShowExit(G.x,10,1);
}
if(G.y==10){
ShowStart(G.x,8,1);
ShowEdit(G.x,9,1);
ShowExit(G.x,G.y,2);
}
break;}
case 115:{
if(G.y<10)G.y++;
else G.y=8;
if(G.y==8){
ShowStart(G.x,G.y,2);
ShowEdit(G.x,9,1);
ShowExit(G.x,10,1);
}
if(G.y==9){
ShowStart(G.x,8,1);
ShowEdit(G.x,G.y,2);
ShowExit(G.x,10,1);
}
if(G.y==10){
ShowStart(G.x,8,1);
ShowEdit(G.x,9,1);
ShowExit(G.x,G.y,2);
}

break;}
case 97:{

break;}
case 100:{

break;}

}
}


gotoxy(w+2,h+2);
}
//--------------------------显示开始文字
void ShowStart(int x,int y,int i){
if(i==1){
gotoxy(x,y);
printf("\033[43;36m  Start   \033[0m");
}
if(i==2){
gotoxy(x,y);
printf("\033[44;36m >Start   \033[0m");
}
}
//---------------------------显示地图编辑器
void ShowEdit(int x,int y,int i){
if(i==1){
gotoxy(x,y);
printf("\033[43;36m  MapEdit \033[0m");
}
if(i==2){
gotoxy(x,y);
printf("\033[44;36m >MapEdit \033[0m");
}
}
//------------------------------显示退出
void ShowExit(int x,int y,int i){
if(i==1){
gotoxy(x,y);
printf("\033[43;36m  Exit    \033[0m");
}
if(i==2){
gotoxy(x,y);
printf("\033[44;36m >Exit    \033[0m");
}
}
//---------------------编辑者移动------------------
void EditMove(int T){
switch(T){
case 0:{
if(EditMapId[G.y-2][G.x/2-1]==0)
ClearPB(G.x,G.y);
break;}
case 1:{
if(EditMapId[G.y-2][G.x/2-1]==0)
Brick(G.x,G.y);
break;}
case 2:{
if(EditMapId[G.y-2][G.x/2-1]==0)
People(G.x,G.y);
break;}
case 3:{
if(EditMapId[G.y-2][G.x/2-1]==0)
Box(G.x,G.y);
break;}
case 4:{
if(EditMapId[G.y-2][G.x/2-1]==0)
BoxEnd(G.x,G.y);
break;}
}

}

//---------------------人物移动函数----------------------//
void PeMove(int F)
{

if(IfEnd(P.x,P.y))MapId[P.x][P.y]=4;
switch(F)
{
case 119:{
switch(MapId[P.x][P.y-1])
{
case 0:
{
P.y-=1;
ClearPB(P.x,P.y+1);
if(MapId[P.x][P.y+1]==4)BoxEnd(P.x,P.y+1);
People(P.x,P.y);
break;}
case 1:
{
break;}
case 3:
{
if(BoxMove(119)){
P.y-=1;
ClearPB(P.x,P.y+1);
if(MapId[P.x][P.y+1]==4)BoxEnd(P.x,P.y+1);
People(P.x,P.y);

}
break;}
case 4:
{

BoxEnd(P.x,P.y);
if(MapId[P.x][P.y]==0)ClearPB(P.x,P.y);
P.y-=1;
People(P.x,P.y);
break;}
}

break;}
case 115:{
switch(MapId[P.x][P.y+1])
{
case 0:
{
P.y+=1;
ClearPB(P.x,P.y-1);
if(MapId[P.x][P.y-1]==4)BoxEnd(P.x,P.y-1);
People(P.x,P.y);
break;}
case 1:
{
break;}
case 3:
{
if(BoxMove(115)){
P.y+=1;
ClearPB(P.x,P.y-1);
if(MapId[P.x][P.y-1]==4)BoxEnd(P.x,P.y-1);
People(P.x,P.y);
}
break;}
case 4:
{
BoxEnd(P.x,P.y);
if(MapId[P.x][P.y]==0)ClearPB(P.x,P.y);
P.y+=1;
People(P.x,P.y);
break;}
}

break;}
case 97:{
switch(MapId[P.x-2][P.y])
{
case 0:
{
ClearPB(P.x,P.y);
P.x-=2;
if(MapId[P.x+2][P.y]==4)BoxEnd(P.x+2,P.y);
People(P.x,P.y);
break;}
case 1:
{
break;}
case 3:
{
if(BoxMove(97)){
P.x-=2;
ClearPB(P.x+2,P.y);
if(MapId[P.x+2][P.y]==4)BoxEnd(P.x+2,P.y);
People(P.x,P.y);
}
break;}
case 4:
{
BoxEnd(P.x,P.y);
if(MapId[P.x][P.y]==0)ClearPB(P.x,P.y);
P.x-=2;
People(P.x,P.y);
break;}

}
break;}

case 100:{
switch(MapId[P.x+2][P.y])
{
case 0:
{

 ClearPB(P.x,P.y);
P.x+=2;
People(P.x,P.y);
if(MapId[P.x-2][P.y]==4)BoxEnd(P.x-2,P.y);
break;}
case 1:
{
break;}
case 3:
{
if(BoxMove(100)){
P.x+=2;
ClearPB(P.x-2,P.y);
if(MapId[P.x-2][P.y]==4)BoxEnd(P.x-2,P.y);
People(P.x,P.y);
}
break;}
case 4:
{

BoxEnd(P.x,P.y);
if(MapId[P.x][P.y]==0)ClearPB(P.x,P.y);
P.x+=2;
People(P.x,P.y);
break;}

}
break;}
}
}
//--------------------------------------------
//-------------------箱子移动函数-------------
int BoxMove(int F)
{
switch(F)
{
case 119:{
switch(MapId[P.x][P.y-2])
{
case 0:
{
Box(P.x,P.y-2);
MapId[P.x][P.y-2]=3;
MapId[P.x][P.y-1]=0;
if(MapId[P.x][P.y+1]==4)BoxEnd(P.x,P.y+1);
return 1;}
case 1:
{
return 0;
break;}
case 3:
{
return 0;
break;}
case 4://--------------按键w碰见目的地-----------
{
Box(P.x,P.y-2);
MapId[P.x][P.y-2]=3;
if(MapId[P.x][P.y-1]==4)MapId[P.x][P.y-1]=4;
else MapId[P.x][P.y-1]=0;
return 1;}
}
break;}
case 115:{
switch(MapId[P.x][P.y+2])
{
case 0:
{
Box(P.x,P.y+2);
MapId[P.x][P.y+2]=3;
MapId[P.x][P.y+1]=0;
if(MapId[P.x][P.y-1]==4)BoxEnd(P.x,P.y-1);
return 1;}
case 1:
{
return 0;}
case 3:
{
return 0;}
case 4://-------------按键s碰到目的地--------
{
Box(P.x,P.y+2);
MapId[P.x][P.y+2]=3;
if(MapId[P.x][P.y+1]==4)MapId[P.x][P.y+1]=4;
else MapId[P.x][P.y+1]=0;
return 1;}
}

break;}
case 97:{
switch(MapId[P.x-4][P.y])
{
case 0:
{
Box(P.x-4,P.y);
MapId[P.x-4][P.y]=3;
MapId[P.x-2][P.y]=0;
if(MapId[P.x-2][P.y]==4)BoxEnd(P.x-2,P.y);
return 1;}
case 1:
{
return 0;}
case 3:
{
return 0;
break;}
case 4://------------按键a碰到目的地-------
{
Box(P.x-4,P.y);
MapId[P.x-4][P.y]=3;
if(MapId[P.x-2][P.y]==4)MapId[P.x-2][P.y]=4;
else MapId[P.x-2][P.y]=0;
return 1;}

}
break;}

case 100:{
switch(MapId[P.x+4][P.y])
{
case 0:
{
Box(P.x+4,P.y);
MapId[P.x+4][P.y]=3;
MapId[P.x+2][P.y]=0;
if(MapId[P.x+2][P.y]==4)BoxEnd(P.x+2,P.y);
return 1;}
case 1:
{
return 0;}
case 3:
{

return 0;}
case 4://--------按键d箱子碰到目的地
{

Box(P.x+4,P.y);
MapId[P.x+4][P.y]=3;
if(MapId[P.x+2][P.y]==4)MapId[P.x+2][P.y]=4;
else MapId[P.x+2][P.y]=0;
return 1;}

}
return 0;}
}

}
//---------------------------------------
//---------------------------------------------------------------------键盘控制与结束-------------------
void ShowGKCL(int x,int y)
{

gotoxy(x,y);printf("\033[43;36m \033[0m");
gotoxy(x+6,y);printf("\033[43;36m \033[0m");

}
void ShowGKC()
{
gotoxy(G1.x,G1.y);printf("\033[41;36m>\033[0m");
gotoxy(G1.x+6,G1.y);printf("\033[41;36m<\033[0m");
}
void ShowGKId(int i){   //显示某个关卡
if(G.y==12)G.y=8;
if(i==9){gotoxy(G.x,G.y++);printf("\033[44;36m  %d \033[0m",i+1);return;}
if(i<9)
{gotoxy(G.x,G.y++);printf("\033[44;36m  %d  \033[0m",i+1);}
else {gotoxy(G.x,G.y++);printf("\033[44;36m  %d \033[0m",i+1);}
}
void ShowGK()   //--------------------------关卡选择界面------------
{
int ch=0;
int i;
int s=0;
int s1=4;
G1.x=14;
G1.y=8;
NGK=1;
GK=EditLen();
//GK=14;
if(GK==0){ShowMesMap();
G.x=15;
G.y=8;

gotoxy(G.x,G.y);printf("NO Map!");
ch=getch();
Menu();
}
ShowMesMap();
while(ch!=27){
ShowGKC();
for(i=s;i<s1;i++)
{
ShowGKId(i);
}
ch=getch();
switch(ch)
{
case 13:{
if(NGK<GK)Start();
break;}
case 119:{
ShowGKCL(G1.x,G1.y);
G1.y--;
if(G1.y==7){G1.y=8;
if(s1>4){s--;s1--;}
}
ShowGKC();
NGK=G1.y+s-7;
gotoxy(w/2-5,17);
if(NGK<GK)
printf(" %d ",NGK);
else printf(" NO ");
break;}
case 115:{
ShowGKCL(G1.x,G1.y);
G1.y++;
if(G1.y==12){G1.y=11;
if(s1<GK){s++;s1++;}
}
ShowGKC();
NGK=G1.y+s-7;
gotoxy(w/2-5,17);
if(NGK<GK)
printf(" %d ",NGK);
else printf(" NO ");
break;}

}
}
Menu();
}
void Start()
{
MapIdC();
Map();             //初始化游戏地图
//PMmap(9,9,TMap);
//PMmap(8,9,Pmap1);  //初始化关卡地图

EditFileRed(NGK);
/*gotoxy(1,1);
int i;int j;
for(i=0;i<18;i++){
for(j=0;j<18;j++){
printf("%d ",m1.EditMapId[i][j]);
}
printf("\n");
}*/
PMmap(18,18,m1.EditMapId);
gotoxy(31,h+1);printf("Boxs:%d",Cunt());
int ch=0;
while(ch!=27){

ch=getch();
if(!Life())break;
//printf("%d",ch);
PeMove(ch);
if(IfEnd(P.x,P.y))MapId[P.x][P.y]=4;
if(!Life())break;
gotoxy(31,h+1);printf("Boxs:%d",Cunt());

}
Over();
}
int Cunt(){
int i;
int j;
int n=0;
for(i=0;i<=w;i++)
{
for(j=0;j<h;j++)
{
if(MapId[i][j]==4)n++;
}
}
if(n==0)return 0;
else return n;
}
int Life(){
int i;
int j;
for(i=1;i<=w;i++)
{
for(j=1;j<h;j++)
{
if(MapId[i][j]==4)return 1;
}
}
return 0;
}
int IfEnd(int x,int y){
int i;
for(i=0;i<M;i++)
{
if(B[i].x==P.x&&B[i].y==P.y)return 1;
}
return 0;
}
void Over(){

gotoxy(42,22);
GK++;
Menu();
}
//地图函数------------------------------//
void Map(){
clear();
int x=1;
int y=1;
int i;
int j;
for(i=1;i<=w;i++)
{
for(j=1;j<=h;j++)
{
if(i==1||j==1||i==w||j==h){gotoxy(i,j);printf("\033[40;36m  \033[0m");}
else{ gotoxy(i+1,j);printf("\033[43;36m  \033[0m");
}
}
}
People(2,h+1);printf("People");
Box(11,h+1);printf("Box");
BoxEnd(17,h+1);printf("End");
Brick(23,h+1);printf("Brack");
gotoxy(31,h+1);printf("");

}
//--------------------------------------------//
 //-----------------------初始化文件关卡地图
void InitMap(int a[40][20]){}   

//初始化关卡地图----------------------------//
int PMmap(int x,int y,int id[x][y])
{
int i;
int j;
int k=3,m=2;
for(i=0;i<x;i++,m++){
for(j=0,k=3;j<y;j++,k+=2)
{

if(id[i][j]==0) {ClearPB(k,m); MapId[k][m]=0;}//路 
if(id[i][j]==1){Brick(k,m);MapId[k][m]=1;}  //砖头,墙
if(id[i][j]==2){People(k,m);P.x=k;P.y=m;} //地球人
if(id[i][j]==3){ Box(k,m); MapId[k][m]=3;}//箱子
if(id[i][j]==4){ BoxEnd(k,m);MapId[k][m]=4;
B[M].x=k;
B[M++].y=m;
}  //地点

}
}
gotoxy(42,21);
return 0;
}
void print()
{
int i;
int j;
for(i=1;i<=h;i++)
{
for(j=1;j<=w;j+=2)
{
if(MapId[j][i]==0){ClearPB(j,i); }//路 
if(MapId[j][i]==1){Brick(j,i);}  //砖头,墙
if(MapId[j][i]==2){People(j,i);} //地球人
if(MapId[j][i]==3){ Box(j,i);}//箱子
if(MapId[j][i]==4){ BoxEnd(j,i);}  //地点
}
}

}
//主函数
main()
{
Hit();             //隐藏光标
Menu();

}

地图编辑


地图选择菜单


载入地图游戏界面


代码下载http://download.csdn.net/detail/hes_c/9851917


  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值