三子棋 人机对战(人机难度选择) 好友对战

主函数代码;

#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
 

int main()
{
	int a = 0;
	int b = 0;//计数下了多少手
	int jiziqi = 0;
	srand((unsigned int)time(NULL));
	do
	{
	kaishi();
	scanf("%d", &a);
	
    switch (a)
		{
		case 1:
			do
			{
				printf("\n请选择玩几子棋:");
				scanf("%d", &jiziqi);
				if (jiziqi != 3)
				{
					printf("\n目前仅支持三子棋 嘿嘿::\n请重新选择\n");
				}
				else
					break;
			} while (1);
		//选择模式  人机对战   好友对战
			int mo= model1();
			if (mo == 1)
			{
				int nandu = model2();
				if (nandu == 1)
				{
					char qipan[X][Y];
					chushihua(qipan, X, Y);
					dayin(qipan, X, Y);
					int panduan = 0;
					do
					{
						zuobiao(X, Y);
						printf("你的棋为X\n");
						player(qipan, X, Y);
						b++;
						dayin(qipan, X, Y);
						panduan = whowin(qipan, X, Y, b, jiziqi);
						if (panduan == 1)
						{
							b = 0; break;
						}

						AI(qipan, b);
						/*computer(qipan, X, Y);*/
						b++;
						dayin(qipan, X, Y);
						panduan = whowin(qipan, X, Y, b, jiziqi);
						if (panduan == 1)
						{
							b = 0; break;
						}
					} while (1);
				}
				
				else
				{
					char qipan[X][Y];
					chushihua(qipan, X, Y);
					dayin(qipan, X, Y);
					int panduan = 0;
					do
					{
						zuobiao(X, Y);
						printf("你的棋为X\n");
						player(qipan, X, Y);
						b++;
						dayin(qipan, X, Y);
						panduan = whowin(qipan, X, Y, b, jiziqi);
						if (panduan == 1)
						{
							b = 0; break;
						}

						/*AI(qipan, b);*/
						computer(qipan, X, Y);
						b++;
						dayin(qipan, X, Y);
						panduan = whowin(qipan, X, Y, b, jiziqi);
						if (panduan == 1)
						{
							b = 0; break;
						}
					} while (1);

				}
			}
			
	//玩家对战		
			else
			{
				char qipan[X][Y];
				chushihua(qipan, X, Y);
				dayin(qipan, X, Y);
				int panduan = 0;
				do
				{
					zuobiao(X, Y);
					printf("先手的棋为X\n");
					player1(qipan, X, Y);
					b++;
					dayin(qipan, X, Y);
					panduan = whowin2(qipan, X, Y, b, jiziqi);
					if (panduan == 1)
					{
						b = 0; break;
					}

					zuobiao(X, Y);
					printf("后手的棋为O\n");
					player2(qipan, X, Y);
					b++;
					dayin(qipan, X, Y);
					panduan = whowin2(qipan, X, Y, b, jiziqi);
					if (panduan == 1)
					{
						b = 0; break;
					}
				} while (1);
			
			}
	
	printf("\n****** 1继续游戏  2退出游戏 ******\n");
	printf("\n是否继续游戏嘛:");
	int linshi = 0;
	scanf("%d", &linshi);
		if(linshi==1)
		{
			printf("\n\n");
			break;
		}
		
		
		
		case 2:  printf("\n游戏结束\n"); a = 2; break;

		
		
		default: printf("\n输入有误,请重新选择:\n"); break;
	    }
	} while (a != 2);

	return 0;
}





自建函数库:



#define _CRT_SECURE_NO_WARNINGS 
#include "game.h"

//游戏开头
void kaishi()
{
	printf("********* 佰木BM learning ********\n");
    printf("**********************************\n");
	printf("**********************************\n");
	printf("****** 1开始游戏  2退出游戏 ******\n");
	printf("**********************************\n");
	printf("**********************************\n");
	printf("请输入你的选择:");
}



