java实现拼图小游戏

效果演示

java-拼图游戏效果演示

 

分为三个内容

1.游戏的功能主要实现以及玩法

2.游戏登录界面的设计

3.随机验证码的生成

游戏中的素材的话,我放到网盘了,需要的自取

不过我只调整了一张图片,其他的都是随便切上去的效果差,可以自己找大小相同的图片来当素材比较好。

链接:http://链接:https://pan.baidu.com/s/17QHL37utPN_7WNd-azGT3A?pwd=ax33 提取码:ax33

视频讲解学习链接http://【黑马程序员Java零基础视频教程_上部(Java入门,含斯坦福大学练习题+力扣算法题和大厂java面试题)】https://www.bilibili.com/video/BV17F411T7Ao?p=144&vd_source=7887313c05d6f22c58992cbafe1bb695

目录

1.游戏的主界面

实现大概业务

代码实现

2.登录界面的实现

大概实现的逻辑思路

代码实现

 3.验证码的生成

4.测试

总结

1.游戏的主界面

实现大概业务

1.创建游戏的主界面 
   逻辑
    JavaBean类描述界面的
    属性(宽、高) 以及行为、成员
    上下移动的代码逻辑
    统计步数的代码逻辑
    一键通关
    查看最终效果
   恶搞好友

如果要具体学习可以看这个视频:

代码实现

public class GameJFrame extends JFrame implements KeyListener, ActionListener {


    int[][] arrs = new int[3][3];//作为全局更好的使用,打乱需要,然后初始化数据也要,后面判断是否拼图成功也要
    //记录0即空白图片的索引
    int xx = 0;
    int yy = 0;

    //胜利数组
    int[][] win = new int[][]{
            {1,2,3},
            {4,5,6},
            {7,8,0}
    };

    //优化路径,变换容易改,为后面的更换图片使用
    String path = "image\\animal1\\";

    //记录步数
    int count = 0;

    //作为成员,方便鼠标事件
    //创建选项下面的条目对象
    JMenuItem replayItem = new JMenuItem("重新游戏");
    JMenuItem reLoginItem = new JMenuItem("重新登录");
    JMenuItem clooseItem = new JMenuItem("关闭游戏");

    JMenuItem accountItem = new JMenuItem("作者微信");
    JMenuItem accountItem02 = new JMenuItem("打伤作者");

    //添加更换图片
    JMenuItem  gh = new JMenuItem("美女");
    JMenuItem  gh2 = new JMenuItem("动物");
    JMenuItem  gh3 = new JMenuItem("运动");

    //



    //用构造方法每次进行创建窗口
    public GameJFrame() {
        super("拼图小游戏");
        //窗口初始化
        inistJMenuBar();
        //菜单初始化
        initJMenuBar();

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

        initImage();

        //放到最后
        this.setVisible(true);//让其显示窗口
    }

