public class User {
		private String username;
		private String password;


		public User() {
		}

		public User(String username, String password) {
			this.username = username;
			this.password = password;
		}

		/**
		 * 获取
		 * @return username
		 */
		public String getUsername() {
			return username;
		}

		/**
		 * 设置
		 * @param username
		 */
		public void setUsername(String username) {
			this.username = username;
		}

		/**
		 * 获取
		 * @return password
		 */
		public String getPassword() {
			return password;
		}

		/**
		 * 设置
		 * @param password
		 */
		public void setPassword(String password) {
			this.password = password;
		}
		}
		
        
            
		import java.awt.event.ActionEvent;
		import java.awt.event.ActionListener;

		public class MyActionListener implements ActionListener {
			@Override
			public void actionPerformed(ActionEvent e) {
				System.out.println("按钮被点击了");
			}
		}
		
        
            
		import javax.swing.*;
		import java.awt.event.ActionEvent;
		import java.awt.event.ActionListener;
		import java.util.Random;

		public class MyJFrame extends JFrame implements ActionListener {

		//创建一个按钮对象
		JButton jtb1 = new JButton("点我啊");
		//创建一个按钮对象
		JButton jtb2 = new JButton("再点我啊");

		public MyJFrame(){
        //设置界面的宽高
        this.setSize(603, 680);
        //设置界面的标题
        this.setTitle("拼图单机版 v1.0");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置关闭模式
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //取消默认的居中放置,只有取消了才会按照XY轴的形式添加组件
        this.setLayout(null);


        //给按钮设置位置和宽高
        jtb1.setBounds(0,0,100,50);
        //给按钮添加事件
        jtb1.addActionListener(this);


        //给按钮设置位置和宽高
        jtb2.setBounds(100,0,100,50);
        jtb2.addActionListener(this);


        //那按钮添加到整个界面当中
        this.getContentPane().add(jtb1);
        this.getContentPane().add(jtb2);

        //让整个界面显示出来
        this.setVisible(true);
		}

		@Override
		public void actionPerformed(ActionEvent e) {
        //对当前的按钮进行判断

        //获取当前被操作的那个按钮对象
        Object source = e.getSource();

        if(source == jtb1){
            jtb1.setSize(200,200);
        }else if(source == jtb2){
            Random r = new Random();
            jtb2.setLocation(r.nextInt(500),r.nextInt(500));
        }
    	}
		}
		
        
            
		import javax.swing.*;
		import java.awt.event.ActionEvent;
		import java.awt.event.ActionListener;
		import java.awt.event.MouseEvent;
		import java.awt.event.MouseListener;
		import java.util.Random;

		public class MyJFrame2 extends JFrame implements MouseListener {

		//创建一个按钮对象
		JButton jtb1 = new JButton("点我啊");

		public MyJFrame2(){
        //设置界面的宽高
        this.setSize(603, 680);
        //设置界面的标题
        this.setTitle("拼图单机版 v1.0");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置关闭模式
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //取消默认的居中放置,只有取消了才会按照XY轴的形式添加组件
        this.setLayout(null);

        //给按钮设置位置和宽高
        jtb1.setBounds(0,0,100,50);
        //给按钮绑定鼠标事件
        jtb1.addMouseListener(this);



        //那按钮添加到整个界面当中
        this.getContentPane().add(jtb1);

        //让整个界面显示出来
        this.setVisible(true);
		}


		@Override
		public void mouseClicked(MouseEvent e) {
			System.out.println("单击");
		}

		@Override
		public void mousePressed(MouseEvent e) {
			System.out.println("按下不松");
		}

		@Override
		public void mouseReleased(MouseEvent e) {
			System.out.println("松开");
		}

		@Override
		public void mouseEntered(MouseEvent e) {
			System.out.println("划入");
		}

		@Override
		public void mouseExited(MouseEvent e) {
			System.out.println("划出");
		}
		}
		
        
            
		import javax.swing.*;
		import java.awt.event.KeyEvent;
		import java.awt.event.KeyListener;
		import java.awt.event.MouseEvent;
		import java.awt.event.MouseListener;
		import java.security.Key;

		public class MyJFrame3 extends JFrame implements KeyListener {

    	public MyJFrame3(){
        //设置界面的宽高
        this.setSize(603, 680);
        //设置界面的标题
        this.setTitle("拼图单机版 v1.0");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置关闭模式
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //取消默认的居中放置,只有取消了才会按照XY轴的形式添加组件
        this.setLayout(null);

        //给整个窗体添加键盘监听
        //调用者this:本类对象,当前的界面对象,表示我要给整个界面添加监听
        //addKeyListener:表示要给本界面添加键盘监听
        //参数this:当事件被触发之后,会执行本类中的对应代码
        this.addKeyListener(this);



        //让整个界面显示出来
        this.setVisible(true);
		}


		@Override
		public void keyTyped(KeyEvent e) {

		}


		//细节1:
		//如果我们按下一个按键没有松开,那么会重复的去调用keyPressed方法
		//细节2:
		//键盘里面那么多按键,如何进行区分?
		//每一个按键都有一个编号与之对应
		@Override
		public void keyPressed(KeyEvent e) {
			System.out.println("按下不松");
		}

		@Override
		public void keyReleased(KeyEvent e) {
			System.out.println("松开按键");
			//获取键盘上每一个按键的编号
			int code = e.getKeyCode();
			if(code == 65){
				System.out.println("现在按的是A");
			}else if(code == 66){
				System.out.println("现在按的是B");
			}
		}
		}
		
        
            
		import java.util.Random;

		public class Test1 {
    	public static void main(String[] args) {
        //需求:
        //把一个一维数组中的数据:0~15 打乱顺序
        //然后再按照4个一组的方式添加到二维数组当中

        //1.定义一个一维数组
        int[] tempArr = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
        //2.打乱数组中的数据的顺序
        //遍历数组,得到每一个元素,拿着每一个元素跟随机索引上的数据进行交换
        Random r = new Random();
        for (int i = 0; i < tempArr.length; i++) {
            //获取到随机索引
            int index = r.nextInt(tempArr.length);
            //拿着遍历到的每一个数据,跟随机索引上的数据进行交换
            int temp = tempArr[i];
            tempArr[i] = tempArr[index];
            tempArr[index] = temp;
        }
        //3.遍历数组
        for (int i = 0; i < tempArr.length; i++) {
            System.out.print(tempArr[i] + " ");
        }
        System.out.println();

        //4.创建一个二维数组
        int[][] data = new int[4][4];

        //5.给二维数组添加数据
        //解法一:
        //遍历一维数组tempArr得到每一个元素,把每一个元素依次添加到二维数组当中
        for (int i = 0; i < tempArr.length; i++) {
            data[i / 4][i % 4] = tempArr[i];
        }

        //遍历二维数组
        for (int i = 0; i < data.length; i++) {
            for (int j = 0; j < data[i].length; j++) {
                System.out.print(data[i][j] + " ");
            }
            System.out.println();
        }
    	}
		}
		
        
            
		import java.util.Random;

		public class Test2 {
    	public static void main(String[] args) {
        //需求:
        //把一个一维数组中的数据:0~15 打乱顺序
        //然后再按照4个一组的方式添加到二维数组当中

        //1.定义一个一维数组
        int[] tempArr = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
        //2.打乱数组中的数据的顺序
        //遍历数组,得到每一个元素,拿着每一个元素跟随机索引上的数据进行交换
        Random r = new Random();
        for (int i = 0; i < tempArr.length; i++) {
            //获取到随机索引
            int index = r.nextInt(tempArr.length);
            //拿着遍历到的每一个数据,跟随机索引上的数据进行交换
            int temp = tempArr[i];
            tempArr[i] = tempArr[index];
            tempArr[index] = temp;
        }
        //3.遍历数组
        for (int i = 0; i < tempArr.length; i++) {
            System.out.print(tempArr[i] + " ");
        }
        System.out.println();

        //4.创建一个二维数组
        int[][] data = new int[4][4];

        //5.给二维数组添加数据
        //解法二:
        //遍历二维数组,给里面的每一个数据赋值
        int index = 0;
        for (int i = 0; i < data.length; i++) {
            for (int j = 0; j < data[i].length; j++) {
              data[i][j] = tempArr[index];
              index++;
            }
        }


        //遍历二维数组
        for (int i = 0; i < data.length; i++) {
            for (int j = 0; j < data[i].length; j++) {
                System.out.print(data[i][j] + " ");
            }
            System.out.println();
        }
    	}
		}
		
        
            
		import javax.swing.*;
		import java.awt.event.ActionEvent;
		import java.awt.event.ActionListener;

		public class Test3 {
    	public static void main(String[] args) {
        JFrame jFrame = new JFrame();
        //设置界面的宽高
        jFrame.setSize(603, 680);
        //设置界面的标题
        jFrame.setTitle("事件演示");
        //设置界面置顶
        jFrame.setAlwaysOnTop(true);
        //设置界面居中
        jFrame.setLocationRelativeTo(null);
        //设置关闭模式
        jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //取消默认的居中放置,只有取消了才会按照XY轴的形式添加组件
        jFrame.setLayout(null);


        //创建一个按钮对象
        JButton jtb = new JButton("点我啊");
        //设置位置和宽高
        jtb.setBounds(0,0,100,50);
        //给按钮添加动作监听
        //jtb:组件对象,表示你要给哪个组件添加事件
        //addActionListener:表示我要给组件添加哪个事件监听(动作监听包含鼠标左键点击,空格)
        //参数:表示事件被触发之后要执行的代码
        //jtb.addActionListener(new MyActionListener());

        jtb.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("达咩~不要点我哟~");
            }
        });


        //把按钮添加到界面当中
        jFrame.getContentPane().add(jtb);


        jFrame.setVisible(true);
    	}
		}
		
        
            
		public class Test4 {
    	public static void main(String[] args) {
        new MyJFrame3();
    	}
		}
		
        
            
		import javax.swing.*;
		import javax.swing.border.BevelBorder;
		import java.awt.event.ActionEvent;
		import java.awt.event.ActionListener;
		import java.awt.event.KeyEvent;
		import java.awt.event.KeyListener;
		import java.util.Arrays;
		import java.util.Random;

		public class GameJFrame extends JFrame implements KeyListener,ActionListener{
		//JFrame 界面,窗体
		//子类呢?也表示界面,窗体
		//规定:GameJFrame这个界面表示的就是游戏的主界面
		//以后跟游戏相关的所有逻辑都写在这个类中

		//创建一个二维数组
		//目的:用来管理数据
		//加载图片的时候,会根据二维数组中的数据进行加载
		int[][] data = new int[4][4];

		//记录空白方块在二维数组中的位置
		int x = 0;
		int y = 0;

		//定义一个变量,记录当前展示图片的路径
		String path = "puzzlegame\\image\\animal\\animal3\\";





		//定义一个二维数组,存储正确的数据
		int[][] win = {
				{1,2,3,4},
				{5,6,7,8},
				{9,10,11,12},
				{13,14,15,0}
		};

		//定义变量用来统计步数
		int step = 0;


		//创建选项下面的条目对象
		JMenuItem replayItem = new JMenuItem("重新游戏");
		JMenuItem reLoginItem = new JMenuItem("重新登录");
		JMenuItem closeItem = new JMenuItem("关闭游戏");

		JMenuItem accountItem = new JMenuItem("公众号");


		public GameJFrame() {
			//初始化界面
			initJFrame();

			//初始化菜单
			initJMenuBar();


			//初始化数据(打乱)
			initData();

			//初始化图片(根据打乱之后的结果去加载图片)
			initImage();

			//让界面显示出来,建议写在最后
			this.setVisible(true);

		}


		//初始化数据(打乱)
		private void initData() {
			//1.定义一个一维数组
			int[] tempArr = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
			//2.打乱数组中的数据的顺序
			//遍历数组,得到每一个元素,拿着每一个元素跟随机索引上的数据进行交换
			Random r = new Random();
			for (int i = 0; i < tempArr.length; i++) {
				//获取到随机索引
				int index = r.nextInt(tempArr.length);
				//拿着遍历到的每一个数据,跟随机索引上的数据进行交换
				int temp = tempArr[i];
				tempArr[i] = tempArr[index];
				tempArr[index] = temp;
			}

			/*
			*
			*           5   6   8   9
			*           10  11  15  1
			*           4   7   12  13
			*           2   3   0  14
			*
			*           5   6   8   9   10  11  15  1   4   7   12  13  2   3   0   14
			* */

			//4.给二维数组添加数据
			//遍历一维数组tempArr得到每一个元素,把每一个元素依次添加到二维数组当中
			for (int i = 0; i < tempArr.length; i++) {
				if (tempArr[i] == 0) {
					x = i / 4;
					y = i % 4;
				}
				data[i / 4][i % 4] = tempArr[i];
			}
		}

		//初始化图片
		//添加图片的时候,就需要按照二维数组中管理的数据添加图片
		private void initImage() {

			//清空原本已经出现的所有图片
			this.getContentPane().removeAll();

			if (victory()) {
				//显示胜利的图标
				JLabel winJLabel = new JLabel(new ImageIcon("C:\\Users\\moon\\IdeaProjects\\basic-code\\puzzlegame\\image\\win.png"));
				winJLabel.setBounds(203,283,197,73);
				this.getContentPane().add(winJLabel);
			}


			JLabel stepCount = new JLabel("步数:" + step);
			stepCount.setBounds(50,30,100,20);
			this.getContentPane().add(stepCount);


			//路径分为两种:
			//绝对路径:一定是从盘符开始的。C:\  D:\
			//相对路径:不是从盘符开始的
			//相对路径相对当前项目而言的。 aaa\\bbb
			//在当前项目下,去找aaa文件夹,里面再找bbb文件夹。

			//细节:
			//先加载的图片在上方,后加载的图片塞在下面。
			//外循环 --- 把内循环重复执行了4次。
			for (int i = 0; i < 4; i++) {
				//内循环 --- 表示在一行添加4张图片
				for (int j = 0; j < 4; j++) {
					//获取当前要加载图片的序号
					int num = data[i][j];
					//创建一个JLabel的对象(管理容器)
					JLabel jLabel = new JLabel(new ImageIcon(path + num + ".jpg"));
					//指定图片位置
					jLabel.setBounds(105 * j + 83, 105 * i + 134, 105, 105);
					//给图片添加边框
					//0:表示让图片凸起来
					//1:表示让图片凹下去
					jLabel.setBorder(new BevelBorder(BevelBorder.LOWERED));
					//把管理容器添加到界面中
					this.getContentPane().add(jLabel);
				}
			}


			//添加背景图片
			JLabel background = new JLabel(new ImageIcon("puzzlegame\\image\\background.png"));
			background.setBounds(40, 40, 508, 560);
			//把背景图片添加到界面当中
			this.getContentPane().add(background);


			//刷新一下界面
			this.getContentPane().repaint();


		}

		private void initJMenuBar() {
			//创建整个的菜单对象
			JMenuBar jMenuBar = new JMenuBar();
			//创建菜单上面的两个选项的对象 (功能  关于我们)
			JMenu functionJMenu = new JMenu("功能");
			JMenu aboutJMenu = new JMenu("关于我们");



			//将每一个选项下面的条目天极爱到选项当中
			functionJMenu.add(replayItem);
			functionJMenu.add(reLoginItem);
			functionJMenu.add(closeItem);

			aboutJMenu.add(accountItem);

			//给条目绑定事件
			replayItem.addActionListener(this);
			reLoginItem.addActionListener(this);
			closeItem.addActionListener(this);
			accountItem.addActionListener(this);

			//将菜单里面的两个选项添加到菜单当中
			jMenuBar.add(functionJMenu);
			jMenuBar.add(aboutJMenu);




			//给整个界面设置菜单
			this.setJMenuBar(jMenuBar);
		}

		private void initJFrame() {
			//设置界面的宽高
			this.setSize(603, 680);
			//设置界面的标题
			this.setTitle("拼图单机版 v1.0");
			//设置界面置顶
			this.setAlwaysOnTop(true);
			//设置界面居中
			this.setLocationRelativeTo(null);
			//设置关闭模式
			this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
			//取消默认的居中放置,只有取消了才会按照XY轴的形式添加组件
			this.setLayout(null);
			//给整个界面添加键盘监听事件
			this.addKeyListener(this);

		}

		@Override
		public void keyTyped(KeyEvent e) {

		}

		//按下不松时会调用这个方法
		@Override
		public void keyPressed(KeyEvent e) {
			int code = e.getKeyCode();
			if (code == 65){
				//把界面中所有的图片全部删除
				this.getContentPane().removeAll();
				//加载第一张完整的图片
				JLabel all = new JLabel(new ImageIcon(path + "all.jpg"));
				all.setBounds(83,134,420,420);
				this.getContentPane().add(all);
				//加载背景图片
				//添加背景图片
				JLabel background = new JLabel(new ImageIcon("puzzlegame\\image\\background.png"));
				background.setBounds(40, 40, 508, 560);
				//把背景图片添加到界面当中
				this.getContentPane().add(background);
				//刷新界面
				this.getContentPane().repaint();


			}
		}

		//松开按键的时候会调用这个方法
		@Override
		public void keyReleased(KeyEvent e) {
			//判断游戏是否胜利,如果胜利,此方法需要直接结束,不能再执行下面的移动代码了
			if(victory()){
				//结束方法
				return;
			}
			//对上,下,左,右进行判断
			//左:37 上:38 右:39 下:40
			int code = e.getKeyCode();
			System.out.println(code);
			if (code == 37) {
				System.out.println("向左移动");
				if(y == 3){
					return;
				}
				//逻辑:
				//把空白方块右方的数字往左移动
				data[x][y] = data[x][y + 1];
				data[x][y + 1] = 0;
				y++;
				//每移动一次,计数器就自增一次。
				step++;
				//调用方法按照最新的数字加载图片
				initImage();

			} else if (code == 38) {
				System.out.println("向上移动");
				if(x == 3){
					//表示空白方块已经在最下方了,他的下面没有图片再能移动了
					return;
				}
				//逻辑:
				//把空白方块下方的数字往上移动
				//x,y  表示空白方块
				//x + 1, y 表示空白方块下方的数字
				//把空白方块下方的数字赋值给空白方块
				data[x][y] = data[x + 1][y];
				data[x + 1][y] = 0;
				x++;
				//每移动一次,计数器就自增一次。
				step++;
				//调用方法按照最新的数字加载图片
				initImage();
			} else if (code == 39) {
				System.out.println("向右移动");
				if(y == 0){
					return;
				}
				//逻辑:
				//把空白方块左方的数字往右移动
				data[x][y] = data[x][y - 1];
				data[x][y - 1] = 0;
				y--;
				//每移动一次,计数器就自增一次。
				step++;
				//调用方法按照最新的数字加载图片
				initImage();
			} else if (code == 40) {
				System.out.println("向下移动");
				if(x == 0){
					return;
				}
				//逻辑:
				//把空白方块上方的数字往下移动
				data[x][y] = data[x - 1][y];
				data[x - 1][y] = 0;
				x--;
				//每移动一次,计数器就自增一次。
				step++;
				//调用方法按照最新的数字加载图片
				initImage();
			}else if(code == 65){
				initImage();
			}else if(code == 87){
				data = new int[][]{
						{1,2,3,4},
						{5,6,7,8},
						{9,10,11,12},
						{13,14,15,0}
				};
				initImage();
			}
		}


		//判断data数组中的数据是否跟win数组中相同
		//如果全部相同,返回true。否则返回false
		public boolean victory(){
			for (int i = 0; i < data.length; i++) {
				//i : 依次表示二维数组 data里面的索引
				//data[i]:依次表示每一个一维数组
				for (int j = 0; j < data[i].length; j++) {
					if(data[i][j] != win[i][j]){
						//只要有一个数据不一样,则返回false
						return false;
					}
				}
			}
			//循环结束表示数组遍历比较完毕,全都一样返回true
			return true;
		}

		@Override
		public void actionPerformed(ActionEvent e) {
			//获取当前被点击的条目对象
			Object obj = e.getSource();
			//判断
			if(obj == replayItem){
				System.out.println("重新游戏");
				//计步器清零
				step = 0;
				//再次打乱二维数组中的数据
				initData();
				//重新加载图片
				initImage();
			}else if(obj == reLoginItem){
				System.out.println("重新登录");
				//关闭当前的游戏界面
				this.setVisible(false);
				//打开登录界面
				new LoginJFrame();
			}else if(obj == closeItem){
				System.out.println("关闭游戏");
				//直接关闭虚拟机即可
				System.exit(0);
			}else if(obj == accountItem){
				System.out.println("公众号");

				//创建一个弹框对象
				JDialog jDialog = new JDialog();
				//创建一个管理图片的容器对象JLabel
				JLabel jLabel = new JLabel(new ImageIcon("puzzlegame\\image\\about.png"));
				//设置位置和宽高
				jLabel.setBounds(0,0,258,258);
				//把图片添加到弹框当中
				jDialog.getContentPane().add(jLabel);
				//给弹框设置大小
				jDialog.setSize(344,344);
				//让弹框置顶
				jDialog.setAlwaysOnTop(true);
				//让弹框居中
				jDialog.setLocationRelativeTo(null);
				//弹框不关闭则无法操作下面的界面
				jDialog.setModal(true);
				//让弹框显示出来
				jDialog.setVisible(true);
			}
			}
			}
		
        
            
		import com.itheima.domain.User;
	import com.itheima.util.CodeUtil;

	import javax.swing.*;
	import java.awt.event.MouseEvent;
	import java.awt.event.MouseListener;
	import java.io.BufferedReader;
	import java.io.File;
	import java.io.FileReader;
	import java.util.ArrayList;

	public class LoginJFrame extends JFrame implements MouseListener {

		static ArrayList allUsers = new ArrayList<>();
		static {
			allUsers.add(new User("zhangsan","123"));
			allUsers.add(new User("lisi","1234"));
		}


		JButton login = new JButton();
		JButton register = new JButton();

		JTextField username = new JTextField();
		//JTextField password = new JTextField();
		JPasswordField password = new JPasswordField();
		JTextField code = new JTextField();

		//正确的验证码
		JLabel rightCode = new JLabel();


		public LoginJFrame() {
			//初始化界面
			initJFrame();

			//在这个界面中添加内容
			initView();


			//让当前界面显示出来
			this.setVisible(true);
		}

		public void initView() {
			//1. 添加用户名文字
			JLabel usernameText = new JLabel(new ImageIcon("puzzlegame\\image\\login\\用户名.png"));
			usernameText.setBounds(116, 135, 47, 17);
			this.getContentPane().add(usernameText);

			//2.添加用户名输入框

			username.setBounds(195, 134, 200, 30);
			this.getContentPane().add(username);

			//3.添加密码文字
			JLabel passwordText = new JLabel(new ImageIcon("puzzlegame\\image\\login\\密码.png"));
			passwordText.setBounds(130, 195, 32, 16);
			this.getContentPane().add(passwordText);

			//4.密码输入框
			password.setBounds(195, 195, 200, 30);
			this.getContentPane().add(password);


			//验证码提示
			JLabel codeText = new JLabel(new ImageIcon("puzzlegame\\image\\login\\验证码.png"));
			codeText.setBounds(133, 256, 50, 30);
			this.getContentPane().add(codeText);

			//验证码的输入框
			code.setBounds(195, 256, 100, 30);
			this.getContentPane().add(code);


			String codeStr = CodeUtil.getCode();
			//设置内容
			rightCode.setText(codeStr);
			//绑定鼠标事件
			rightCode.addMouseListener(this);
			//位置和宽高
			rightCode.setBounds(300, 256, 50, 30);
			//添加到界面
			this.getContentPane().add(rightCode);

			//5.添加登录按钮
			login.setBounds(123, 310, 128, 47);
			login.setIcon(new ImageIcon("puzzlegame\\image\\login\\登录按钮.png"));
			//去除按钮的边框
			login.setBorderPainted(false);
			//去除按钮的背景
			login.setContentAreaFilled(false);
			//给登录按钮绑定鼠标事件
			login.addMouseListener(this);
			this.getContentPane().add(login);

			//6.添加注册按钮
			register.setBounds(256, 310, 128, 47);
			register.setIcon(new ImageIcon("puzzlegame\\image\\login\\注册按钮.png"));
			//去除按钮的边框
			register.setBorderPainted(false);
			//去除按钮的背景
			register.setContentAreaFilled(false);
			//给注册按钮绑定鼠标事件
			register.addMouseListener(this);
			this.getContentPane().add(register);


			//7.添加背景图片
			JLabel background = new JLabel(new ImageIcon("puzzlegame\\image\\login\\background.png"));
			background.setBounds(0, 0, 470, 390);
			this.getContentPane().add(background);

		}


		public void initJFrame() {
			this.setSize(488, 430);//设置宽高
			this.setTitle("拼图游戏 V1.0登录");//设置标题
			this.setDefaultCloseOperation(3);//设置关闭模式
			this.setLocationRelativeTo(null);//居中
			this.setAlwaysOnTop(true);//置顶
			this.setLayout(null);//取消内部默认布局
		}



		//点击
		@Override
		public void mouseClicked(MouseEvent e) {
			if (e.getSource() == login) {
				System.out.println("点击了登录按钮");
				//获取两个文本输入框中的内容
				String usernameInput = username.getText();
				String passwordInput = password.getText();
				//获取用户输入的验证码
				String codeInput = code.getText();

				//创建一个User对象
				User userInfo = new User(usernameInput, passwordInput);
				System.out.println("用户输入的用户名为" + usernameInput);
				System.out.println("用户输入的密码为" + passwordInput);

				if (codeInput.length() == 0) {
					showJDialog("验证码不能为空");
				} else if (usernameInput.length() == 0 || passwordInput.length() == 0) {
					//校验用户名和密码是否为空
					System.out.println("用户名或者密码为空");

					//调用showJDialog方法并展示弹框
					showJDialog("用户名或者密码为空");


				} else if (!codeInput.equalsIgnoreCase(rightCode.getText())) {
					showJDialog("验证码输入错误");
				} else if (contains(userInfo)) {
					System.out.println("用户名和密码正确可以开始玩游戏了");
					//关闭当前登录界面
					this.setVisible(false);
					//打开游戏的主界面
					//需要把当前登录的用户名传递给游戏界面
					new GameJFrame();
				} else {
					System.out.println("用户名或密码错误");
					showJDialog("用户名或密码错误");
				}
			} else if (e.getSource() == register) {
				System.out.println("点击了注册按钮");
			} else if (e.getSource() == rightCode) {
				System.out.println("更换验证码");
				//获取一个新的验证码
				String code = CodeUtil.getCode();
				rightCode.setText(code);
			}
		}


		public void showJDialog(String content) {
			//创建一个弹框对象
			JDialog jDialog = new JDialog();
			//给弹框设置大小
			jDialog.setSize(200, 150);
			//让弹框置顶
			jDialog.setAlwaysOnTop(true);
			//让弹框居中
			jDialog.setLocationRelativeTo(null);
			//弹框不关闭永远无法操作下面的界面
			jDialog.setModal(true);

			//创建Jlabel对象管理文字并添加到弹框当中
			JLabel warning = new JLabel(content);
			warning.setBounds(0, 0, 200, 150);
			jDialog.getContentPane().add(warning);

			//让弹框展示出来
			jDialog.setVisible(true);
		}

		//按下不松
		@Override
		public void mousePressed(MouseEvent e) {
			if (e.getSource() == login) {
				login.setIcon(new ImageIcon("puzzlegame\\image\\login\\登录按下.png"));
			} else if (e.getSource() == register) {
				register.setIcon(new ImageIcon("puzzlegame\\image\\login\\注册按下.png"));
			}
		}


		//松开按钮
		@Override
		public void mouseReleased(MouseEvent e) {
			if (e.getSource() == login) {
				login.setIcon(new ImageIcon("jigsawgame\\image\\login\\登录按钮.png"));
			} else if (e.getSource() == register) {
				register.setIcon(new ImageIcon("jigsawgame\\image\\login\\注册按钮.png"));
			}
		}

		//鼠标划入
		@Override
		public void mouseEntered(MouseEvent e) {

		}

		//鼠标划出
		@Override
		public void mouseExited(MouseEvent e) {

		}

		//判断用户在集合中是否存在
		public boolean contains(User userInput){
			for (int i = 0; i < allUsers.size(); i++) {
				User rightUser = allUsers.get(i);
				if(userInput.getUsername().equals(rightUser.getUsername()) && userInput.getPassword().equals(rightUser.getPassword())){
					//有相同的代表存在,返回true,后面的不需要再比了
					return true;
				}
			}
			//循环结束之后还没有找到就表示不存在
			return false;
		}


		}

		
        
            
		import javax.swing.*;

		public class RegisterJFrame extends JFrame {
		//跟注册相关的代码,都写在这个界面中
		public RegisterJFrame(){
        this.setSize(488,500);
        //设置界面的标题
        this.setTitle("拼图 注册");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置关闭模式
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //让显示显示出来,建议写在最后
        this.setVisible(true);


        getContentPane();
    	}
		}
		
        
            
		import java.util.ArrayList;
		import java.util.Random;

		public class CodeUtil {

    	public static String getCode(){
        //1.创建一个集合
        ArrayList list = new ArrayList<>();//52  索引的范围:0 ~ 51
        //2.添加字母 a - z  A - Z
        for (int i = 0; i < 26; i++) {
            list.add((char)('a' + i));//a - z
            list.add((char)('A' + i));//A - Z
        }
        //3.打印集合
        //System.out.println(list);
        //4.生成4个随机字母
        String result = "";
        Random r = new Random();
        for (int i = 0; i < 4; i++) {
            //获取随机索引
            int randomIndex = r.nextInt(list.size());
            char c = list.get(randomIndex);
            result = result + c;
        }
        //System.out.println(result);//长度为4的随机字符串

        //5.在后面拼接数字 0~9
        int number = r.nextInt(10);
        //6.把随机数字拼接到result的后面
        result = result + number;
        //System.out.println(result);//ABCD5
        //7.把字符串变成字符数组
        char[] chars = result.toCharArray();//[A,B,C,D,5]
        //8.在字符数组中生成一个随机索引
        int index = r.nextInt(chars.length);
        //9.拿着4索引上的数字,跟随机索引上的数字进行交换
        char temp = chars[4];
        chars[4] = chars[index];
        chars[index] = temp;
        //10.把字符数组再变回字符串
        String code = new String(chars);
        //System.out.println(code);
        return code;
    	}
		}
		
        
单词