//模式1      人机对战返回1    好友对战返回2
int model1()
{
		printf("**********************************\n");
		printf("**********************************\n");
		printf("**********************************\n");
		printf("**** 1人机对战  or  2好友对战 ****\n");
		printf("**********************************\n");
		printf("**********************************\n");
		printf("**********************************\n");
		int a = 0;
do {
		printf("请输入你的选择:");;
		scanf("%d", &a);
        if(a==1)
			return 1;
		else 
		{
			if (a==2)
				return 2;
			else
				printf("\n输入有误,请重新选择\n");
		}
	} while(1);

}


int model2()
{
	printf("\n\n**********************************\n");
	printf("**** 1人工智能  or  2人工智障 ****\n");
	printf("**********************************\n");
	printf("\n请选择人机难度:");
	int nandu = 0;
	do {
		scanf("%d", &nandu);
		if(nandu==1)
			return nandu;
		else
		{
			if (nandu == 2)
				return nandu;
			else
				printf("\n输入错误请重新输入;");
		}
	   } while (1);	  
}




//棋盘初始化
void chushihua(char qipan[X][Y], int x, int y)
{
	int i = 0;
	int j = 0;
	for (i = 0; i <= x - 1; ++i)
	{
		for (j = 0; j <= y - 1; ++j)
			qipan[i][j] = ' ';
	}
}



//棋盘坐标对应表
void zuobiao(int x, int y)
{
	int i = 0;
	int j = 0;
	for (i = 0; i <= x - 1; ++i)
	{
		for (j = 0; j <= y - 1; ++j)
		{
			printf(" (%d,%d) ", i + 1, j + 1);
			if (j < y - 1)
				printf("|");
		}
		printf("\n");
		for (j = 0; j <= y - 1; ++j)
		{
			if (i < x - 1)
				printf("------- ");
		}
		printf("\n");
	}
	return 0;

}


//打印当前棋盘情况
void dayin(char qipan[X][Y], int x, int y)
{
	printf("\n");
	int i = 0;
	int j = 0;
	for (i = 0; i <= x - 1; ++i)
	{
		for (j = 0; j <= y - 1; ++j)
		{
			printf(" %c ", qipan[i][j]);
			if (j < y-1)
				printf("|");
      	}
		printf("\n");
		for (j = 0; j <= y - 1; ++j)
		{
			if (i < x - 1)
				printf("--- ");
		}
		printf("\n");
	}
	printf("\n");
}



//玩家下 (X号棋)  人机对战
void player(char qipan[X][Y], int x, int y)
{
	int a = 0, b = 0;
	printf("到你(X)下棋了:");
	do
	{
		scanf("%d %d", &a, &b);
		if ((qipan[a - 1][b - 1] != ' ') || (a <= 0) || (a > x) || (b <= 0) || (b > y))
			printf("\n此位置无效,请重新输入:");
		else
		{
			qipan[a - 1][b - 1] = 'X';
			break;
		}
	} while (1);
}


//玩家1下 (X号棋)  好友对战
void player1(char qipan[X][Y], int x, int y)
{
	int a = 0, b = 0;
	printf("到先手(X)下棋了:");
	do
	{
		scanf("%d %d", &a, &b);
		if ((qipan[a - 1][b - 1] != ' ') || (a <= 0) || (a > x) || (b <= 0) || (b > y))
			printf("\n此位置无效,请重新输入:");
		else
		{
			qipan[a - 1][b - 1] = 'X';
			break;
		}
	} while (1);
}
//玩家2下 O号棋)
void player2(char qipan[X][Y], int x, int y)
{
	int a = 0, b = 0;
	printf("到后手(O)下棋了:");
	do
	{
		scanf("%d %d", &a, &b);
		if ((qipan[a - 1][b - 1] != ' ') || (a <= 0) || (a > x) || (b <= 0) || (b > y))
			printf("\n此位置无效,请重新输入:");
		else
		{
			qipan[a - 1][b - 1] = 'O';
			break;
		}
	} while (1);
}






//电脑下 (O号棋)   (初级难度)
void computer(char qipan[X][Y], int x, int y)
{
	int a = 0, b = 0;
	printf("到人工智障下棋了:");
	do
	{
		a = rand()% x;
		b = rand()% y;
		if (qipan[a][b] == ' ')
		{
			qipan[a][b] = 'O';
			printf("(%d,%d)", a+1, b+1);
			break;
		}
	} while (1);
}




