简单的五子棋操作用两种方法实现

最近有五子棋的大作业,周折半天才弄明白其中的原理,查阅了许多资料,然后网上的代码只有几篇原创并且注释很少,感觉不好理解。所以感觉有必要分享一下自己的心得
本人使用两种方法:
1:(传统方法)鼠标点击事件。大致流程为 定义窗口——从写JPanel中的paint函数(画图由paint实现)——画棋盘——设置数组储存坐标以及是否有棋子——添加鼠标点击事件画棋子(判断鼠标点击的位置离此点最近的那个店的坐标并画棋子)——判断是否有胜利
1)这里说一下paint函数,paint函数定义在那个界面里他会自动执行画图不需要调用,所以你只需要写好约束的事件让他画完棋盘后该什么时候在哪里画棋子。
2)repaint 函数是起到重画作用,你点击过后再最近的那个店需要画棋子,repaint就起到从画的作用
3)本人判断成行的方法是分别定义四个变量代码五子棋个数,当》=5时停止。弹出新的窗口。具体是如果此点左右都有相同颜色的棋子,就吧这个点向左找到一直颜色不同为止,然后从这点向下(右)直接计数。
4)本人的棋子是画出来的,如果追求美观可以用image方法使用下载下来的图片棋子(但是思想一致)。
附上代码和注释:

