贪吃蛇(C语言Windows控制台)

 

读万卷书,行万里路——木子成

/***********************************************
map数组:二维矩阵值-1为游戏墙
map数组:二维矩阵值1为蛇头
map数组:二维矩阵值2为蛇身
map数组:二维矩阵值3为食物
程序同一运行多次游戏时会暂停3秒
吃到一个食物,蛇移动速度加快,最快速度有阈值
方向键英文小写输入有效
屏幕最大化体验最佳
上:w、下:s、左:a、右:d
暂停:q、退出游戏
*************************************************/

main.c

#include<windows.h>

void pr_map();		//打印墙
void pr_startG();	//打印游戏开始界面
void deal_key();	//处理按键响应
void init_map();	//初始化游戏数据
void wait_start();

char Pause = 0;		//游戏暂停开关
char GameStart = 0;	//撞墙标识



void main()
{
	init_game();	//初始化游戏数据
	while (1)
			if (!GameStart)		//游戏未开始界面
			{
				pr_start();		//打印游戏开始界面
				wait_start();
			}
			else				//游戏开始界面
			{
				deal_key();		//响应按键
				if (!Pause)
				{
					pr_game();	//打印游戏界面
					update_snake();//更新地图
				}
			}
}

init.c

#include<time.h>
#include<stdlib.h>

#define up 'w'
#define down 's'
#define left 'a'
#define right 'd'
#define M 24
#define snake_size 3

int map[M][M];

extern char dir_key;
extern char down_key;
extern int speed;
extern int score;

void update_food();

typedef struct Snakes
{
	int x;
	int y;
	struct Snakes* next;
}snake;
snake* head;



//初始化地图
void init_game()
{
	snake* p = (snake*)malloc(sizeof(snake));
	head = (snake*)malloc(sizeof(snake));
	p = head;
	srand((int)time(NULL));			//女娲在此播下随机种子

	//蛇头位置
	int i, j;
	int x = rand() % (M / 2) + 3;
	int y = rand() % (M / 2) + 3;

	//循环进行游戏初始化
	for (i = 0; i < M; i++)
		for (j = 0; j < M; j++)
			map[i][j] = 0;
	speed = 200;
	score = 0;

	//食物总在蛇头右下方
	update_food();

	//随机贪食蛇位置、方向  
	if (x < y)							//蛇身横向
	{
		for (i = 0; i < snake_size; i++)
			if (i == 0)
			{
				map[x][y] = 1;
				head->x = x;
				head->y = y;
			}
			else
			{
				map[x - i][y] = 2;

				snake* q = (snake*)malloc(sizeof(snake));
				p->next = q;

				q->x = x - i;
				q->y = y;

				p = q;
				p->next = NULL;
			}
		dir_key = right;	//初始化蛇移动方向
	}
	else								//蛇身纵向
	{
		for (i = 0; i < snake_size; i++)
			if (i == 0)
			{
				map[x][y] = 1;
				head->x = x;
				head->y = y;
			}
			else
			{
				map[x][y - i] = 2;

				snake* q = (snake*)malloc(sizeof(snake));
				p->next = q;

				q->x = x;
				q->y = y - i;

				p = q;
				p->next = NULL;
			}
		dir_key = down;
	}

	//标记游戏墙,数组外围一圈
	for (i = 0; i < M; i++)
		for (j = 0; j < M; j++)
			if (i == 0 || i == M - 1 || j == 0 || j == M - 1)
				map[i][j] = -1;
}

function.c

#include<stdlib.h>
#include<conio.h>
#include<windows.h>


#define up 'w'
#define down 's'
#define left 'a'
#define right 'd'
#define stop 'q'
#define out 'p'
#define M 24		//游戏地图尺寸

void pr_map();
void init_game();


typedef struct Snakes
{
	int x;
	int y;
	struct Snakes* next;
}snake;

extern int map[M][M];
extern snake* head;
extern char GameStart;
extern char Pause;


char key[4] = { up, down, left, right };	//方便处理蛇移动是否反向,反向不响应,并且游戏正常
char dir_key;
char down_key;
int score = 0;		//游戏得分
int speed = 200;	//蛇移动速度