// AI电脑 后手 下棋 (三子棋) (O号棋)
void AI(char qipan[X][Y], int b)
{

	printf("到AI棋圣下棋了:");
	int i = 0, j = 0;


	//找自己的两颗棋
	for (i = 0; i <= 2; ++i)
	{
		if ((qipan[i][0] == qipan[i][1]) && (qipan[i][1] == 'O') && (qipan[i][2] == ' '))
		{
			qipan[i][2] = 'O';
			printf("(%d,3)\n", i + 1);
			return 0;
		}
		if ((qipan[i][1] == qipan[i][2]) && (qipan[i][1] == 'O') && (qipan[i][0] == ' '))
		{
			qipan[i][0] = 'O';
			printf("(%d,1)\n", i + 1);
			return 0;
		}
		if ((qipan[i][0] == qipan[i][2]) && (qipan[i][0] == 'O') && (qipan[i][1] == ' '))
		{
			qipan[i][1] = 'O';
			printf("(%d,2)\n", i + 1);
			return 0;
		}

	}

	for (j = 0; j <= 2; ++j)
	{
		if ((qipan[0][j] == qipan[1][j]) && (qipan[0][j] == 'O') && (qipan[2][j] == ' '))
		{
			qipan[2][j] = 'O';
			printf("(3,%d)\n", j + 1);
			return 0;

		}
		if ((qipan[1][j] == qipan[2][j]) && (qipan[1][j] == 'O') && (qipan[0][j] == ' '))
		{
			qipan[0][j] = 'O';
			printf("(1,%d)\n", j + 1);
			return 0;
		}
		if ((qipan[0][j] == qipan[2][j]) && (qipan[0][j] == 'O') && (qipan[1][j] == ' '))
		{
			qipan[1][j] = 'O';
			printf("(2,%d)\n", j + 1);
			return 0;
		}

	}

	if ((qipan[0][0] == qipan[1][1]) && (qipan[1][1] == 'O') && (qipan[2][2] == ' '))
	{
		qipan[2][2] = 'O';
		printf("(3,3)\n");
		return 0;
	}
	if ((qipan[0][0] == qipan[2][2]) && (qipan[0][0] == 'O') && (qipan[1][1] == ' '))
	{
		qipan[1][1] = 'O';
		printf("(2, 2)\n");
		return 0;
	}
	if ((qipan[1][1] == qipan[2][2]) && (qipan[1][1] == 'O') && (qipan[0][0] == ' '))
	{
		qipan[0][0] = 'O';
		printf("(1, 1)\n");
		return 0;
	}
	if ((qipan[0][2] == qipan[1][1]) && (qipan[1][1] == 'O') && (qipan[2][0] == ' '))
	{
		qipan[2][0] = 'O';
		printf("(3, 1)\n");
		return 0;
	}
	if ((qipan[0][2] == qipan[2][0]) && (qipan[0][2] == 'O') && (qipan[1][1] == ' '))
	{
		qipan[1][1] = 'O';
		printf("(2, 2)\n");
		return 0;
	}
	if ((qipan[2][0] == qipan[1][1]) && (qipan[1][1] == 'O') && (qipan[0][2] == ' '))
	{
		qipan[0][2] = 'O';
		printf("(1, 3)\n");
		return 0;
	}



	//堵对手的两个棋
	for (i = 0; i <= 2; ++i)
	{
		if ((qipan[i][0] == qipan[i][1]) && (qipan[i][1] == 'X') && (qipan[i][2] == ' '))
		{
			qipan[i][2] = 'O';
			printf("(%d,3)\n", i + 1);
			return 0;
		}
		if ((qipan[i][1] == qipan[i][2]) && (qipan[i][1] == 'X') && (qipan[i][0] == ' '))
		{
			qipan[i][0] = 'O';
			printf("(%d,1)\n", i + 1);
			return 0;
		}
		if ((qipan[i][0] == qipan[i][2]) && (qipan[i][0] == 'X') && (qipan[i][1] == ' '))
		{
			qipan[i][1] = 'O';
			printf("(%d,2)\n", i + 1);
			return 0;
		}

	}

	for (j = 0; j <= 2; ++j)
	{
		if ((qipan[0][j] == qipan[1][j]) && (qipan[0][j] == 'X') && (qipan[2][j] == ' '))
		{
			qipan[2][j] = 'O';
			printf("(3,%d)\n", j + 1);
			return 0;

		}
		if ((qipan[1][j] == qipan[2][j]) && (qipan[1][j] == 'X') && (qipan[0][j] == ' '))
		{
			qipan[0][j] = 'O';
			printf("(1,%d)\n", j + 1);
			return 0;
		}
		if ((qipan[0][j] == qipan[2][j]) && (qipan[0][j] == 'X') && (qipan[1][j] == ' '))
		{
			qipan[1][j] = 'O';
			printf("(2,%d)\n", j + 1);
			return 0;
		}

	}

	if ((qipan[0][0] == qipan[1][1]) && (qipan[1][1] == 'X') && (qipan[2][2] == ' '))
	{
		qipan[2][2] = 'O';
		printf("(3,3)\n");
		return 0;
	}
	if ((qipan[0][0] == qipan[2][2]) && (qipan[0][0] == 'X') && (qipan[1][1] == ' '))
	{
		qipan[1][1] = 'O';
		printf("(2, 2)\n");
		return 0;
	}
	if ((qipan[1][1] == qipan[2][2]) && (qipan[1][1] == 'X') && (qipan[0][0] == ' '))
	{
		qipan[0][0] = 'O';
		printf("(1, 1)\n");
		return 0;
	}
	if ((qipan[0][2] == qipan[1][1]) && (qipan[1][1] == 'X') && (qipan[2][0] == ' '))
	{
		qipan[2][0] = 'O';
		printf("(3, 1)\n");
		return 0;
	}
	if ((qipan[0][2] == qipan[2][0]) && (qipan[0][2] == 'X') && (qipan[1][1] == ' '))
	{
		qipan[1][1] = 'O';
		printf("(2, 2)\n");
		return 0;
	}
	if ((qipan[2][0] == qipan[1][1]) && (qipan[1][1] == 'X') && (qipan[0][2] == ' '))
	{
		qipan[0][2] = 'O';
		printf("(1, 3)\n");
		return 0;
	}






	//上述情况都没有的话 抢占中间位置
	if (qipan[1][1] == ' ')
	{
		qipan[1][1] = 'O';
		printf("(2, 2)\n");
		return 0;
	}
	
	
	if (b == 1)  //AI第一手无中间位置 就抢占四个角
 {
	switch ((rand() % 4 + 1))
	{
	case 1: qipan[0][0] = 'O'; printf("(1,1)"); return 0;
	case 2: qipan[2][2] = 'O'; printf("(3,3)"); return 0;
	case 3: qipan[2][0] = 'O'; printf("(3,1)"); return 0;
	case 4: qipan[0][2] = 'O'; printf("(1,3)"); return 0;
	}
	
  }
	if (b == 3)   //AI第二手.防止玩家偷鸡,抢四个角的位置
	{

		if (qipan[0][0] == ' ')
		{
			qipan[0][0] = 'O';return 0;
		}
		else
		{
				
			if (qipan[2][2] == ' ')
					{
					qipan[2][3] = 'O'; return 0;
					}
				else
				{
					if (qipan[0][2] == ' ')
					{
						qipan[0][2] = 'O'; return 0;
					}

					else 
					{
						if (qipan[2][0] == ' ')
						{
							qipan[2][0] = 'O'; return 0;
						}
					}
				}


		}
	}
	
	
	if (b > 1)// 除了上面的情况 随机下
	{
		int xx = 0, yy = 0;
		do
		{
			xx = rand() % 3;
			yy = rand() % 3;
			if (qipan[xx][yy] == ' ')
			{
				qipan[xx][yy] = 'O';
				printf("(%d,%d)", xx + 1, yy + 1);
				break;
			}
		} while (1);
	}

}




