扫雷小游戏(c语言)

本文详细介绍了扫雷游戏的规则、玩法、设计思路及关键算法实现。通过递归算法实现点击格子的连锁反应,同时展示了简单模式和困难模式的游戏流程。此外,还涵盖了游戏的启动界面、游戏规则查看以及退出功能。代码使用C++编写,涉及图形界面、鼠标事件处理和随机数生成。
摘要由CSDN通过智能技术生成

扫雷

一、游戏简介

游戏简介:

《扫雷》是一款益智类解谜游戏,游戏目标是点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输。同时能锻炼人们思维能力,以及对鼠标左右键使用的益智类小游戏。

游戏规则:

游戏规则为:在1010或是2015的方阵中随机埋入数量不等的“地雷”,并将全部格子都做隐藏处理。
使用鼠标左键对格子进行“点击”,使用鼠标右键对格子进行“标记”。
当点击到“地雷”时,游戏失败。
当点击到的格子周围8格存在地雷时,将会在这个格子上显示8格之内存在的地雷数量。
当点击到的格子周围8格没有地雷时,将会向周围延伸解除相同格子的隐藏效果,直至出现“数字格”为止。
当场上除“地雷”以外的格子全部被点击完毕时,游戏胜利。

二、游戏玩法:

通过鼠标左键点击格子,将数字找出;鼠标右键插入旗子,将雷排除,将所有数字找出即可取得胜利。
在这里插入图片描述

三、游戏流程设计

游戏系统流程图
在这里插入图片描述

四、游戏设计实现

重要的函数设计与算法:
1.void loadingPlay(int x, int y);
 void loadingPlay2(int x, int y);
点击到空白处时,向周围延伸解除相同格子的隐藏效果,直至出现“数字格”为止。
运用递归算法将周围的空白格子逐个检查实现。
2.int MouseClick();
3.int MouseClick2();
通过鼠标左键点击,实现点击单个砖块出现雷或数字或者多个空白块加数字;通过鼠标右键实现插旗排雷,每插一个旗子,雷数-1.
4.srand((unsigned)time(NULL));
随机种子的生成,通过调用程序运行时系统的时间实现种子的随机,后面用rand函数来生成随机数,以确保随机性。

五、游戏效果

游戏所用的全局变量以及函数:
#define N 10 //格子数
#define M 50 //图片大小
int map[2N + 2][2N + 2]; //存放雷 -1 表示雷
int gamemodel; //游戏模式选择
int win ; //游戏胜利
void StartWindow(); //开始界面
void EasyModel(); //简单模式 1010
void Difficultmodel(); //困难模式 20
15
void GameRules(); //游戏规则
void DrawGraph(); //简单模式的图形
void DrawGraph2(); //简单模式的图形
int MouseClick(); //简单模式鼠标点击事件
int MouseClick2(); //困难模式鼠标点击事件
void loadingPlay(int x, int y);//简单模式运用递归实现点击一大片
void loadingPlay2(int x, int y);//困难模式运用递归实现点击一大片
srand((unsigned)time(NULL));//随机数生成
5.1显示扫雷游戏的初始页面:
在这里插入图片描述5.2简单模式点击方块(插旗排雷、点击方块若是空白实现点击一大片区域、点击方块生成数字或者雷)
点击方块如果是空白,会实现点击大片:
在这里插入图片描述
插旗排雷:
在这里插入图片描述
游戏成功:
在这里插入图片描述
5.3困难模式点击方块
点击方块如果是空白,会实现点击大片:
在这里插入图片描述
与简单模式相同的排雷以及踩雷的情况:
在这里插入图片描述
在这里插入图片描述
5.4 查看游戏规则
查看游戏规则:
在这里插入图片描述

5.5 退出
退出:
在这里插入图片描述
在这里插入图片描述
界面的四个按钮只有在鼠标移到指定坐标范围的时候,才会出现。

六、代码实现