//移动光标
void gotoxy(int x, int y)
{
	COORD pos;
	HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
	pos.X = x;
	pos.Y = y;
	SetConsoleCursorPosition(hOutput, pos);
	// 隐藏光标 
	CONSOLE_CURSOR_INFO cursor;
	cursor.bVisible = FALSE;
	cursor.dwSize = sizeof(cursor);
	SetConsoleCursorInfo(hOutput, &cursor);
}


//添加食物
void update_food()
{
	int x, y;

	while (1)
	{
		x = 1 + rand() % (M - 2);
		y = 1 + rand() % (M - 2);
		if (map[x][y] == 0)
		{
			map[x][y] = 3;
			break;
		}
	}
}


//头部前进
void go_key()
{
	snake* new_head = (snake*)malloc(sizeof(snake));	//分配存储空间
	map[head->x][head->y] = 2;				//头部变身体

	switch (dir_key)
	{
	case up:
		new_head->x = head->x;
		new_head->y = head->y - 1;	break;
	case down:
		new_head->x = head->x;
		new_head->y = head->y + 1;	break;
	case left:
		new_head->x = head->x - 1;
		new_head->y = head->y;		break;
	case right:
		new_head->x = head->x + 1;
		new_head->y = head->y;		break;
	}

	if (map[new_head->x][new_head->y] == 3)		//吃掉食物
	{
		update_food();
		score += 10;
		speed = (speed < 100) ? speed + 0 : speed - 50;		//加快速度
	}

	new_head->next = head;
	head = new_head;

	map[head->x][head->y] = 1;		//标记头部

	Sleep(speed);					
}


//消除尾巴
void cat_tail()
{
	snake* tail = (snake*)malloc(sizeof(snake));
	tail = head;

	while (tail->next->next != NULL)		//下一节的下一节身体存在
		tail = tail->next;

	map[tail->next->x][tail->next->y] = 0;	//消除尾巴(头部加一方式前进)

	free(tail->next);						//释放内存
	tail->next = NULL;						//尾部结构指向空,方便寻找
}


//更新蛇的位置
void update_snake()
{
	switch (dir_key)
	{
	case up:
		if (map[head->x][head->y - 1] == 0 || map[head->x][head->y - 1] == 3)
		{
			if (map[head->x][head->y - 1] == 0)		//1----如果没有吃到食物将消除尾巴
				cat_tail();								//1、2顺序勿换,head更新,cat_tail()易失效
			go_key();								//2----头部前进
		}
		else if (map[head->x][head->y - 1] == -1 || map[head->x][head->y - 1] == 2)
		{
			GameStart = 0;
			break;
		}
		break;

	case down:
		if (map[head->x][head->y + 1] == 0 || map[head->x][head->y + 1] == 3)
		{
			if (map[head->x][head->y + 1] == 0)
				cat_tail();
			go_key();
		}
		else if (map[head->x][head->y + 1] == -1 || map[head->x][head->y + 1] == 2)
		{
			GameStart = 0;
			break;
		}
		break;

	case left:
		if (map[head->x - 1][head->y] == 0 || map[head->x - 1][head->y] == 3)
		{
			if (map[head->x - 1][head->y] == 0)
				cat_tail();
			go_key();
		}
		else if (map[head->x - 1][head->y] == -1 || map[head->x - 1][head->y] == 2)
		{
			GameStart = 0;
			break;
		}
		break;

	case right:
		if (map[head->x + 1][head->y] == 0 || map[head->x + 1][head->y] == 3)
		{
			if (map[head->x + 1][head->y] == 0)
				cat_tail();
			go_key();
		}
		else if (map[head->x + 1][head->y] == -1 || map[head->x + 1][head->y] == 2)
		{
			GameStart = 0;
			break;
		}
		break;
	}
}


//处理按键
void deal_key()
{
	if (_kbhit())
	{
		switch (down_key = _getch())		
		{
		case up:
			if (dir_key == key[1])		//反向移动指令不生效
				break;
			dir_key = down_key;			//无论此指令是否意味着撞墙,交由update_snake()函数处理
			break;

		case down:
			if (dir_key == key[0])
				break;
			dir_key = down_key;
			break;

		case left:
			if (dir_key == key[3])
				break;
			dir_key = down_key;
			break;

		case right:
			if (dir_key == key[2])
				break;
			dir_key = down_key;
			break;

		case out:
			exit(0);
		}	
		if (down_key == stop)
		{
			if (Pause == 0)
				Pause = 1;
			else
				Pause = 0;
		}
	}
}