//判断是否取胜 (人机对战)  (针对三子棋的判断方法)    //出结果了返回1   继续下返回0
int whowin(char qipan[X][Y], int x, int y,int b,int jiziqi)
{
	if (b >= (jiziqi * 2 - 1))
	{
		int win = whowin1(qipan, x, y, b, jiziqi);
		if(win!=4)
		{
			if (win ==3)
			{
				printf("平局\n\n\n"); return 1;
			}

			else
			{
				if (win ==2)
				{
					printf("很遗憾,你输了,电脑获胜\n 再接再厉\n\n\n"); return 1;
				}
				else
				{
					printf("恭喜你获得了胜利\n\n\n"); return 1;
				}
			}
		}
		
	}
	return 0;
}

//判断是否取胜  (好友对战) (针对三子棋的判断方法)    //出结果了返回1   继续下返回0
int whowin2(char qipan[X][Y], int x, int y, int b, int jiziqi)
{
	if (b >= (jiziqi * 2 - 1))
	{
		int win = whowin1(qipan, x, y, b, jiziqi);
		if (win != 4)
		{
			if (win == 3)
			{
				printf("平局\n\n\n"); return 1;
			}

			else
			{
				if (win == 2)
				{
					printf("恭喜后手玩家2(O形棋)获胜\n\n\n"); return 1;
				}
				else
				{
					printf("恭喜先手玩家1(X形棋)获胜\n\n\n"); return 1;
				}
			}
		}

	}
	return 0;
}