import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;
public class wuziqi extends JFrame {
 void judgle(int a[][],int i,int j)
 {
 	 //需要定义两个变量(作用相同)一个判断黑棋子,一个判断白棋
 	int k=1; int kk=1;//判断横方向
 int l=1;int kl=1;//判断竖方向
 int k1=1;int kk1=1;//判断左上和右下方向
	 int k2=1; int kk2=1;//判断左下和右上方向
	 //横方向的判断
	 int m=i;int n=j;int m1=i;int n1=j;
	 int m2=i;int n2=j;
	 while(m-1>=0&&a[m-1][j]==1) {m--;}//上下判断
	 while(m<18&&a[m 1][j]==1) {k ;m ;} //左右判断
	 //
	while(n-1>=0&&a[i][n-1]==1) {n--;}
	while(n<18&&a[i][n 1]==1) {l ;n ;} 
	 //左上右下
	while(m1-1>=0&&n1-1>=0&&a[m1-1][n1-1]==1) {m1--;n1--;}
	while(m1<18&&n1<18&&a[m1 1][n1 1]==1) {k1 ;m1 ;n1 ;} 
		//左下右上方向 
 while(m2-1>=0&&n2 1<19&&a[m2-1][n2 1]==1) {m2--;n2 ;}
	while(m2<18&&n2-1>=0&&a[m2 1][n2-1]==1) {k2 ;m2 ;n2--;} 
		 
	 m=i; n=j; m1=i; n1=j;
	 m2=i; n2=j;
	while(m-1>=0&&a[m-1][j]==2) {m--;}//上下判断
 while(m<18&&a[m 1][j]==2) {kk ;m ;} //左右判断
	 //
	 while(n-1>=0&&a[i][n-1]==2) {n--;}
	 while(n<18&&a[i][n 1]==2) {kl ;n ;} 
	 //左上右下
	 while(m1-1>=0&&n1-1>=0&&a[m1-1][n1-1]==2) {m1--;n1--;}
	 while(m1<18&&n1<18&&a[m1 1][n1 1]==2) {kk1 ;m1 ;n1 ;} 
	//左下右上方向 
	 while(m2-1>=0&&n2 1<19&&a[m2-1][n2 1]==2) {m2--;n2 ;}
	 while(m2<18&&n2-1>=0&&a[m2 1][n2-1]==2) {kk2 ;m2 ;n2--;}
	 if(k>=5||l>=5||k1>=5||k2>=5||kk>=5||kl>=5||kk1>=5||kk2>=5) { 
	 	 
	 setTitle("游戏已结束");JFrame frame=new JFrame ("恭喜获胜");
	 Container c=frame.getContentPane();
	 			
	 c.setLayout(new GridLayout(4,1,0,0) );
	 if(a[i][j]==1) {
	 JLabel label=new JLabel("恭喜黑色赢了",JLabel.CENTER);
	 label.setFont(new Font("宋体",0,35));c.add(label);}
	 if(a[i][j]==2) {
	 	JLabel label=new JLabel("恭喜白色赢了",JLabel.CENTER);
	 	label.setFont(new Font("宋体",0,35));c.add(label);}
	 	JButton b1=new JButton("再来一把");
	 	JButton b2=new JButton("结 束");
	 	b1.setFocusPainted(false); 
	 	b2.setFocusPainted(false); 
	 	c.add(new JLabel(""));	
	 	c.add(b1);
	 	b1.setBackground(Color.YELLOW);
	 	c.add(b2);
	 	c.setBackground(Color.red);
	 	frame.setSize(300, 300);
	 	frame.setLocationRelativeTo(null);
	 	frame.setVisible(true);//顺序问题
	 	frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);	
	 	b1.addActionListener(new ActionListener() {//建立监听事件
	 	 public void actionPerformed(ActionEvent e) { if(b1==e.getSource()) 
	 	for(int i=0;i<19;i )
	 	for(int j=0;j<19;j )
	 	{a[i][j]=0;}
	 				
	 	frame.dispose();repaint(); } });//关闭当前窗口
	 	b2.addActionListener(new ActionListener() {//建立监听事件
	 	public void actionPerformed(ActionEvent e) {if(b2==e.getSource())
System.exit(0);//关闭所有
	 						 } });	 	setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); }
}
public wuziqi() {
		setTitle("这是一个五子棋游戏");
		setVisible(true);
		Container c = getContentPane();
		DrawPanel1 jp1 = new DrawPanel1();
		c.add(jp1);
		setSize(1000, 1010);
		jp1.setBackground(new Color(60,150,200));//随便赋值一个背景颜色
		this.setResizable(false);
		this.setLocationRelativeTo(null);//剧中放置,要在setsize后面放置
		setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		c.addMouseListener(new MouseAdapter() {
		public void mouseClicked(MouseEvent e) {
		{
		int x=0,y=0;
		for (int i = 0; i < 19; i ) {
		if (jp1.b4[i][2] >e.getX())
		{if(i>0) { if(e.getX()-jp1.b4[i-1][2] e.getY())//找到点击的点右侧的最近那个坐标值
		{
		if(i>0) { if(e.getY()-jp1.b3[2][i-1]=0&&i<=18) {//横方向的判断
	 int m=i;int n=j;int m1=i;int n1=j;
	 int m2=i;int n2=j;
	 while(m-1>=0&&a[m-1][j]==true) {m--;}//上下判断
	 while(m<18&&a[m 1][j]==true) {k ;m ;} //左右判断
	 //
	 while(n-1>=0&&a[i][n-1]==true) {n--;}
	 while(n<18&&a[i][n 1]==true) {l ;n ;} 
	 //左上右下
		while(m1-1>=0&&n1-1>=0&&a[m1-1][n1-1]==true) {m1--;n1--;}
		while(m1<18&&n1<18&&a[m1 1][n1 1]==true) {k1 ;m1 ;n1 ;} 
		//左下右上方向 
	 while(m2-1>=0&&n2 1<19&&a[m2-1][n2 1]==true) {m2--;n2 ;}
	 while(m2<18&&n2-1>=0&&a[m2 1][n2-1]==true) {k2 ;m2 ;n2--;} 
	 if(k>=5||l>=5||k1>=5||k2>5) { 
			setTitle("游戏已结束");JFrame frame=new JFrame ("恭喜获胜");
			Container c=frame.getContentPane();
			
			c.setLayout(new GridLayout(4,1,0,0) );
			
			JLabel label=new JLabel("恭喜你赢了",JLabel.CENTER);
			label.setFont(new Font("宋体",0,35));
			JButton b1=new JButton("再来一把");
			JButton b2=new JButton("结 束");
			b1.setFocusPainted(false); 
			b2.setFocusPainted(false); 
			c.add(new JLabel(""));
			c.add(label);
			c.add(b1);
			b1.setBackground(Color.YELLOW);
			c.add(b2);
			c.setBackground(Color.red);
			//c.add(b1);
			//c.add(b2);
			frame.setSize(300, 300);
			frame.setLocationRelativeTo(null);
			frame.setVisible(true);//顺序问题
			frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);	
	b1.addActionListener(new ActionListener() {//建立监听事件
	 public void actionPerformed(ActionEvent e) { if(b1==e.getSource()) 
			 for(int i=0;i<19;i )
	 		for(int j=0;j<19;j )
	 		{judgle[i][j]=false; black[i][j]=false; 
	 		 white[i][j]=false;b[i][j].setIcon(null); frame.dispose();repaint(); }
					 } });
	b2.addActionListener(new ActionListener() {//建立监听事件
	 public void actionPerformed(ActionEvent e) {if(b2==e.getSource())System.exit(0);
						 } });	 
			//System.exit(0);//结束
	 }
		}
	public wuziqi2()
	{
		
		setTitle("这是一个五子棋游戏");
		//Container c=getContentPane();
		//setLayout(new FlowLayout(2,10,10));//流布局管理器
		DrawPanel1 d1=new DrawPanel1();
		d1.setSize(950,950);
		d1.setLayout(new GridLayout(19,19,0,0));//网格布局19行19列
		d1.setBackground(new Color(0,200,200));
		setResizable(false);
		add(d1);
		
		for(int i=0;i<19;i ) {
		for(int j=0;j<19;j ) {b[i][j]=new JButton("");d1.add(b[i][j]); b[i][j].setContentAreaFilled(false);//透明
		b[i][j].setBorderPainted(false);//取消边框
		b[i][j].setFocusPainted(false); //取消焦点
		}}
		
		for( int i=0;i<19;i )
		{ for(int j=0;j<19;j )
			b[i][j].addActionListener(new ActionListener() {//建立监听事件
				 public void actionPerformed(ActionEvent e)
				 { for( int i=0;i<19;i ){
					 for(int j=0;j<19;j )
					 if(!judgle[i][j])
					if(e.getSource()==b[i][j])
					{ 
					if(n%2==0) {	drawlconw icon = new drawlconw(40, 40);white[i][j]=true;//有bai棋子
					b[i][j].setIcon(icon);judgle1(white,i,j);}
					if(n%2!=0) {	drawlconb icon = new drawlconb(40, 40);black[i][j]=true;//有hei棋子
					b[i][j].setIcon(icon);judgle1(black,i,j);}
						
					n ;//奇数偶数的计量方式,没有特别意义
					judgle[i][j]=true;//有了棋子
				 }}
				 }
			 });
		}
		setSize(950,950);
		setLocationRelativeTo(null);//要放在sitsize后面,不然整个图形就在
		setVisible(true);
		setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		 
	}
	
	public static void main(String[] args)
	{
		wuziqi2 f=	new wuziqi2();
	}
static	class drawlconw implements Icon{ // 实现Icon接口白色棋子
		private int width; // 声明图标的宽
		private int height; // 声明图标的长
		public int getIconHeight() { // 实现getIconHeight()方法
			return this.height;
		}
		public int getIconWidth() { // 实现getIconWidth()方法
			return this.width;
		}
		public drawlconw(int width, int height) { // 定义构造方法
			this.width = width;
			this.height = height;
		}
		
		// 实现paintIcon()方法
		public void paintIcon(Component arg0, Graphics arg1, int x, int y) {
			arg1.setColor(Color.white);
			arg1.fillOval(x, y, width, height); // 绘制一个圆形
			
		}

}
static	class drawlconb implements Icon{ // 实现Icon接口白色棋子
	
	
	private int width; // 声明图标的宽
	private int height; // 声明图标的长
	public int getIconHeight() { // 实现getIconHeight()方法
		return this.height;
	}
	public int getIconWidth() { // 实现getIconWidth()方法
		return this.width;
	}
	public drawlconb(int width, int height) { // 定义构造方法
		this.width = width;
		this.height = height;
	}
	
	// 实现paintIcon()方法
	public void paintIcon(Component arg0, Graphics arg1, int x, int y) {
		arg1.setColor(Color.black);
		arg1.fillOval(x, y, width, height); // 绘制一个圆形	
	}
}
class DrawPanel1 extends JPanel {
	// Graphics g=getGraphics();
	public void paint(Graphics g) {
		super.paint(g);
		for ( int i = 25; i < 910; i = i 48) {//画竖线
			g.drawLine(30, i, 912, i);
			g.setColor(Color.black);
		}
		for (int i = 30; i <= 925; i = i 49) {//画横线
			g.drawLine(i, 25, i, 890);
		}
		
	}
}
}

这里写图片描述
本人菜鸡刚学java,有很多理解不好的地方,忘大佬指出!

简单 五子棋的客户端部分程序 //chessClient.java:客户端主程序。 //userPad.java:客户端的界面。 //chessPad.java:棋盘的绘制。 //chessServer.java:服务器端。 //可同时容纳50个人同时在线下棋,聊天。 import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*; import java.util.*; class clientThread extends Thread{ chessClient chessclient; clientThread(chessClient chessclient){ this.chessclient=chessclient; } public void acceptMessage(String recMessage){ if(recMessage.startsWith("/userlist ")){ StringTokenizer userToken=new StringTokenizer(recMessage," "); int userNumber=0; chessclient.userpad.userList.removeAll(); chessclient.inputpad.userChoice.removeAll(); chessclient.inputpad.userChoice.addItem("所有人"); while(userToken.hasMoreTokens()){ String user=(String)userToken.nextToken(" "); if(userNumber>0 && !user.startsWith("[inchess]")){ chessclient.userpad.userList.add(user); chessclient.inputpad.userChoice.addItem(user); } userNumber++; } chessclient.inputpad.userChoice.select("所有人"); } else if(recMessage.startsWith("/yourname ")){ chessclient.chessClientName=recMessage.substring(10); chessclient.setTitle("Java五子棋客户端 "+"用户名:"+chessclient.chessClientName); } else if(recMessage.equals("/reject")){ try{ chessclient.chesspad.statusText.setText("不能加入游戏"); chessclient.controlpad.cancelGameButton.setEnabled(false); chessclient.controlpad.joinGameButton.setEnabled(true); chessclient.controlpad.creatGameButton.setEnabled(true); } catch(Exception ef){ chessclient.chatpad.chatLineArea.setText("chessclient.chesspad.chessSocket.close无法关闭"); } chessclient.controlpad.joinGameButton.setEnabled(true); } else if(recMessage.startsWith("/peer ")){ chessclient.chesspad.chessPeerName=recMessage.substring(6); if(chessclient.isServer){ chessclient.chesspad.chessColor=1; chessclient.chesspad.isMouseEnabled=true; chessclient.chesspad.statusText.setText("请黑棋下子"); } else if(chessclient.isClient){ chessclient.chesspad.chessColor=-1; chessclient.chesspad.statusText.setText("已加入游戏,等待对方下子..."); } } else if(recMessage.equals("/youwin")){ chessclient.isOnChess=false; chessclient.chesspad.chessVictory(chessclient.chesspad.chessColor); chessclient.chesspad.statusText.setText("对方退出,请点放弃游戏退出连接"); chessclient.chesspad.isMouseEnabled=false; } else if(recMessage.equals("/OK")){ chessclient.chesspad.statusText.setText("创建游戏成功,等待别人加入..."); } else if(recMessage.equals("/error")){ chessclient.chatpad.chatLineArea.append("传输错误:请退出程序,重新加入 \n"); } else{ chessclient.chatpad.chatLineArea.append(recMessage+"\n"); chessclient.chatpad.chatLineArea.setCaretPosition( chessclient.chatpad.chatLineArea.getText().length()); } } public void run(){ String message=""; try{ while(true){ message=chessclient.in.readUTF(); acceptMessage(message); } } catch(IOException es){ } } } public class chessClient extends Frame implements ActionListener,KeyListener{ userPad userpad=new userPad(); chatPad chatpad=new chatPad(); controlPad controlpad=new controlPad(); chessPad chesspad=new chessPad(); inputPad inputpad=new inputPad(); Socket chatSocket; DataInputStream in; DataOutputStream out; String chessClientName=null; String host=null; int port=4331; boolean isOnChat=false; //在聊天? boolean isOnChess=false; //在下棋? boolean isGameConnected=false; //下棋的客户端连接? boolean isServer=false; //如果是下棋的主机 boolean isClient=false; //如果是下棋的客户端 Panel southPanel=new Panel(); Panel northPanel=new Panel(); Panel centerPanel=new Panel(); Panel westPanel=new Panel(); Panel eastPanel=new Panel(); chessClient( ){ super("Java五子棋客户端"); setLayout(new BorderLayout()); host=controlpad.inputIP.getText(); westPanel.setLayout(new BorderLayout()); westPanel.add(userpad,BorderLayout.NORTH); westPanel.add(chatpad,BorderLayout.CENTER); westPanel.setBackground(Color.pink); inputpad.inputwords.addKeyListener(this); chesspad.host=controlpad.inputIP.getText(); centerPanel.add(chesspad,BorderLayout.CENTER); centerPanel.add(inputpad,BorderLayout.SOUTH); centerPanel.setBackground(Color.pink); controlpad.connectButton.addActionListener(this); controlpad.creatGameButton.addActionListener(this); controlpad.joinGameButton.addActionListener(this); controlpad.cancelGameButton.addActionListener(this); controlpad.exitGameButton.addActionListener(this); controlpad.creatGameButton.setEnabled(false); controlpad.joinGameButton.setEnabled(false); controlpad.cancelGameButton.setEnabled(false); southPanel.add(controlpad,BorderLayout.CENTER); southPanel.setBackground(Color.pink); addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ if(isOnChat){ try{ chatSocket.close(); }catch(Exception ed){ } } if(isOnChess || isGameConnected){ try{ chesspad.chessSocket.close(); }catch(Exception ee){ } } System.exit(0); } public void windowActivated(WindowEvent ea){ } }); add(westPanel,BorderLayout.WEST); add(centerPanel,BorderLayout.CENTER); add(southPanel,BorderLayout.SOUTH); pack(); setSize(670,548); setVisible(true); setResizable(false); validate(); } public boolean connectServer(String serverIP,int serverPort) throws Exception{ try{ chatSocket=new Socket(serverIP,serverPort); in=new DataInputStream(chatSocket.getInputStream()); out=new DataOutputStream(chatSocket.getOutputStream()); clientThread clientthread=new clientThread(this); clientthread.start(); isOnChat=true; return true; } catch(IOException ex){ chatpad.chatLineArea.setText("chessClient:connectServer:无法连接,建议重新启动程序 \n"); } return false; } public void actionPerformed(ActionEvent e){ if(e.getSource()==controlpad.connectButton){ host=chesspad.host=controlpad.inputIP.getText(); try{ if(connectServer(host,port)){ chatpad.chatLineArea.setText(""); controlpad.connectButton.setEnabled(false); controlpad.creatGameButton.setEnabled(true); controlpad.joinGameButton.setEnabled(true); chesspad.statusText.setText("连接成功,请创建游戏或加入游戏"); } } catch(Exception ei){ chatpad.chatLineArea.setText("controlpad.connectButton:无法连接,建议重新启动程序 \n"); } } if(e.getSource()==controlpad.exitGameButton){ if(isOnChat){ try{ chatSocket.close(); } catch(Exception ed){ } } if(isOnChess || isGameConnected){ try{ chesspad.chessSocket.close(); } catch(Exception ee){ } } System.exit(0); } if(e.getSource()==controlpad.joinGameButton){ String selectedUser=userpad.userList.getSelectedItem(); if(selectedUser==null || selectedUser.startsWith("[inchess]") || selectedUser.equals(chessClientName)){ chesspad.statusText.setText("必须先选定一个有效用户"); } else{ try{ if(!isGameConnected){ if(chesspad.connectServer(chesspad.host,chesspad.port)){ isGameConnected=true; isOnChess=true; isClient=true; controlpad.creatGameButton.setEnabled(false); controlpad.joinGameButton.setEnabled(false); controlpad.cancelGameButton.setEnabled(true); chesspad.chessthread.sendMessage("/joingame "+userpad.userList.getSelectedItem()+" "+chessClientName); } }else{ isOnChess=true; isClient=true; controlpad.creatGameButton.setEnabled(false); controlpad.joinGameButton.setEnabled(false); controlpad.cancelGameButton.setEnabled(true); chesspad.chessthread.sendMessage("/joingame "+userpad.userList.getSelectedItem()+" "+chessClientName); } } catch(Exception ee){ isGameConnected=false; isOnChess=false; isClient=false; controlpad.creatGameButton.setEnabled(true); controlpad.joinGameButton.setEnabled(true); controlpad.cancelGameButton.setEnabled(false); chatpad.chatLineArea.setText("chesspad.connectServer无法连接 \n"+ee); } } } if(e.getSource()==controlpad.creatGameButton){ try{ if(!isGameConnected){ if(chesspad.connectServer(chesspad.host,chesspad.port)){ isGameConnected=true; isOnChess=true; isServer=true; controlpad.creatGameButton.setEnabled(false); controlpad.joinGameButton.setEnabled(false); controlpad.cancelGameButton.setEnabled(true); chesspad.chessthread.sendMessage("/creatgame "+"[inchess]"+chessClientName); } }else{ isOnChess=true; isServer=true; controlpad.creatGameButton.setEnabled(false); controlpad.joinGameButton.setEnabled(false); controlpad.cancelGameButton.setEnabled(true); chesspad.chessthread.sendMessage("/creatgame "+"[inchess]"+chessClientName); } } catch(Exception ec){ isGameConnected=false; isOnChess=false; isServer=false; controlpad.creatGameButton.setEnabled(true); controlpad.joinGameButton.setEnabled(true); controlpad.cancelGameButton.setEnabled(false); ec.printStackTrace(); chatpad.chatLineArea.setText("chesspad.connectServer无法连接 \n"+ec); } } if(e.getSource()==controlpad.cancelGameButton){ if(isOnChess){ chesspad.chessthread.sendMessage("/giveup "+chessClientName); chesspad.chessVictory(-1*chesspad.chessColor); controlpad.creatGameButton.setEnabled(true); controlpad.joinGameButton.setEnabled(true); controlpad.cancelGameButton.setEnabled(false); chesspad.statusText.setText("请建立游戏或者加入游戏"); } if(!isOnChess){ controlpad.creatGameButton.setEnabled(true); controlpad.joinGameButton.setEnabled(true); controlpad.cancelGameButton.setEnabled(false); chesspad.statusText.setText("请建立游戏或者加入游戏"); } isClient=isServer=false; } } public void keyPressed(KeyEvent e){ TextField inputwords=(TextField)e.getSource(); if(e.getKeyCode()==KeyEvent.VK_ENTER){ if(inputpad.userChoice.getSelectedItem().equals("所有人")){ try{ out.writeUTF(inputwords.getText()); inputwords.setText(""); } catch(Exception ea){ chatpad.chatLineArea.setText("chessClient:KeyPressed无法连接,建议重新连接 \n"); userpad.userList.removeAll(); inputpad.userChoice.removeAll(); inputwords.setText(""); controlpad.connectButton.setEnabled(true); } } else{ try{ out.writeUTF("/"+inputpad.userChoice.getSelectedItem()+" "+inputwords.getText()); inputwords.setText(""); } catch(Exception ea){ chatpad.chatLineArea.setText("chessClient:KeyPressed无法连接,建议重新连接 \n"); userpad.userList.removeAll(); inputpad.userChoice.removeAll(); inputwords.setText(""); controlpad.connectButton.setEnabled(true); } } } } public void keyTyped(KeyEvent e){} public void keyReleased(KeyEvent e){} public static void main(String args[]){ chessClient chessClient=new chessClient(); } }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员bigsai

喝杯咖啡压压惊!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值