//等待用户按任意键开始游戏
void wait_start()
{
	while (1)		//等待用户按任意键开始游戏
		if (_kbhit())
		{
			GameStart = 1;	//游戏开始开关打开
			break;
		}
	pr_map();		//打印地图
	init_game();	//同一运行程序,游戏多次进行时初始化游戏数据
}

print.c

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<windows.h>

#define M 24

extern map[M][M];
extern GameStart;
extern score;

void gotoxy(int x, int y);

//打印得分
void pr_score()
{
	if(score / 100000000 >= 1)		//多判断结构意在保证得分显示居中显示框
	{
		gotoxy(45 + 21, 4);
		printf("%d", score);
	}
	else if (score/1000000>=1)
	{
		gotoxy(45 + 22, 4);
		printf("%d", score);
	}
	else if (score / 10000 >= 1)
	{
		gotoxy(45 + 23, 4);
		printf("%d", score);
	}
	else if (score / 100 >= 1)
	{
		gotoxy(45 + 23, 4);
		printf("%d", score);
	}
	else
	{
		gotoxy(45 + 24, 4);
		printf("\033[40;36m%d\033[0m", score);
	}
	system("color 0E");		//这里其实是一个bug,但是无意间发现此法可让蛇身、食物、得分显示闪烁
}

//打印地图
void pr_map()
{
	system("cls");		//清除此时屏幕上显示的游戏提示
	system("color 0E");	//设置屏幕颜色
	for (int i = 0; i < M; i++)
		for (int j = 0; j < M; j++)
		{
			if (map[i][j] == -1)
			{
				gotoxy(i * 2 + 45, j + 5);
				printf("■");
			}
		}
	gotoxy(45 + 16, 4);
	printf("■"); 

	gotoxy(45 + 32, 4);
	printf("■");

	gotoxy(45 + 16, 3);
	printf("■■■■■■■■■");
}



//打印游戏界面
void pr_game()
{
	for (int i = 0; i < M; i++)
		for (int j = 0; j < M; j++)
		{
			if (map[i][j] == 0)
			{
				gotoxy(i * 2 + 45, j + 5);
				printf("  ");
			}
			else if (map[i][j] == 1)
			{
				gotoxy(i * 2 + 45, j + 5);
				printf("\033[40;33m●\033[0m");
			}
			else if (map[i][j] == 2)
			{
				gotoxy(i * 2 + 45, j + 5);
				printf("○");
			}
			else if (map[i][j] == 3)
			{
				gotoxy(i * 2 + 45, j + 5);
				printf("\033[40;31m⊙\033[0m");
			}
		}
	pr_score();
}