int whowin1(char qipan[X][Y], int x, int y, int b, int jiziqi)  //返回     1玩家赢   2电脑赢(玩家2赢)   3平局   4继续游戏
{
	int i = 0, j = 0;

	//判断玩家赢
	for (i = 0; i <= x - 1; ++i)
	{
		if ((qipan[i][0] == qipan[i][1]) && (qipan[i][1] == qipan[i][2]) && (qipan[i][0] == 'X'))
			return 1;
	}
	for (j = 0; j <= y - 1; ++j)
	{
		if ((qipan[0][j] == qipan[1][j]) && (qipan[1][j] == qipan[2][j]) && (qipan[0][j] == 'X'))
			return 1;
	}
	if((qipan[0][0]==qipan[1][1])&&(qipan[1][1] == qipan[2][2])&&(qipan[1][1] =='X'))
		return 1;
	if ((qipan[0][2] == qipan[1][1]) && (qipan[1][1] == qipan[2][0]) && (qipan[1][1] == 'X'))
		return 1;


	//判断电脑赢
	for (i = 0; i <= x - 1; ++i)
	{
		if ((qipan[i][0] == qipan[i][1]) && (qipan[i][1] == qipan[i][2]) && (qipan[i][0] == 'O'))
			return 2;
	}
	for (j = 0; j <= y - 1; ++j)
	{
		if ((qipan[0][j] == qipan[1][j]) && (qipan[1][j] == qipan[2][j]) && (qipan[0][j] == 'O'))
			return 2;
	}
	if ((qipan[0][0] == qipan[1][1]) && (qipan[1][1] == qipan[2][2]) && (qipan[1][1] == 'O'))
		return 2;
	if ((qipan[0][2] == qipan[1][1]) && (qipan[1][1] == qipan[2][0]) && (qipan[1][1] == 'O'))
		return 2;

	
	
	//其他情况
	if (b ==( x * y))
		return 3;
	else
		return 4;


}








头文件 函数声明文件:

#pragma once
#include<stdio.h>
#include<time.h>
#include<stdlib.h>

//棋盘大小
#define X 3
#define Y 3

void kaishi();//游戏开头

void chushihua(char qipan[X][Y], int x, int y);// 棋盘初始化  每个都为空格打印出来及什么都不显示


int model1();//模式1      人机对战返回1    好友对战返回2
int model2();//模式2   确定人机难度 1人工智能  2人工智障


void zuobiao(int x, int y);//棋盘坐标对应表

void dayin(char qipan[X][Y], int x, int y);//打印当前棋盘情况


void player(char qipan[X][Y], int x, int y);  //玩家下 (X号棋)  人机对战

void player2(char qipan[X][Y], int x, int y);//玩家2下 好友对战 (O号棋)

void player(char qipan[X][Y], int x, int y);//玩家1下 (X号棋)  好友对战

void computer(char qipan[X][Y], int x, int y); //电脑下 (O号棋)()初级难度
void AI(char qipan[X][Y],int b);//AI下棋