    private void initData() {
        //打乱顺序
        int[] arr = new int[]{0, 1, 2, 3, 4, 5, 6, 7, 8};//0虽然没有,但是他会是空的,拼图需要空的位置
        //2.打乱数组中的数据顺序
        //遍历数组,得到每一个元素,拿着每一个元素跟随机索引上的数组进行交换
        Random random = new Random();
        for (int i = 0; i < arr.length; i++) {
            //获得随机索引
            int index = random.nextInt(arr.length);//限制随机数的范围,虽然会重复但是没啥影响,打乱就行
            //随机交换
            int temp = arr[i];
            arr[i] = arr[index];
            arr[index] = temp;

        }

        System.out.println();

        //3.分组放到二维数组里面

        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == 0){//如果遇到0 记录一下他在二维数组里面的索引
                xx = i / 3;
                yy = i % 3;

            }//不用else,防止漏了0
            arrs[i / 3][i % 3] = arr[i];//每组3个
        }



    }

    private void initImage() {

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

        //判断是否胜利
        if(victory()){
            //胜利把空白坐标置为2,2
            xx = 2;
            yy = 2;
            //显示胜利图标
            JLabel win = new JLabel(new ImageIcon(path+"win.png"));
            win.setBounds(720,150,264,122);
            //放到界面
            this.getContentPane().add(win);
            showJDialog("恭喜大佬成功通关");
        }

        //可以写一个计时器

        //显示步数
        //????怎么设置字体大小呢,字好小
        JLabel countshop = new JLabel("步数: " + count);
        //设置大小位置
        countshop.setBounds(70,350,200,100);
        this.getContentPane().add(countshop);

        //说明一下快捷键
        JLabel kd3 = new JLabel(" 快捷玩法  " );
        //设置大小位置
        kd3.setBounds(10,40,200,100);
        this.getContentPane().add(kd3);

        //说明一下快捷键
        JLabel kd = new JLabel(" 按住a不松可查看完整图片  " );
        //设置大小位置
        kd.setBounds(10,60,200,100);
        this.getContentPane().add(kd);

        JLabel kd2 = new JLabel(" 按w可一键通关 ");
        //设置大小位置
        kd2.setBounds(10,80,200,100);
        this.getContentPane().add(kd2);





        //创建ImageIcon的对象
        //ImageIcon icon = new ImageIcon("C:\\java\\javam\\ax-java\\20240508\\image\\animal1\\" + "01"+".png");

        //创建一个JLabel的对象(管理容器)
        //JLabel jlabel1 = new JLabel(icon);

        //给添加的图片进行位置管理,第一张放在左上角,设置了还是不行,因为布局容器默认居中
        //jlabel1.setBounds(0,0,320,195);

       /* int x = 135;
        int y = 135;*/

        int x = 300;
        int y = 190;

        /*
       路径分为2种
       绝对路径:一定是从盘符开始的 c:
       相对路径:不是从盘符开始
       相对路径相对当前项目而言
       在当前项目路径基础上找该文件
         */

        JLabel jlabel = null;
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {

                // ImageIcon icon = new ImageIcon("C:\\java\\javam\\ax-java\\20240508\\image\\animal1\\" + "0" + arrs[i][j] + ".png");
                //相对路径,取项目前路径即可
                int tem = arrs[i][j];
                //ImageIcon icon = new ImageIcon("image\\animal1\\" + "0" + tem  + ".png");//
                ImageIcon icon = new ImageIcon(path + "0" + tem  + ".png");
                jlabel = new JLabel(icon);
                //调整位移
                //jlabel.setBounds(x * j , y * i, x , y);
                jlabel.setBounds(x * j+ 400 , y * i+ 140, x , y);
                //给图片增加边框
                /*
                0表示图片凸显
                1表示图片凹进去
                 */
                jlabel.setBorder(new BevelBorder(0));
                //jlabel.setBorder(new BevelBorder(BevelBorder.LOWERED));
                //jlabel.setBorder(new BevelBorder(1));
                //把管理容器添加到界面中
                this.getContentPane().add(jlabel);


            }


        }

        //将管理容器放到界面中去
        //this.getContentPane().add(jlabel);
        //this.add(jlabel);

        //添加背景图片放在后面
        //先加载的图片在上方
        //创建背景添加
        JLabel back = new JLabel(new ImageIcon(path+"bj03.png"));
        //放位置
        back.setBounds(215,10,1303,790); //宽度和高度按照图片大小来写*/
        this.getContentPane().add(back);



        //刷新图片加载
        this.getContentPane().repaint();
    }


    private void initJMenuBar() {
        //创建菜单
        JMenuBar jmenuBar = new JMenuBar();

        //创建菜单上面的两个选项的对象(功能 关于作者)
        JMenu functionJMenu = new JMenu("功能");
        JMenu aboutJMenu = new JMenu("关于作者");
        JMenu  print  = new JMenu("更换图片");



        //JMenuItem m = new JMenuItem("关闭");

        //给菜单条目对象都绑定点击事件
        replayItem.addActionListener(this);//this就是执行该接口的方法
        reLoginItem.addActionListener(this);
        clooseItem.addActionListener(this);
        accountItem.addActionListener(this);
        accountItem02.addActionListener(this);
        //给更换图片的增添事件
        gh.addActionListener(this);
        gh2.addActionListener(this);
        gh3.addActionListener(this);


        //放到功能下面菜单栏
        functionJMenu.add(replayItem);
        functionJMenu.add(reLoginItem);
        functionJMenu.add(clooseItem);

        //将更换图片的下一节放到更换里面
        print.add(gh);
        print.add(gh2);
        print.add(gh3);

        //放更换图片
        functionJMenu.add(print);





        //放到关于作者下面菜单栏
        aboutJMenu.add(accountItem);
        aboutJMenu.add(accountItem02);



        //replayItem.add(m);

        //将菜单里面的两个选项放到菜单中
        jmenuBar.add(functionJMenu);
        jmenuBar.add(aboutJMenu);

        //放完之后将界面设置
        this.setJMenuBar(jmenuBar);
    }

    public void inistJMenuBar() {
        this.setSize(1650, 980);//设置窗口的大小
        //设置窗口置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置关闭模式
        //两个写法都行
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        // this.setDefaultCloseOperation(3);

        //取消默认的居中位置,只有取消了才会安装xy皱的形式添加组件
        this.setLayout(null);

        //给整个界面添加键盘监听事件
        this.addKeyListener(this);

    }

    //键盘监听
    @Override
    public void keyTyped(KeyEvent e) {

    }


    @Override
    public void keyPressed(KeyEvent e) {
        //如果已经胜利不能再进行操作
        if (victory()){
            return ;
        }

        //按住a不松显示完整图片
        int code = e.getKeyCode();
        if (code == 65){
            //先清空前面的图片
            this.getContentPane().removeAll();
            //加载图片进来
            JLabel all = new JLabel(new ImageIcon(path+"alls.png"));
            //设置图片大小位置
            all.setBounds(550,200,635,401);
            //将图片加载到界面中
            this.getContentPane().add(all);

            //加载背景图片
            JLabel back = new JLabel(new ImageIcon(path+"bj03.png"));
            //放位置
            back.setBounds(215,10,1303,790); //宽度和高度按照图片大小来写*/
            this.getContentPane().add(back);


            //刷新图片加载
            this.getContentPane().repaint();


        }

    }


    //键盘松开
    @Override
    public void keyReleased(KeyEvent e) {
        //如果已经胜利不能再进行操作
        if (victory()){
            return ;
        }



        //对上下左右按键进行监听
        int code = e.getKeyCode();
        if (code == 37){

            if (yy == 2){//最左边时候不能移动了
                return;
            }
            System.out.println("左");
            arrs[xx][yy] = arrs[xx ][yy+ 1];
            arrs[xx ][yy +1] = 0;//然后置0,让空白方块值始终为0
            yy ++;//空白的位置发生改变
            //每次移动步数都加1
            count++;
            //调用方法按照最新的数组加载图片
            initImage();

        }else if (code == 38){

            if (xx == 2){
                return;
            }
            System.out.println("上");
            /*
            把空白方块下面的数字往上移动
            x,y表示空白方块
            x + 1 ,y不变 表示空白下面的数字索引
             */
            //把空白方块下方的数字赋值给空白方块
            arrs[xx][yy] = arrs[xx + 1][yy];
            arrs[xx + 1][yy] = 0;//然后置0,让空白方块值始终为0
            xx ++;//空白的位置发生改变
            //每次移动步数都加1
            count++;
            //调用方法按照最新的数组加载图片
            initImage();

            //但这样写当空白在低层时候,下方没有图片了,还按上移动会异常。

        }else if (code == 39){

            if (yy == 0){
                return;
            }
            System.out.println("右");
            arrs[xx][yy] = arrs[xx ][yy- 1];
            arrs[xx ][yy - 1] = 0;//然后置0,让空白方块值始终为0
            yy --;//空白的位置发生改变
            //每次移动步数都加1
            count++;
            //调用方法按照最新的数组加载图片
            initImage();

        }else if (code == 40){

            if (xx == 0){
                return;
            }
            System.out.println("下");
            //把空白方块下方的数字赋值给空白方块
            arrs[xx][yy] = arrs[xx - 1][yy];
            arrs[xx - 1][yy] = 0;//然后置0,让空白方块值始终为0
            xx --;//空白的位置发生改变
            //每次移动步数都加1
            count++;
            //调用方法按照最新的数组加载图片
            initImage();
        }
        //松开后变回去
        else if (code == 65){
            initImage();
        }
        //作弊器实现
        else if (code == 87){
            //直接让其顺序变回来
            arrs = new int[][]{
                    {1,2,3},
                    {4,5,6},
                    {7,8,0}
            };
            //再进行拼接
            initImage();


        }


    }


    //判断数组数据是否跟win数组中相同
    //如果全部相同返回true,否则返回false
    public boolean victory(){
        //依次对比
        for (int i = 0; i < arrs.length; i++) {
            for (int i1 = 0; i1 < arrs[i].length; i1++) {
                if (arrs[i] [i1] != win[i][i1]){
                    //只要有一个不同就返回
                    return false;
                }
            }

        }
        //循环结束说明比较完成
        return true;
    }




    //鼠标点击或者空格触发
    @Override
    public void actionPerformed(ActionEvent e) {
        //获取当前被点击的条目对象
        Object object  = e.getSource();

        if (object == replayItem){
            //重新游戏
            System.out.println("重新游戏");
            //2.打乱
            initData();
            //计数器清0
            count = 0;
            //3.加载图片
            initImage();

        }else if (object == reLoginItem){
            System.out.println("重新登录");
            //关闭游戏界面
            //打开登陆界面
            this.setVisible(false);
            new LonginJFrame();//登录界面


        }else if (object == clooseItem){
            System.out.println("关闭游戏");
            System.exit(0);
        }else if (object == accountItem){
            System.out.println("作者微信");
            /*JFrame jFrame = new JFrame("作者微信");
            //设置界面的宽高
            jFrame.setSize(635,866);
            jFrame.setAlwaysOnTop(true);//设置窗口界面置顶
            jFrame.setLocationRelativeTo(null);//设置界面剧中

            //放入微信图片
            JLabel wx = new JLabel(new ImageIcon(path+"微信.jpg"));
            //设置大小
            wx.setBounds(0,0,634,866);
            //放到界面中
            jFrame.add(wx);
            jFrame.setLayout(null);// 取消默认放置按钮啥的
            jFrame.setVisible(true);*/


            //创建弹框对象
            JDialog jDialog = new JDialog();
            JLabel jLabel = new JLabel(new ImageIcon(path+"微信.jpg"));
            jLabel.setBounds(0,0,634,866);

            //图片添加到弹框中
            jDialog.getContentPane().add(jLabel);
            jDialog.setSize(634,866);//弹框大小
            //弹框置顶
            jDialog.setAlwaysOnTop(true);
            //居中
            jDialog.setLocationRelativeTo(null);
            //弹框不关闭无法操作
            jDialog.setModal(true);
            //弹框显示出来哦
            jDialog.setVisible(true);


        }else if (object == accountItem02){
            //作者收款码
            JFrame jFrame = new JFrame("打伤作者");
            //设置界面的宽高
            jFrame.setSize(745,1014);
            jFrame.setAlwaysOnTop(true);//设置窗口界面置顶
            jFrame.setLocationRelativeTo(null);//设置界面剧中

            //放入微信图片
            JLabel skm = new JLabel(new ImageIcon(path+"收款码.jpg"));
            //设置大小
            skm.setBounds(0,0,745,1014);
            //放到界面中
            jFrame.add(skm);
            jFrame.setLayout(null);// 取消默认放置按钮啥的
            jFrame.setVisible(true);
        }//给更换图片增加鼠标点击
        else if (object == gh){
            System.out.println("美女");
            //=更新步数
            count = 0;

            //设置个随机随机抽取图片
            Random random = new Random();
            int ran = random.nextInt(2);//[)
            path = "image\\美女\\"+ran + "\\";//美女文件夹
            initData();
            initImage();



            //空白方块出了问题,原因就是没有02图片,把02当做空白图片了,搞乱了


        } else if (object == gh2){
            System.out.println("动物");
            //=更新步数
            count = 0;
            //设置个随机随机抽取图片
            Random random = new Random();
            int ran = random.nextInt(2);//[)
            path = "image\\动物\\"+ran + "\\";//美女文件夹
            initData();
            initImage();


        }else if (object == gh3){
            System.out.println("运动");
            //=更新步数
            count = 0;

            //设置个随机随机抽取图片
            Random random = new Random();
            int ran = random.nextInt(2);//[)
            path = "image\\运动\\"+ran + "\\";//美女文件夹
            initData();
            initImage();

        }

        //重新开始
        //绑定点击事件,重新打乱二维数组数字,加载乱的图片,计时器清0


    }

    //胜利给个提示
    public void showJDialog(String content){
        //创建弹框对象
        JDialog jDialog = new JDialog();
        //弹框大小
        jDialog.setSize(200,150);
        //弹框置顶
        jDialog.setAlwaysOnTop(true);
        //弹框居中
        jDialog.setLocationRelativeTo(null);
        //弹框不关无法操作
        jDialog.setModal(true);


        //this.setLayout(new FlowLayout());//设置窗口布局
        //创建Jlabel对象管理文字添加到弹框中去
        JLabel warning = new JLabel(content);
        warning.setBounds(20,10,200,150);
        jDialog.getContentPane().add(warning);

        //弹框显示
        jDialog.setVisible(true);

    }


}