#include<iostream>
#include<time.h>
#include<stdio.h>
#include<graphics.h>			
#include<mmsystem.h>
#include<string>
#pragma comment(lib,"winmm.lib")		//音频设备接口
#define N 10  //格子数
#define M 50 //图片大小
using namespace std;
IMAGE image[14];		//存放图片
int map[2 * N + 2][2 * N + 2];			//存放雷  -1 表示雷
int gamemodel;				//游戏模式选择
int win;				//游戏胜利
void StartWindow();		//开始界面
void EasyModel();     //简单模式
void Difficultmodel();		//困难模式
void GameRules();		//游戏规则
void DrawGraph();		//画图形
void DrawGraph2();
int MouseClick();	    //鼠标点击事件
int MouseClick2();
void loadingPlay(int x, int y);
void loadingPlay2(int x, int y);//运用递归实现点击一大片
void  main() {
	initgraph(N * M, N * M);//500*500
	StartWindow();
	if (gamemodel == 0) {
		EasyModel();
	}
	else if (gamemodel == 1) {
		closegraph();
		initgraph(N * M * 2, N * 75);//1000*800
		Difficultmodel();
	}
	else if (gamemodel == 2) {
		closegraph();
		initgraph(N * M * 2, N * 75);//1000*800
		GameRules();
	}
	closegraph();
}
void StartWindow() {
	loadimage(&image[0], ".\\扫雷\\blank.jpg", M, M);
	loadimage(&image[1], ".\\扫雷\\1.jpg", M, M);
	loadimage(&image[2], ".\\扫雷\\2.jpg", M, M);
	loadimage(&image[3], ".\\扫雷\\3.jpg", M, M);
	loadimage(&image[4], ".\\扫雷\\4.jpg", M, M);
	loadimage(&image[5], ".\\扫雷\\5.jpg", M, M);
	loadimage(&image[6], ".\\扫雷\\6.jpg", M, M);
	loadimage(&image[7], ".\\扫雷\\7.jpg", M, M);
	loadimage(&image[8], ".\\扫雷\\8.jpg", M, M);
	loadimage(&image[9], ".\\扫雷\\lei.jpg", M, M);
	loadimage(&image[10], ".\\扫雷\\flag.jpg", M, M);
	loadimage(&image[11], ".\\扫雷\\start1.jpg", N * M, N * M);
	loadimage(&image[12], ".\\扫雷\\0.jpg", M, M);
	loadimage(&image[13], ".\\扫雷\\rule.jpg", N * M * 2, N * 80);
	putimage(0, 0, &image[11]);
	ExMessage m;
	settextstyle(40, 18, "楷体");
	while (true) {
		m = getmessage(EM_MOUSE || EM_KEY);
		if (m.x > 225 && m.x < 275 && m.y >20 && m.y < 60) {
			settextcolor(RGB(255, 0, 0));		//设置字体颜色
			outtextxy(225, 20, "简单");
		}
		else if (m.x > 225 && m.x < 275 && m.y >90 && m.y < 130) {
			settextcolor(RGB(255, 0, 0));		//设置字体颜色
			outtextxy(225, 90, "困难");
		}
		else if (m.x > 225 && m.x < 275 && m.y >300 && m.y < 340) {
			settextcolor(RGB(255, 0, 0));		//设置字体颜色
			outtextxy(225, 300, "规则");
		}
		else if (m.x > 225 && m.x < 275 && m.y >370 && m.y < 410) {
			settextcolor(RGB(255, 0, 0));		//设置字体颜色
			outtextxy(225, 370, "退出");
		}
		else {
			settextcolor(RGB(0, 0, 0));		//设置字体颜色
			outtextxy(225, 20, "简单");
			outtextxy(225, 90, "困难");
			outtextxy(225, 300, "规则");
			outtextxy(225, 370, "退出");

		}
		switch (m.message) {
		case WM_LBUTTONDOWN:
			if (m.x > 225 && m.x < 275 && m.y >20 && m.y < 60) {
				gamemodel = 0;
				return;
			}
			else if (m.x > 225 && m.x < 275 && m.y >90 && m.y < 130) {
				gamemodel = 1;
				return;
			}
			else if (m.x > 225 && m.x < 275 && m.y >300 && m.y < 340) {
				gamemodel = 2;
				return;
			}
			else if (m.x > 225 && m.x < 275 && m.y >370 && m.y < 410) {
				exit(0);
			}
		}
	}
}