int whowin(char qipan[X][Y], int x, int y, int b, int jiziqi);   //判断是否取胜  (针对三子棋的判断方法)
int whowin1(char qipan[X][Y], int x, int y, int b, int jiziqi);//  确定什么棋三连了   返回     1玩家赢   2电脑赢 3平局   4继续游戏


int whowin2(char qipan[X][Y], int x, int y, int b, int jiziqi);//判断是否取胜  (好友对战) (针对三子棋的判断方法)    //出结果了返回1   继续下返回0

<think>好的,用户想了解三子人机的相关内容。首先,我需要确定用户对三子的基本规则是否熟悉。三子是井字,3x3的盘,双方轮流下,先连成三子一线的一方获胜。如果用户已经了解规则,那重点应放在人机的实现方法上。 接下来,用户可能想知道如何让计算机参与对,这可能涉及到算法选择。常见的算法有随机选择、极大极小算法(Minimax)及其优化版本Alpha-Beta剪枝。对于三子这样的简单游戏,极大极小算法已经足够,但可能需要解释其基本原理。 然后,我需要考虑用户的技术背景。如果是普通用户,可能需要用简单易懂的语言解释算法,而如果是开发者,可能需要更详细的实现步骤。用户的问题中没有明确说明,所以最好兼顾两者,先介绍基本概念,再深入一点实现细节。 另外,用户可能对实现的具体步骤感兴趣,比如如何表示盘、判断胜负、设计计算机的决策逻辑等。这部分需要分步骤说明,结构清晰,方便理解。 还需要注意用户提到的格式要求,数学公式需要用$...$或$$...$$包裹。在解释极大极小算法时,可能需要涉及评估函数,这时候可以用数学表达式,例如得分可以表示为$+1$、$-1$或$0$。 最后,要确保回答真实可靠,可能需要验证各个步骤的正确性,比如胜负判断的条件是否全面,算法是否覆盖所有可能的情况。同时,提醒用户三子的必胜策略,可能存在先手优势,计算机如果完美执行策略,通常不会输。 总结回答结构:先介绍三子规则,再分步骤讲解人机的实现,包括盘表示、胜负判断、算法选择(如极大极小),最后给出简单代码示例或逻辑描述,并提及可能的优化方向。</think>三子(井字人机实现可分为以下关键步骤: 一、基础规则 $$3 \times 3$$ 盘,玩家(○)与AI(×)交替落子,先实现横向/纵向/对角线三连者为胜,平局时盘填满无胜方。 二、核心实现框架 1. 盘表示 ```python board = [ [' ', ' ', ' '], [' ', ' ', ' '], [' ', ' ', ' '] ] ``` 2. 胜负判定函数 检查所有行、列、对角线的组合是否满足: $$\exists \text{ line } \in \text{lines}, \text{ all}(cell == player)$$ 3. 人机交互循环 while True: 显示盘 玩家输入坐标 if 玩家胜利: 结束游戏 if 平局: 结束游戏 AI计算最佳落子 if AI胜利: 结束游戏 三、AI算法实现(极大极小算法) 1. 评估函数 - AI胜:$+10$ 分 - 玩家胜:$-10$ 分 - 平局:$0$ 分 2. 递归搜索树 $$\text{Maximize}(AI) \leftrightarrow \text{Minimize}(玩家)$$ 通过深度优先搜索遍历所有可能走法 3. 伪代码实现 def minimax(board, depth, is_maximizing): if 游戏结束: return 当前评估值 if is_maximizing: max_eval = -∞ for 每个空位: 下子× eval = minimax(board, depth+1, False) 撤销落子 max_eval = max(max_eval, eval) return max_eval else: min_eval = +∞ for 每个空位: 下子○ eval = minimax(board, depth+1, True) 撤销落子 min_eval = min(min_eval, eval) return min_eval 四、优化方向 1. Alpha-Beta剪枝:减少无效搜索分支 2. 开局库优化:预置常见开局模式 3. 启发式评估:根据盘中心/角落位置加权评分 注:三子属于$P$完全问题,完美策略下先手必胜。实际实现时AI可通过穷举保证不败,但为增加趣味性可设置不同难度级别(如随机选择次优解)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值