2.登录界面的实现

大概实现的逻辑思路

1.提前设置好用户名和密码

2.验证码的生成

3.实现点击登录后能判断密码和用户名的正确与否

代码实现

public class LonginJFrame extends JFrame implements MouseListener {

    Yzm yzmy = new Yzm();


//用集合来设置一下密码和用户名,注册的话要用到数据库,目前写不了
    static ArrayList<Uset> list = new ArrayList<>();
    //泛型弄一个对象类型
    static {//这个静态内部类什么意思,应该就是能够直接调用
        list.add(new Uset("zhangsan","520"));
        list.add(new Uset("ax","1314"));

    }

    JButton login = new JButton();//点击按钮放到成员,方便判断
    JButton register = new JButton();


    //方便获取用户名和密码、验证码放在成员
    JTextField username = new JFormattedTextField();
    JPasswordField password = new JPasswordField();//密码框隐藏***
    JTextField code  = new JTextField();

    public LonginJFrame() {
        initJFrame();

        //对界面进行美化
        initView();

        this.setVisible(true);
    }

    private void initView() {

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

        new Yzm().Main();
        //添加用户名
        JLabel usernameText = new JLabel(new ImageIcon("image\\animal1\\yhm.png"));
        usernameText.setBounds(95,90,70,38);
        this.getContentPane().add(usernameText);

        //2.添加用户名文字文本输入框

        username.setBounds(180,90,200,30);
        this.getContentPane().add(username);

        //3.添加密码
        JLabel passwordText = new JLabel(new ImageIcon("image\\animal1\\mima.png"));
       passwordText.setBounds(95,140,70,38);
        this.getContentPane().add(passwordText);

        //4.添加密码文本输入框

        password.setBounds(180,140,200,30);
        this.getContentPane().add(password);

        //5.添加验证码
        JLabel codeText = new JLabel(new ImageIcon("image\\animal1\\yzm.png"));
        codeText.setBounds(95,195,70,38);
        this.getContentPane().add(codeText);

        //6.添加验证码文本输入框
        code.setBounds(180,195,80,30);
        this.getContentPane().add(code);

        //7.添加随机的验证码,要写一个生成验证码的类,暂时不会
        //随机的验证码也是个图片
        JLabel codes = new JLabel(new ImageIcon("image\\animal1\\666.png"));
        codes.setBounds(220,160,200,100);
        this.getContentPane().add(codes);

        //8.添加登录按钮
        /*JLabel login = new JLabel(new ImageIcon("image\\animal1\\dl.png"));
        login.setBounds(95,250,127,52);
        this.getContentPane().add(login);*/

        //用按钮控件来,按键才有鼠标或者键盘的事件应该是

        login.setBounds(95,250,127,52);
        login.setIcon(new ImageIcon("image\\animal1\\dl.png"));
        //去除按钮的边框
        login.setBorderPainted(false);
        //去除按钮的背景
        login.setContentAreaFilled(false);
        this.getContentPane().add(login);
        //给登录按钮设置鼠标事件
        this.getContentPane().add(login);
        login.addMouseListener(this);



       //8.添加注册按钮
        //JButton register = new JButton();
        register.setBounds(280,250,135,45);
        register.setIcon(new ImageIcon("image\\animal1\\zc.png"));
        //去除按钮的边框
        register.setBorderPainted(false);
        //去除按钮的背景
        register.setContentAreaFilled(false);
        this.getContentPane().add(register);
        //给注册按钮设置鼠标事件
        register.addMouseListener(this);


        //9.添加背景
        JLabel  background = new JLabel(new ImageIcon("image\\animal1\\bj04.png"));
        background.setBounds(0,0,509,520);
        this.getContentPane().add(background);

    }