void  EasyModel() {
	while (1) {
		cleardevice();
		win = N * N - 15;
		int type = 0;
		HWND hWnd = GetHWnd();
		int x, y, flag = 0;
		srand((unsigned)time(NULL));
		for (int i = 0; i < N + 2; i++) {
			for (int j = 0; j < N + 2; j++) {
				map[i][j] = 0;
			}
		}
		while (flag < 15) {
			x = rand() % 10 + 1;
			y = rand() % 10 + 1;
			if (map[x][y] != -1) {
				map[x][y] = -1;
				flag++;
			}
		}
		for (int i = 1; i <= N; i++) {	//扫描数组10X10显示部分
			for (int j = 1; j <= N; j++) {
				if (map[i][j] != -1) {
					for (int m = i - 1; m <= i + 1; m++) {//扫描包含该数字的九个格子
						for (int n = j - 1; n <= j + 1; n++) {
							if (map[m][n] == -1) {
								map[i][j]++;
							}
						}
					}
				}
			}
		}
		while (1) {
			DrawGraph();
			type = MouseClick();
			if (type == -1) {
				DrawGraph();
				if (MessageBox(hWnd, "按下确定重玩", "Lose", MB_OK) == IDOK)
					break;
			}
			if (win == 0) {
				DrawGraph();
				if (MessageBox(hWnd, "恭喜你完成游戏,按确认退出", "Win", MB_OK) == IDOK)
					exit(0);
				break;
			}
		}
	}
}
void Difficultmodel() {
	while (1) {
		cleardevice();
		win = N * N * 3 - 70;
		int type = 0;
		HWND hWnd = GetHWnd();
		int x, y, flag = 0;
		srand((unsigned)time(NULL));
		for (int i = 0; i < 2 * N + 2; i++) {
			for (int j = 0; j < (N + 5) + 2; j++) {
				map[i][j] = 0;
			}
		}
		while (flag < 70) {
			x = rand() % 20 + 1;
			y = rand() % 20 + 1;
			if (map[x][y] != -1) {
				map[x][y] = -1;
				flag++;
			}
		}
		for (int i = 1; i <= (N * 2); i++) {	//扫描数组20X15显示部分
			for (int j = 1; j <= (N + 5); j++) {
				if (map[i][j] != -1) {
					for (int m = i - 1; m <= i + 1; m++) {//扫描包含该数字的九个格子
						for (int n = j - 1; n <= j + 1; n++) {
							if (map[m][n] == -1) {
								map[i][j]++;
							}
						}
					}
				}
			}
		}
		while (1) {
			DrawGraph2();
			type = MouseClick2();
			if (type == -1) {
				DrawGraph2();
				if (MessageBox(hWnd, "按下确定重玩", "Lose", MB_OK) == IDOK)
					break;
			}
			if (win == 0) {
				DrawGraph2();
				if (MessageBox(hWnd, "恭喜你完成游戏,按确认退出", "Win", MB_OK) == IDOK)
					exit(0);
				break;
			}
		}
	}
}
void GameRules() {
	putimage(0, 0, &image[13]);
	ExMessage m;
	while (true) {
		settextstyle(40, 18, "楷体");
		RECT a = { 0, 0, 999, 749 };
		drawtext(_T("游戏规则\n"), &a, DT_CENTER | DT_TOP | DT_WORDBREAK);
		settextstyle(30, 10, "楷体");
		settextcolor(RGB(255, 0, 0));		//设置字体颜色
		outtextxy(50, 60, "在10*10或是20*15的方阵中随机埋入数量不等的“地雷”,并将全部格子都做隐藏处理。");
		settextcolor(RGB(255, 0, 0));		//设置字体颜色
		outtextxy(50, 100, "使用鼠标左键对格子进行“点击”,使用鼠标右键对格子进行“标记”,当点击到“地雷”时,游戏失败。");
		settextcolor(RGB(255, 0, 0));		//设置字体颜色
		outtextxy(50, 140, "当点击到的格子周围8格存在地雷时,将会在这个格子上显示8格之内存在的地雷数量。");
		settextcolor(RGB(255, 0, 0));		//设置字体颜色
		outtextxy(50, 180, "当点击到的格子周围8格没有地雷时,将会向周围延伸解除相同格子的隐藏效果,");
		settextcolor(RGB(255, 0, 0));		//设置字体颜色
		outtextxy(50, 220, "直至出现“数字格”为止。当场上除“地雷”以外的格子全部被点击完毕时,游戏胜利。");
		settextstyle(40, 18, "楷体");
		RECT r = { 0, 0, 999, 749 };
		drawtext(_T("雷诀八条"), &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
		settextstyle(30, 10, "楷体");
		settextcolor(RGB(255, 0, 0));		//设置字体颜色
		outtextxy(325, 430, "第一条:基本定式不要忘,现场推理真够呛。");
		settextcolor(RGB(255, 0, 0));		//设置字体颜色
		outtextxy(325, 470, "第二条:鼠标点击不要快,稳定节奏把空开。");
		settextcolor(RGB(255, 0, 0));		//设置字体颜色
		outtextxy(325, 510, "第三条:顺手标雷不要惯,积累下来记录悬。");
		settextcolor(RGB(255, 0, 0));		//设置字体颜色
		outtextxy(325, 550, "第四条:无从下手不要愣,就近猜雷把心横。");
		settextcolor(RGB(255, 0, 0));		//设置字体颜色
		outtextxy(325, 590, "第五条:遇到猜雷不要怕,爆了脸上不留疤。");
		settextcolor(RGB(255, 0, 0));		//设置字体颜色
		outtextxy(325, 630, "第六条:猜雷猜错不要悔,哭天抢地也白费。");
		settextcolor(RGB(255, 0, 0));		//设置字体颜色
		outtextxy(325, 670, "第七条:碰上好局不要慌,紧盯局部慢扩张。");
		settextcolor(RGB(255, 0, 0));		//设置字体颜色
		outtextxy(325, 710, "第八条:痛失好局不要恨,既然有缘定有份。");

	}
}
void DrawGraph() {
	for (int i = 1; i <= N; i++) {
		for (int j = 1; j <= N; j++) {
			switch (map[i][j])
			{
			case 9:putimage((i - 1) * M, (j - 1) * M, &image[9]); break;
			case 10:putimage((i - 1) * M, (j - 1) * M, &image[0]); break;
			case 11:putimage((i - 1) * M, (j - 1) * M, &image[1]); break;
			case 12:putimage((i - 1) * M, (j - 1) * M, &image[2]); break;
			case 13:putimage((i - 1) * M, (j - 1) * M, &image[3]); break;
			case 14:putimage((i - 1) * M, (j - 1) * M, &image[4]); break;
			case 15:putimage((i - 1) * M, (j - 1) * M, &image[5]); break;
			case 16:putimage((i - 1) * M, (j - 1) * M, &image[6]); break;
			case 17:putimage((i - 1) * M, (j - 1) * M, &image[7]); break;
			case 18:putimage((i - 1) * M, (j - 1) * M, &image[8]); break;
			case 29:putimage((i - 1) * M, (j - 1) * M, &image[10]); break;
			case 30:putimage((i - 1) * M, (j - 1) * M, &image[10]); break;
			case 31:putimage((i - 1) * M, (j - 1) * M, &image[10]); break;
			case 32:putimage((i - 1) * M, (j - 1) * M, &image[10]); break;
			case 33:putimage((i - 1) * M, (j - 1) * M, &image[10]); break;
			case 34:putimage((i - 1) * M, (j - 1) * M, &image[10]); break;
			case 35:putimage((i - 1) * M, (j - 1) * M, &image[10]); break;
			case 36:putimage((i - 1) * M, (j - 1) * M, &image[10]); break;
			case 37:putimage((i - 1) * M, (j - 1) * M, &image[10]); break;
			case 38:putimage((i - 1) * M, (j - 1) * M, &image[10]); break;
			default:putimage((i - 1) * M, (j - 1) * M, &image[12]); break;
			}
		}
	}
}
void DrawGraph2() {
	for (int i = 1; i <= (N * 2); i++) {
		for (int j = 1; j <= (N * 2); j++) {
			switch (map[i][j])
			{
			case 9:putimage((i - 1) * M, (j - 1) * M, &image[9]); break;
			case 10:putimage((i - 1) * M, (j - 1) * M, &image[0]); break;
			case 11:putimage((i - 1) * M, (j - 1) * M, &image[1]); break;
			case 12:putimage((i - 1) * M, (j - 1) * M, &image[2]); break;
			case 13:putimage((i - 1) * M, (j - 1) * M, &image[3]); break;
			case 14:putimage((i - 1) * M, (j - 1) * M, &image[4]); break;
			case 15:putimage((i - 1) * M, (j - 1) * M, &image[5]); break;
			case 16:putimage((i - 1) * M, (j - 1) * M, &image[6]); break;
			case 17:putimage((i - 1) * M, (j - 1) * M, &image[7]); break;
			case 18:putimage((i - 1) * M, (j - 1) * M, &image[8]); break;
			case 29:putimage((i - 1) * M, (j - 1) * M, &image[10]); break;
			case 30:putimage((i - 1) * M, (j - 1) * M, &image[10]); break;
			case 31:putimage((i - 1) * M, (j - 1) * M, &image[10]); break;
			case 32:putimage((i - 1) * M, (j - 1) * M, &image[10]); break;
			case 33:putimage((i - 1) * M, (j - 1) * M, &image[10]); break;
			case 34:putimage((i - 1) * M, (j - 1) * M, &image[10]); break;
			case 35:putimage((i - 1) * M, (j - 1) * M, &image[10]); break;
			case 36:putimage((i - 1) * M, (j - 1) * M, &image[10]); break;
			case 37:putimage((i - 1) * M, (j - 1) * M, &image[10]); break;
			case 38:putimage((i - 1) * M, (j - 1) * M, &image[10]); break;
			default:putimage((i - 1) * M, (j - 1) * M, &image[12]); break;
			}
		}
	}
}
int MouseClick() {
	ExMessage m;
	while (true) {
		m = getmessage(EM_MOUSE || EM_KEY);
		switch (m.message)
		{
		case WM_LBUTTONDOWN:
			if (map[m.x / M + 1][m.y / M + 1] == 0) {
				loadingPlay(m.x / M + 1, m.y / M + 1);
			}
			else if (map[m.x / M + 1][m.y / M + 1] <= 8) {
				map[m.x / M + 1][m.y / M + 1] += 10;
				win--;
			}
			if (map[m.x / M + 1][m.y / M + 1] == 9) {
				return -1;
			}
			break;
		case WM_RBUTTONDOWN:
			if (map[m.x / M + 1][m.y / M + 1] <= 8) {
				map[m.x / M + 1][m.y / M + 1] += 30;
			}
			else if (map[m.x / M + 1][m.y / M + 1] >= 29) {
				map[m.x / M + 1][m.y / M + 1] -= 30;
			}
			break;
		}
		return 0;
	}
}
int MouseClick2() {
	ExMessage m;
	while (true) {
		m = getmessage(EM_MOUSE || EM_KEY);
		switch (m.message)
		{
		case WM_LBUTTONDOWN:
			if (map[m.x / M + 1][m.y / M + 1] == 0) {
				loadingPlay2(m.x / M + 1, m.y / M + 1);
			}
			else if (map[m.x / M + 1][m.y / M + 1] <= 8) {
				map[m.x / M + 1][m.y / M + 1] += 10;
				win--;
			}
			if (map[m.x / M + 1][m.y / M + 1] == 9) {
				return -1;
			}
			break;
		case WM_RBUTTONDOWN:
			if (map[m.x / M + 1][m.y / M + 1] <= 8) {
				map[m.x / M + 1][m.y / M + 1] += 30;
			}
			else if (map[m.x / M + 1][m.y / M + 1] >= 29) {
				map[m.x / M + 1][m.y / M + 1] -= 30;
			}
			break;
		}
		return 0;
	}
}
void loadingPlay(int x, int y) {
	map[x][y] += 10;
	win--;
	for (int i = x - 1; i <= x + 1; i++) {
		for (int j = y - 1; j <= y + 1; j++) {
			if (i <= 0 || i >= 11 || j <= 0 || j >= 11)  continue; //防止越界
			if (map[i][j] <= 8) {
				if (map[i][j] == 0) {
					loadingPlay(i, j);
				}
				else if (map[i][j] != -1) {
					map[i][j] += 10;
					win--;
				}
			}
		}
	}
}
void loadingPlay2(int x, int y) {
	map[x][y] += 10;
	win--;
	for (int i = x - 1; i <= x + 1; i++) {
		for (int j = y - 1; j <= y + 1; j++) {
			if (i <= 0 || i >= 21 || j <= 0 || j >= 16)  continue; //防止越界
			if (map[i][j] <= 8) {
				if (map[i][j] == 0) {
					loadingPlay2(i, j);
				}
				else if (map[i][j] != -1) {
					map[i][j] += 10;
					win--;
				}
			}
		}
	}
}

以上就是源码,图片的路径根据你图片所放的位置更改即可,背景底色以及文字颜色也是一样的,扫雷其实最重要的部分就是算法,掌握算法以后,基本上就是贴图了

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个比较复杂的扫雷小游戏C语言代码,希望能对你有所帮助: ```c #include <stdio.h> #include <stdlib.h> #include <time.h> #define ROW 9 #define COL 9 #define ROWS ROW+2 #define COLS COL+2 #define EASY_COUNT 10 void InitBoard(char board[ROWS][COLS], int rows, int cols, char set); void ShowBoard(char board[ROWS][COLS], int row, int col); void SetMine(char board[ROWS][COLS], int row, int col); void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col); void game() { char mine[ROWS][COLS] = { 0 }; char show[ROWS][COLS] = { 0 }; InitBoard(mine, ROWS, COLS, '0'); InitBoard(show, ROWS, COLS, '*'); SetMine(mine, ROW, COL); ShowBoard(show, ROW, COL); FindMine(mine, show, ROW, COL); } void InitBoard(char board[ROWS][COLS], int rows, int cols, char set) { int i = 0; int j = 0; for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { board[i][j] = set; } } } void ShowBoard(char board[ROWS][COLS], int row, int col) { int i = 0; int j = 0; for (i = 1; i <= row; i++) { for (j = 1; j <= col; j++) { printf("%c ", board[i][j]); } printf("\n"); } } void SetMine(char board[ROWS][COLS], int row, int col) { int count = EASY_COUNT; while (count) { int x = rand() % row + 1; int y = rand() % col + 1; if (board[x][y] == '0') { board[x][y] = '1'; count--; } } } int GetMineCount(char mine[ROWS][COLS], int x, int y) { return mine[x - 1][y] + mine[x - 1][y - 1] + mine[x][y - 1] + mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] + mine[x][y + 1] + mine[x - 1][y + 1] - 8 * '0'; } void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) { int x = 0; int y = 0; int win = 0; while (win < row * col - EASY_COUNT) { printf("请输入坐标:\n"); scanf("%d%d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col) { if (mine[x][y] == '1') { printf("很遗憾,你踩雷了!\n"); ShowBoard(mine, row, col); break; } else { int count = GetMineCount(mine, x, y); show[x][y] = count + '0'; ShowBoard(show, row, col); win++; } } else { printf("坐标输入不合法,请重新输入!\n"); } } if (win == row * col - EASY_COUNT) { printf("恭喜你,扫雷成功!\n"); ShowBoard(mine, row, col); } } int main() { int input = 0; srand((unsigned int)time(NULL)); do { printf("**********************\n"); printf("* 1.开始游戏 0.退出 *\n"); printf("**********************\n"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("游戏结束!\n"); break; default: printf("输入错误,请重新输入!\n"); break; } } while (input); return 0; } ``` 该代码实现了一个简单的扫雷小游戏,包括初始化棋盘、随机布雷、计算周围雷数、查找雷区逻辑等功能。其中,使用了二维数组来表示棋盘,利用随机数生成雷区,使用循环实现查找雷区逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值