//打印游戏未开始界面
void pr_start()
{
	pr_map();
	if(score!=0)
		pr_score();

	gotoxy(61, 11);
	printf("▁▁▁▁▁▁▁▁");
	gotoxy(61, 12);
	printf("▏请切换最大屏  ▏");
	gotoxy(61, 13);
	printf("▔▔▔▔▔▔▔▔");


	gotoxy(57, 14);
	printf("▁▁▁▁▁▁▁▁▁▁▁▁");
	gotoxy(57, 15);
	printf("▏请切换英文小写输入法  ▏");
	gotoxy(57, 16);
	printf("▔▔▔▔▔▔▔▔▔▔▔▔");


	gotoxy(53, 17);
	printf("▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁");
	gotoxy(53, 18);
	printf("▏上: w ▏下: s ▏左: a ▏右: d ▏");
	gotoxy(53, 19);
	printf("▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔");

	gotoxy(53, 20);
	printf("▏暂停:q▏              ▏退出:p▏");
	gotoxy(53, 21);
	printf("▔▔▔▔                ▔▔▔▔");


	gotoxy(58, 25);
	printf("▁▁▁▁▁▁▁▁▁▁▁");
	gotoxy(58, 26);
	printf("▏请按任意键开始游戏  ▏");
	gotoxy(58, 27);
	printf("▔▔▔▔▔▔▔▔▔▔▔");


	Sleep(3000);		//防止蛇撞墙后,用户按任意键立马继续游戏
}



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 实习公司简介 北京东方迪格软件有限公司是一家专业的高校实验室解决方案商,公司致力于我国高等院校实验室管理系统和实训方案的构建与实施,专注于高等院校实验室管理信息系统( MIS )方面的设计、开发、销售和技术服务等业务。 2. 今天是我来到北京东方迪格软件有限公司实习的第一天。我提前了半个小时来到了办公室,我发现同事们也已经陆续的到达了。我首先找到了行政部的田小姐办理了入职的必要手续,她很热情地给我介绍了公司的整体概况,同时交给了我一些公司产品的简介和操作手册。这是我进入公司实习的第一步,了解公司的企业文化,以及公司的主要业务和产品。 上班第一天,没什么工作,老板和其他的工作人员都很忙,我也就知趣的找个地方呆着,开始翻阅着手头已经拿到的资料。刚来公司,自己就要机灵些,要谦虚好学,多去了解,要去观察去倾听,看忙着的人是怎样做事的,他们是如何与人打交道的。 3. 我被分配到了技术部,技术部主要负公司软件产品的安装以及售后维护,需要对公司产品的原理和概念有深入彻底的了解同时还需要有和客户交流沟通的技巧和能力。技术部的软件安装维护工作虽然是企业部门运营的一个小侧面,但关系到企业在广大客户心目中的形象,关系到企业参与全国范围的计算机软件销售竞争的魄力及品牌亲和力。 虽然我之前对计算机软件这方面的知识有所了解,但公司的这些软件以前都没有接触过,所以还是需要学习大量的知识。公司的软件产品主要是金融、保险、银行类的实验室教学软件,要想了解这些软件产品除了要有基本的计算机知识外还需要有金融、保险、银行方面的专业知识。接下来的时间要学习的东西还有很多。 4. 今天技术部有经验的同事给我仔细讲解了公司软件产品安装和维护中的每一款注意事项,还现场演示了公司的一款叫“商业银行综合柜面业务实训教学软件”的软件产品的安装流程以及操作系统、软件系统的配置。 下午我公司行政部田小姐为我分配了一台笔记本电脑,作为我的工作之用。我开始练习公司软件产品的安装和操作演示。 5. 公司的软件产品所使用的数据库各不相同,有MS SQL Server、MYSQL、ORACLE、Db2、Sybast、informix等等,我在学校里面接触的数据库软件仅仅只有MS SQL Server这一种。现在终于体会到人们在说“书到用时方恨少”这句话时的无奈心情了。从上午开始,我尝试着上网去查找相关数据库的一些资料,下载了一些教程来自习,希望能对这些数据库软件能有一个初步的了解。 6. 今天一个客户给我们打来电话说他们使用的软件不能连接上服务器了,这款软件昨天还是可以正常使用的。我们的第一反应是不是客户端软件的缺陷导致软件故障。询问了有关软件出现故障时的错误提示信息后初步判断是由于客户误操作修改了服务器的IP地址,于是引导客户修改服务器的IP,之后故障消失。 认真细致,不放过任何一个细节。这是我今天的感悟。 7. 北京东方迪格软件公司于2006年4月底顺利通过ISO9001(2000版)国际质量体系认证,公司的管理已经比较规范了。每周一上班之后部门经理会召集本部门的人员召开一次总结早会,由每个成员轮流总结发言自己过去一周说做的工作以及完成情况和还存在的问题。每天下班时间到来时需要登录公司的在线办公平台填写自己一天所做的工作以及完成情况和需要解决的问题,每周五下班之前也要填写这一周的工作总结和下周的工作计划,部门经理和总经理会查看每一个人的记录并作出点评。这些措施有利于每一名员工做好自己的工作计划和总结,部门经理和总经理也能借助这个平台掌握员工的工作状态及存在的主要问题,利于他们作出合理的决策。 8. 与人和睦相处,良好的进行沟通,是一名实习生必须要学会的。在与人相处方面,我一直坚信,诚实加真心,自尊与尊重他人,肯定不会被拒于千里之外的。首先和同事相处,我只是一个实习生,很多事情要多看多学,我所有的同事都是我的老师,前辈,工作过程中,怎么发挥团队的作用,协调内部关系,我学会的是尊重和礼貌。做为一名技术支持部门得员工,直接面对的是客户,你的工作的质量甚至一句话都可以影响客户对公司以及公司的软件产品的信心。如何在配合销售部门给客户演示产品时用恰当的语言把公司的软件产品的优良特性展现给客户,让客户听能真正了解自己的需求,同时信赖我们的软件产品,进而选择和你合作,是作为一名技术部门的员工所必须要学习的课程。当然,光有这些还是不够的,我们还得有过硬的专业知识,在客户遇到技术问题时我们能第一时间高效准确的处理故障,这样才能真正建立客户对我们产品的认可度。 9. 今天中午下班时间到了,由于中午的休息时间不多所以大家都是叫快餐在公司吃饭。我来到这里也有一段时间了,对这里也有一点熟悉了,于是我也就自告奋勇的说要帮大家定一次快餐。很快,我顺利的为大家定好了快餐。吃饭时闲聊,大家除了对我说了些客气的话外,有两个看似资历很老的同事还说我很好学,还知道我上午都看了些什么,姜还是老的辣,就这样悄无声息的去观察你。所以,有的时候你不要怀疑自己做的无法得到认可,其实有人已经看在眼里了。下午也就是自己看公司的软件资料了,一天很快就过去了。 10. 今天周五,我们下班之后同事们决定把办公室收拾收拾,我一看,这我也不能干站着看啊,就帮着一起忙活起来了,说实话因为北方的干燥加沙尘天气,办公室里面总是很快就会堆积灰尘,确实应该好好清理一下了,我们几个人差不多忙活了一个多小时,把地面,窗户什么的都擦哦干干净净的,可累坏我了。不过看着干净的办公室,那心情好的确实没法说。这毕竟是每天上班的地方,呆的时间长,环境好,心情也好,工作效率也就高。 11. 今天周一,我们经理说下午要开会,需要制作一个PPT,他上午没有空,问我们几个谁能给他做一下PPT。我对做PPT还是蛮熟悉的,就自告奋勇的承担 了这一任务。我向他要来了下午开会的大体内容并询问了一下他的大体意见,样式之类的,之后就开始忙活了。其实,单做一个基本的PowerPoint文件不用多少时间,但要做出一个图文并茂、生动的ppt就不容易了。我借助网络的力量,收集在线模板,查找图片素材差不多用了一个上午的时间终于完成了这个PPT。下午开会使用这个PPT一切顺利。 12. 今天下午刚上班不久,公司一同事要打一份客户资料,可能是他还有其他重要的事情要忙,就把这个资料交到我手里说能不能帮他打这份资料。我是新来的员工,比较不忙,哪能说不行啊,就接过来了。接过来我一看,好家伙,密密麻麻少说也有三四千字啊,没办法,赶紧开始打吧。好在我在学校也经常打字练习,盲打每分钟也能打六七十个汉字,经过一个多小时的工作,终于完成任务了! 这件事情让我觉得平时点滴的积累真的是很重要,如果我以前从不练习打字的话,今天这任务估计就不能这么顺利完成了。 13 今天下午3点左右公司接到一个客户的点话说,他使用我们的软件准备第二天的上机实践课的时候电脑忽然黑屏了,而且接下来就开不了机了。我们一听,觉得如果不是他的电脑出现故障的话就是我们的软件跟其他软件起冲突破坏了操作系统。我们觉得事态严重,如果不及时处理就会严重影响我们公司软件产品的声誉。于是我跟着技术部的另一个同事马上赶到了客户那里。我们查看了那个电脑,试着按下电源开关,电源灯只是闪了一下就没有反应了。我首先的感觉就是,这应该是电脑的硬件故障,不是我们的软件故障,但基于对客户负责的态度,我们帮客户检查了一下机箱,发现CPU风扇已经不转了,应该是风扇先坏掉导致CPU过热而烧毁。我们建议客户更换CPU并加装更大功率的CPU风扇,注意防尘。之后故障排除,客户电脑恢复正常,又可以继续使用我们的软件了。 14. 今天公司给我和另一位新来的技术部的同事进行了第一次培训。培训的内容主要有:1.产品的演示与操作。2.产品演示与销售之间的流程和关联(注重配合)3.技术流程(演示、培训)4.技术职责,前景。5.学校项目申报和审批流程。6.方案的撰写和实施。我们还讨论了个人的职业发展规划。 15. 今天我准备学习下方案的撰写,一个成功的方案设计除了内容充实、要有很强的可行性之外,规范的格式也是必不可少的。而要排版出美观规范的板式就需要有扎实的OFFICE功底了。针对方案的设计要求,我重点关注了目录的生成、项目符号、编号以及表格设计等。 这些OFFICE方面的知识其实以前在学校也或多或少的接触过,只是因为长时间不使用而变地生疏了。经过查看OFFICE方面的书籍以及上网查找,不但复习了旧的知识还学到了不少新知识。看来“温故而知新”这句话真的是很有道理的啊。 16. 今天上班的时候忽然发现,办公室里面的每一台电脑的网速都很平均,不像在学校宿舍里面自己组建的网络有的快有的慢。询问了同事之后终于知道了缘由。原来这里的网线布置的比较合理,这里一律是交换机上插几个下一级的交换机,再把所有的机器都接在下一级的计算机上。这样,大家的速度都比较平均,而且单位里没有人利用电驴之类的BT软件不停的下载。而我们学校宿舍里的网络因为交换机不足的原因基本都是有人接在上一级交换机上,有的接在下一级的交换机上,还经常有人一直开着BT软件下载电影之类的。这样宿舍的网络就速度不品均而且慢了。 合理的布局能带来工作效率的提高。 17. 今天在和一个同事交流的时候得到了一个好东西,我发现这位同事有一本工作日记,我跟他借来看了一下,里面记载的都是他在工作中遇到的各种各样的问题,有遇到问题的时间、地点、故障的触发条件、故障现象的详细描述、合理的解决方法以及心得体会等等。这些都是宝贵的工作经验财富,我抱着看了一天,真是长见识啊。我马上也决定开始做一本这样的详细的工作日志,这对自己以后的工作学习一定大有裨益。 18. 今天,单位财务部的一个同事悄悄的把我叫到她那里,原来,他在上网的时候不小心点击了一个流氓网站,之后IE的主页被修改成那个流氓网站并且被锁定了,很讨厌。而她不像我们是学计算机的,自己不会处理,又不好意思让其他同事来帮忙,毕竟在工作时间上网也不是什么光彩的事情,只好求我这个“外人”帮忙了。 我过去之后看了下,这种问题一般就是几个地方:第一,直接修改IE的Internet选项里面的主页。第二,修改注册表,把流氓网址写入注册表,让IE的Internet选项里面的主页变灰,同时锁定注册表。第三,在快速启动栏的IE快捷方式属性的目标里面加入流氓网址。第四,这中一般比较少见,就是直接在受害者电脑里面植入木马,实时监视IE的主页,一旦发现有改动就立即重新恢复为流氓网址。 清楚了以上这这些问题就好解决了,我使用工具将IE的主页强制恢复为空白页并修复注册表的异常键值,然后进入安全模式使用最新的杀毒软件彻底查杀一遍,之后问题解除。 19. 今天是我在单位实习的最后一天了,今天的工作主要就是办理好交接手续,同时做好实习材料的整理并找单位相关部门盖好公章。 在这个大家庭里面呆了这么长一段时间,就要离开了,真有点舍不得。同事们都为我送来了临别的祝福。很感激在实习的这段时间大家给我的关照,谢谢东方迪格的同事们。 20. 实习生活终于结束了,通过这段时间的实习,不但让我学到了很多新的专业知识,还学到了很多在学校里面学习不到了知识,让我学会了怎么样更好的处理跟同事们的人际关系以及如何更好的跟客户交流沟通,这些对于马上就要离开校园走上工作岗位的我来说至关重要啊。 马上就要启程回到熟悉的校园了,想到很快就能跟分别很久的同学们见面真的很高兴。母校,我回来啦!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值