    private void initJFrame() {
        //设置宽高
        this.setSize(509,480);
        //设置标题
        this.setTitle("登录窗口");
        this.setDefaultCloseOperation(3);//关闭模式
        this.setLocationRelativeTo(null);//居中
        this.setAlwaysOnTop(true);//置顶
        this.setLayout(null);//取消默认布局


    }

    //写一个点击登录后判定结果的方法
    public void showJDialog(String content){
        //创建弹框对象
        JDialog jDialog = new JDialog();
        //弹框大小
        jDialog.setSize(200,150);
        //弹框置顶
        jDialog.setAlwaysOnTop(true);
        //弹框居中
        jDialog.setLocationRelativeTo(null);
        //弹框不关无法操作
        jDialog.setModal(true);


        //this.setLayout(new FlowLayout());//设置窗口布局
        //创建Jlabel对象管理文字添加到弹框中去
        JLabel warning = new JLabel(content);
        warning.setBounds(20,10,200,150);
        jDialog.getContentPane().add(warning);

        //弹框显示
        jDialog.setVisible(true);

    }

    //单击
    @Override
    public void mouseClicked(MouseEvent e) {

    }
    //按下不松
    //按下不松切换登录按钮的背景图片
    @Override
    public void mousePressed(MouseEvent e) {
        Object ob = e.getSource();
        if (ob == login){
            System.out.println("登录");
            //怎么实现按下不松时候修改背景颜色
            //login.setIcon(new ImageIcon(""));
            login.setIcon(new ImageIcon("image\\animal1\\dl.png"));
        }

    }
    //松开
    //先获取用户的用户名
    //然后判断啥的
    @Override
    public void mouseReleased(MouseEvent e) {
        Object ob = e.getSource();
        if (ob == register){
            System.out.println("注册");

        }else if (ob == login){
            System.out.println("登录");
            //获取用户输入的用户名,密码,验证码
            //获取用户名
            //从输入的文本框里面的数据进行获取
            String name =username.getText();//可是我不知道输入框里面是啥数据类型
            System.out.println("用户名 "+name);
            //获取密码
            //char[] pass =password.getPassword();
            String s = new String(password.getPassword());
            System.out.println("密码 "+s);

            //获取验证码
            String yzm01 =code.getText();
            System.out.println("输入的验证码 "+yzm01);

            //开始比较
            //先比较验证码
            //我想要他不区分大小写equalsIgnoreCase用这个方法
            //错误然后怎么刷新验证码呢
            //能刷新验证码,但是他图片不跟着变化,我也没办法
            System.out.println("当前正确验证码:" + yzmy.yzm);
            if (yzmy.yzm.equalsIgnoreCase(yzm01)){
                System.out.println("验证码正确继续判断用户名和密码");
            }else{//错误跳出弹框返回
                showJDialog("验证码输入错误请重新输入");
                //更新验证码
                //先把之前的情况
                //yzmy.yzm = "";
                //刷新那个验证码图片
                //initView();
                return;
            }

            //判断用户名和密码是否为空,有一个空就不对
            //用户名和密码为空怎么判断,他并不是null

            if (name.length() == 0 && s.length() == 0){
                //为空跳弹框
                showJDialog("密码或者用户名不能为空!");
                return;

            }
            //判断用户名和密码是否为空

            if ((name.equals(list.get(0).name) && s.equals(list.get(0).password)) ||
                    (name.equals(list.get(1).name) && s.equals(list.get(1).password))){
                //判断完成,正确则跳转拼图界面
                System.out.println("登录成功,请尽情玩耍吧");
                showJDialog("登录成功,请尽情玩耍吧");
                new GameJFrame();
            }else{//错误弹出错误框

                showJDialog("用户名或密码错误请重新输入!");
            }

        }

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

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

    }
}

 3.验证码的生成

import java.awt.Color; // 引入 Color 类,提供系统颜色和关于颜色空间的类。
import java.awt.Font; // 引入 Font 类,支持在AWT的所有渲染环境下的通用文字布局,并为所有给定字符和脚本提供字体处理功能。
import java.awt.Graphics; // 引入 Graphics 类,允许应用程序以协同的方式绘制到屏幕上或者其他任何地方。
import java.awt.image.BufferedImage; // 引入 BufferedImage 类,描述一些整数像素的具有可访问的数据缓冲区的图像。
import java.io.File; // 引入 File 类,它提供了与文件和路径名相关的操作,它具有创建、删除、读取文件等功能。
import java.io.IOException; // 引入 IOException 类,处理输入、输出操作失败或中断的情况(类似于文件未找到等)。
import java.util.Random; // 引入 Random 类,用于生成伪随机数。
import javax.imageio.ImageIO; // 引入 ImageIO 类,用于读取和写入图像格式,如 JPEG、PNG等。

public class Yzm {

    static String[] strs={"a", "b", "c", "d", "e", "f", "g", "h",
            "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t",
            "u", "v", "w", "x", "y", "z","0", "1", "2", "3", "4", "5", "6",
            "7", "8", "9","A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L",
            "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};

    public static String yzm = ""; //这个要变成静态,不然无法在其他类里面进行调用或者传值

    public  void Main()  {
        int height=60;//高
        int width=100;//宽
        int imageType = BufferedImage.TYPE_INT_RGB;//画板的组成,rgb是red,green,blue,红绿蓝组成
        BufferedImage image = new BufferedImage(width,height,imageType);//实例化画板对象,三个参数

        Graphics g = image.getGraphics();//实例化了一支笔
        g.setColor(Color.white);//笔的颜色为白色
        g.fillRect(0, 0, width, height);//然后将画板填充为白色,x,y为矩形左上角的坐标
        /*设置画板 */

        Random r=new Random();//实例化一个随机的对象
        int x=0,y=40;//这个是x,y界限
        g.setColor(Color.blue);//让验证码的颜色为蓝色
        g.setFont(new Font("宋体",Font.PLAIN,40));//设置字体,字体为宋体,并且大小为100
        for(int i=0;i<4;i++){//用for循环生成4个随机验证码
            int index=r.nextInt(62);//strs数组总共62个数,所以下标界限是0-61
            //System.out.println(strs[index]);
            //记录验证码,方便进行比较
            yzm += strs[index];//进行拼接
            System.out.println(yzm);

            String str = strs[index];//随机取一个字符
            g.drawString(str,x , y);//画字符在画板上
            x+=25;//这个移位,不然我第一次在这个位置画A,第二次画B的时候还在这个位置不就覆盖掉了吗,所以要移动位置


        }
        /*画出四位数的验证码 */

        /*g.setColor(Color.green);//让画笔的颜色为绿色
        for(int i=0;i<10;i++){//生成十条干扰线
            int a=r.nextInt(10);
            int b=r.nextInt(400);
            int c=r.nextInt(10)+380;
            int d=r.nextInt(400);
            g.drawLine(a,b,c,d);//ab是干扰线的左边的横纵坐标,cd是右边的
        }*/

        // 尝试写入图像
        try {

            ImageIO.write(image, "jpg", new File("image\\animal1\\666.png")); //此处应给出具体的文件名
        } catch (IOException e) {
            e.printStackTrace();
        }

        System.out.println("当前正确验证码 " + yzm);
    }
}

4.测试

public class App {
    public static void main(String[] args) {
       //new GameJFrame();
       // new Yzm().Main();
        new LonginJFrame();

    }
}

总结

        以上就是该拼图游戏的全部代码,如有疑问欢迎在评论区留言,最后如果对你有帮助,留个赞,点个关注谢谢支持。

评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值