Java黑马程序员——拼图小游戏(注册、登录、游戏界面全功能实现完整版)

目录

一、界面预览 

二、项目结构

三、代码实现

1.登录

LoginJFrame.java——登录界面

CodeUtil.java——验证码生成类

UserInfo——用户类

2.注册

RegisterJFrame.java——主界面

3.游戏

GameJFrame——游戏主界面

4.启动App类

App.java

5.作弊码

1.按键字母a——长按显示最终图片

2.按键w——直接胜利


一、界面预览 

1.登录界面

2.注册界面

3.游戏主界面

二、项目结构

项目中路径都为相对路径  在每个界面代码开头  定义为成员变量path

三、代码实现

        注册、登录页面都已完成,

注释都存在于代码中,在此不再进行过多阐述。

1.登录

LoginJFrame.java——登录界面

package com.itheima.ui;

import javax.swing.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;

public class LoginJFrame extends JFrame implements MouseListener {
    //LoginJFrame 表示登录界面
    //以后所有跟登录相关的代码,都写在这里
    String path = "p144--code\\image\\login\\";
    //初始化对象
    JTextField UserjTextField = new JTextField();//用户名输入框
    JPasswordField passwordField = new JPasswordField();//用户密码输入框
    JTextField code = new JTextField();//验证码输入框
    JButton loginButton = new JButton();//登录按钮
    JButton enrollButton = new JButton();//注册按钮
    JLabel seelabel = new JLabel();
    //验证码区域
    JLabel rightCode = new JLabel();
    //定义用户信息列表 并初始化数据
    public static ArrayList<UserInfo> userInfoArrayList = new ArrayList<>();
    {
        userInfoArrayList.add(new UserInfo("heima","123"));
        for (UserInfo userInfo : userInfoArrayList) {
            System.out.println("用户信息:"+userInfo.getName()+"  "+userInfo.getPaw());
        }
    }


    public LoginJFrame() {

        //初始化界面
        initJFrame();

        //页面内容
        initView();

    }


    //初始化界面
    private void initJFrame() {
        //在创建登录界面的时候,同时给这个界面去设置一些信息
        //比如,宽高,直接展示出来
        this.setSize(488, 430);
        //设置界面的标题
        this.setTitle("拼图登录界面");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置关闭模式
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //取消内部默认布局
        this.setLayout(null);

        this.setVisible(true);
    }

    //页面内容
    public void initView() {
        //添加用户名标签
        JLabel UserjLabel = new JLabel(new ImageIcon(path + "用户名.png"));
        UserjLabel.setBounds(100, 140, 47, 17);
        this.getContentPane().add(UserjLabel);
        //添加输入框
        UserjTextField.setBounds(195, 134, 200, 30);
        this.getContentPane().add(UserjTextField);


        //添加密码标签
        JLabel PawjLabel = new JLabel(new ImageIcon(path + "密码.png"));
        PawjLabel.setBounds(110, 200, 32, 16);
        this.getContentPane().add(PawjLabel);
        //添加密码输入框
        passwordField.setBounds(195, 195, 200, 30);
        passwordField.setEchoChar('*');
        this.getContentPane().add(passwordField);

        //密码显示
        seelabel.setIcon(new ImageIcon(path + "显示密码.png"));
        seelabel.setBounds(400, 195, 50, 30);
        seelabel.addMouseListener(this);
        this.getContentPane().add(seelabel);

        //验证码提示
        JLabel codeText = new JLabel(new ImageIcon(path + "验证码.png"));
        codeText.setBounds(100, 256, 50, 30);
        this.getContentPane().add(codeText);

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

        //生成5个随机验证码
        String codeStr = CodeUtil.Create(5);
        //设置内容
        rightCode.setText(codeStr);
        //绑定鼠标事件
        rightCode.addMouseListener(this);
        //位置和宽高
        rightCode.setBounds(300, 256, 50, 30);
        //添加到界面
        this.getContentPane().add(rightCode);

        //设置登录按钮
        loginButton.setBounds(123, 310, 128, 47);
        ImageIcon icon1 = new ImageIcon(path + "登录按钮.png");
        loginButton.setIcon(icon1);
        //去除按钮的边框
        loginButton.setBorderPainted(false);
        //去除按钮的背景
        loginButton.setContentAreaFilled(false);
        loginButton.addMouseListener(this);
        this.getContentPane().add(loginButton);

        //设置注册按钮
        enrollButton.setBounds(256, 310, 128, 47);
        ImageIcon icon2 = new ImageIcon(path + "注册按钮.png");
        enrollButton.setIcon(icon2);
        //去除按钮的边框
        enrollButton.setBorderPainted(false);
        //去除按钮的背景
        enrollButton.setContentAreaFilled(false);
        enrollButton.addMouseListener(this);
        this.getContentPane().add(enrollButton);


        //创建背景色
        JLabel back = new JLabel(new ImageIcon(path + "background.png"));
        back.setBounds(0, 0, 470, 390);
        this.getContentPane().add(back);

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

    //弹窗设置
    public void showDialog(String str) {
        JDialog dialog = new JDialog();
        dialog.setSize(180, 150);
        //让弹框置顶
        dialog.setAlwaysOnTop(true);
        //让弹框居中
        dialog.setLocationRelativeTo(null);
        //弹框不关闭永远无法操作下面的界面
        dialog.setModal(true);
        JLabel warning = new JLabel(str);
        //让显示的文字居中
        warning.setHorizontalAlignment(JLabel.CENTER);
        warning.setBounds(0, 0, 200, 150);
        dialog.getContentPane().add(warning);
        //让弹框展示出来
        dialog.setVisible(true);
    }

    //核对用户信息
    public boolean contains(UserInfo userInfo){
        //for增强
        for (UserInfo rightuser : userInfoArrayList) {
            //集合user
            if (userInfo.getName().equals(rightuser.getName()) && userInfo.getPaw().equals(rightuser.getPaw())) {
                //相同则通过进行下一步
                return true;
            }
        }
        return false;
    }


    //鼠标点击监听
    @Override
    public void mouseClicked(MouseEvent m) {
        if (m.getSource() == loginButton) {
            System.out.println("用户点击登录按钮");
            String name = UserjTextField.getText();
            String paw = passwordField.getText();
            //获取验证码
            String codeInput = code.getText();
            UserInfo user = new UserInfo(name, paw);
            System.out.println("用户输入的用户名为:" + name);
            System.out.println("用户输入的密码为:" + paw);
            if (codeInput.length() == 0 && name.length() != 0 && paw.length() != 0) {
                System.out.println("用户验证码为空!");
                showDialog("验证码不能为空!");
                String code = CodeUtil.Create(5);//创建一个5位长度的随机验证码
                rightCode.setText(code);
            } else if (name.length() == 0 || paw.length() == 0) {
                System.out.println("用户名或者密码为空");
                showDialog("用户名或者密码为空");
                String code = CodeUtil.Create(5);
                rightCode.setText(code);
                //判断输入的验证码与生成的验证码是否相同
            } else if (!codeInput.equalsIgnoreCase(rightCode.getText())) {
                showDialog("验证码输入错误");
                String code = CodeUtil.Create(5);
                rightCode.setText(code);
            } else if (contains(user)) {
                System.out.println("用户输入账号正确,登录成功!");
                //关闭登陆界面
                this.setVisible(false);
                new GameJFrame();
            } else {
                System.out.println("用户名或密码错误");
                showDialog("用户名或密码错误");
                String code = CodeUtil.Create(5);
                rightCode.setText(code);
            }
        }
        //更换验证码
        if (m.getSource() == rightCode) {
            System.out.println("更换验证码!");
            String code = CodeUtil.Create(5);
            rightCode.setText(code);
        }
        //进入注册页面
        if (m.getSource() == enrollButton) {
            System.out.println("用户注册");
            this.dispose();
            new RegisterJFrame();
        }

    }

    //鼠标长按监听
    @Override
    public void mousePressed(MouseEvent m) {
        if (m.getSource() == loginButton) {
            loginButton.setIcon(new ImageIcon(path + "登录按下.png"));
        } else if (m.getSource() == enrollButton) {
            enrollButton.setIcon(new ImageIcon(path + "注册按下.png"));
        } //显示查看密码
        else if (m.getSource() == seelabel) {
            seelabel.setIcon(new ImageIcon(path + "显示密码按下.png"));
            passwordField.setEchoChar((char) 0);
        }
    }

    //鼠标松开监听
    @Override
    public void mouseReleased(MouseEvent m) {
        if (m.getSource() == loginButton) {
            loginButton.setIcon(new ImageIcon(path + "登录按钮.png"));
        } else if (m.getSource() == enrollButton) {
            enrollButton.setIcon(new ImageIcon(path + "注册按钮.png"));
        } else if (m.getSource() == seelabel) {
            seelabel.setIcon(new ImageIcon(path + "显示密码.png"));
            passwordField.setEchoChar('*');
        }


    }

    @Override
    public void mouseEntered(MouseEvent e) {

    }

    @Override
    public void mouseExited(MouseEvent e) {

    }


}

CodeUtil.java——验证码生成类

package com.itheima.ui;
//验证码生成

import java.util.Random;

public class CodeUtil {
    public  static String Create(int n){
        String  code = "";
        Random r = new Random();
        for (int i = 0; i < n; i++) {
        //随机生成三个数字
            int type =r.nextInt(3);
            switch (type){
                case 0:
                    //大写字符
                    //A-Z
                    char ch = (char)(r.nextInt(26)+65);//转换为大写字符
                    code += ch;
                    break;
                case 1:
                    //小写字符
                    // a-z
                    char ch1 = (char)(r.nextInt(26)+97);
                    code += ch1;
                    break;
                case 2:
                    //数字字符
                    code +=r.nextInt(10);
                    break;
            }
        }
        return  code;
    }

}

UserInfo——用户类

package com.itheima.ui;

//用户信息类
public class UserInfo {
    private String name;
    private String paw;

    public UserInfo(String name, String paw) {
        this.name = name;
        this.paw = paw;
    }
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPaw() {
        return paw;
    }

    public void setPaw(String paw) {
        this.paw = paw;
    }



}

2.注册

RegisterJFrame.java——主界面

package com.itheima.ui;

import javax.swing.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class RegisterJFrame extends JFrame implements MouseListener {
    //跟注册相关的代码,都写在这个界面中
    String path = "p144--code\\image\\register\\";

    //初始化对象
    JTextField registeruser = new JTextField();
    JPasswordField registerpaw  = new JPasswordField();
    JPasswordField registerpaw2  = new JPasswordField();
    JButton registerbutton = new JButton();
    JButton returnbutton = new JButton();


    public RegisterJFrame(){

        //初始化界面
        initJFrame();

        //初始化页面
        initview();

    }


    //初始化界面
    private void initJFrame() {
        this.setSize(480,500);

        //设置界面的标题
        this.setTitle("拼图注册界面");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置关闭模式
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //让显示显示出来,建议写在最后
        //取消内部默认布局
        this.setLayout(null);

        this.setVisible(true);
    }

    //初始化页面
    private void initview() {
        JLabel registerUser = new JLabel(new ImageIcon(path + "注册用户名.png"));
        registerUser.setBounds(100, 140, 80, 17);
        this.getContentPane().add(registerUser);
        //添加输入框
        registeruser.setBounds(195, 134, 200, 30);
        this.getContentPane().add(registeruser);

        //添加密码标签
        JLabel PawjLabel = new JLabel(new ImageIcon(path + "注册密码.png"));
        PawjLabel.setBounds(100, 200, 80, 17);
        this.getContentPane().add(PawjLabel);
        //添加注册输入框
        registerpaw.setBounds(195, 195, 200, 30);
        this.getContentPane().add(registerpaw);


        JLabel PawjLabel2 = new JLabel(new ImageIcon(path + "再次输入密码.png"));
        PawjLabel2.setBounds(70, 255, 120, 20);
        this.getContentPane().add(PawjLabel2);
        //添加再次注册输入框
        registerpaw2.setBounds(195, 250, 200, 30);
        this.getContentPane().add(registerpaw2);

        //注册按钮
        registerbutton.setBounds(123, 310, 128, 47);
        ImageIcon icon1 = new ImageIcon(path + "注册按钮.png");
        registerbutton.setIcon(icon1);
        //去除按钮的边框
        registerbutton.setBorderPainted(false);
        //去除按钮的背景
        registerbutton.setContentAreaFilled(false);
        registerbutton.addMouseListener(this);
        this.getContentPane().add(registerbutton);

        //设置重置按钮
        returnbutton.setBounds(256, 310, 128, 47);
        ImageIcon icon2 = new ImageIcon(path + "重置按钮.png");
        returnbutton.setIcon(icon2);
        //去除按钮的边框
        returnbutton.setBorderPainted(false);
        //去除按钮的背景
        returnbutton.setContentAreaFilled(false);
        returnbutton.addMouseListener(this);
        this.getContentPane().add(returnbutton);

        JLabel back = new JLabel(new ImageIcon(path + "background.png"));
        back.setBounds(0, 0, 470, 390);
        this.getContentPane().add(back);
    }

    //弹窗设置
    public void showDialog(String str) {
        JDialog dialog = new JDialog();
        dialog.setSize(180, 150);
        //让弹框置顶
        dialog.setAlwaysOnTop(true);
        //让弹框居中
        dialog.setLocationRelativeTo(null);
        //弹框不关闭永远无法操作下面的界面
        dialog.setModal(true);
        JLabel warning = new JLabel(str);
        //让显示的文字居中
        warning.setHorizontalAlignment(JLabel.CENTER);
        warning.setBounds(0, 0, 200, 150);
        dialog.getContentPane().add(warning);
        //让弹框展示出来
        dialog.setVisible(true);
    }

    @Override
    public void mouseClicked(MouseEvent m) {
        if (m.getSource() == registerbutton){
            String name = registeruser.getText();
            String paw = registerpaw.getText();
            String paw2 = registerpaw2.getText();
            if (name.length() != 0 && paw.length() != 0 && paw2.length() != 0) {
                if(registerpaw.getText().equals(registerpaw2.getText())) {
                    System.out.println("用户注册成功!");
                    for (UserInfo userInfo : LoginJFrame.userInfoArrayList) {
                        System.out.println("当前用户信息:"+userInfo.getName()+"  "+userInfo.getPaw());
                    }
                    LoginJFrame.userInfoArrayList.add(new UserInfo(name, paw));
                    System.out.println("用户添加成功!");
                    this.dispose();
                    new LoginJFrame();
                }else {
                    showDialog("两次输入的密码不一样!");
                }
            }else {
                showDialog("注册内容不能为空!");
            }
        } else if (m.getSource() == returnbutton) {
            System.out.println("重置用户注册信息");
            registeruser.setText("");
            registerpaw.setText("");
            registerpaw2.setText("");
        }
    }

    @Override
    public void mousePressed(MouseEvent m) {
        if (m.getSource() == registerbutton){
            registerbutton.setIcon(new ImageIcon(path + "注册按下.png"));
        }else if (m.getSource() == returnbutton){
            returnbutton.setIcon(new ImageIcon(path + "重置按下.png"));
        }
    }

    @Override
    public void mouseReleased(MouseEvent m) {
        if (m.getSource() == registerbutton){
            registerbutton.setIcon(new ImageIcon(path + "注册按钮.png"));
        }else if (m.getSource() == returnbutton){
            returnbutton.setIcon(new ImageIcon(path + "重置按钮.png"));
        }

    }

    @Override
    public void mouseEntered(MouseEvent e) {

    }

    @Override
    public void mouseExited(MouseEvent e) {

    }
}

3.游戏

GameJFrame——游戏主界面

package com.itheima.ui;

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.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 = "p144--code\\image\\animal\\animal3\\";
    String rootPath = "p144--code\\image\\";

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

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

    //创建选项下面的条目对象
    JMenuItem girl = new JMenuItem("美女");
    JMenuItem animal = new JMenuItem("动物");
    JMenuItem sport = new JMenuItem("运动");

    JMenuItem replayItem = new JMenuItem("重新游戏");
    JMenuItem reLoginItem = new JMenuItem("重新登录");
    JMenuItem closeItem = new JMenuItem("关闭游戏");

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

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

        //初始化菜单
        initJMenuBar();

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


        //初始化图片
        initImage();



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

    }



    //初始化数据(打乱)
    private void initDate() {
        //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.给二维数组添加数据
        //遍历一维数组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("p144--code\\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文件夹

        //细节:
        //先加载的图片在上方,后加载的图片在下方  (背景图片要最后在加载)

        //外循环---
        for (int i = 0; i < 4; i++) {
            //内循环---
            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("p144--code\\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("关于我们");
        JMenu changeImage = new JMenu("更换图片");


        //将每一个选项下面的条目去添加到选项中
        functionJMenu.add(changeImage);
        functionJMenu.add(replayItem);
        functionJMenu.add(reLoginItem);
        functionJMenu.add(closeItem);

        changeImage.add(girl);
        changeImage.add(animal);
        changeImage.add(sport);

        aboutJMenu.add(accountItem);

        //给条目绑定事件
        replayItem.addActionListener(this);
        reLoginItem.addActionListener(this);
        closeItem.addActionListener(this);
        accountItem.addActionListener(this);
        girl.addActionListener(this);
        animal.addActionListener(this);
        sport.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("p144--code\\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 含义 :1.返回结果  2.结束方法
            return;
        }

        //对上,下,左,右 进行判断
        //左:37  上:38  右:39 下:40
        int code = e.getKeyCode();
        if (code==37){//左
            if (y == 3){
                return;
            }
            data[x][y] = data[x][y+1];
            data[x][y+1] = 0;
            y++;
            //每移动一次,计数器自增一次
            step++;
            initImage();
        }else if (code==38){//上
            //把空白方块下方的数字往上移动
            //x,y 表示空白方块   x+1,y表示空白方块下方的数字

            //边界值3,0  3,1  3,2  3,3
            if (x == 3){
                return;
            }
            //把空白方块下方的数字赋值给空白方块
            data[x][y] = data[x+1][y];
            data[x+1][y] = 0;
            x++; //存空白方块位置
            step++;
            //调用方法按照最新的数字加载图片
            initImage();


        }else if (code==39){//右
            if (y == 0){
                return;
            }
            data[x][y] = data[x][y-1];
            data[x][y-1] = 0;
            y--;
            step++;
            initImage();
        }else if (code==40){//下
            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();
        }
    }

    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){//重新游戏
            //计步器清零
            step = 0;
            //再次打乱二维数组中的数据
            initDate();
            //重新加载图片
            initImage();

        }else if (obj == reLoginItem){//重新登录
            //关闭当前游戏界面
            this.setVisible(false);
            //打开登录界面
            new LoginJFrame();
        }else if (obj == closeItem){//关闭游戏
            //直接关闭虚拟机
            System.exit(0);
        }else if (obj == accountItem){//公众号
            //创建一个弹框对象
            JDialog jDialog = new JDialog();
            //创建一个管理图片的容器对象JLabel
            JLabel jLabel = new JLabel(new ImageIcon("p144--code\\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);

        }else if (obj == girl){
            //更改路径
            Random r = new Random();
            String index = String.valueOf(r.nextInt(13)+1);
            path = rootPath+"girl\\girl"+index+"\\";
            //计步器清零
            step = 0;
            //再次打乱二维数组中的数据
            initDate();
            //重新加载图片
            initImage();
        }else if (obj == animal){
            //更改路径
            Random r = new Random();
            String index = String.valueOf(r.nextInt(8)+1);
            path = rootPath+"animal\\animal"+index+"\\";
            //计步器清零
            step = 0;
            //再次打乱二维数组中的数据
            initDate();
            //重新加载图片
            initImage();
        }else if (obj == sport){
            //更改路径
            Random r = new Random();
            String index = String.valueOf(r.nextInt(10)+1);
            path = rootPath+"sport\\sport"+index+"\\";
            //计步器清零
            step = 0;
            //再次打乱二维数组中的数据
            initDate();
            //重新加载图片
            initImage();
        }

    }
}

4.启动App类

App.java

import com.itheima.ui.LoginJFrame;

public class App {
    public static void main(String[] args) {
        //表示程序的启动入口

        //如果我们想要开启一个界面,就创建谁的对象就可以了
        new LoginJFrame();

        //new RegisterJFrame();
        //new GameJFrame();
    }
}

5.作弊码

1.按键字母a——长按显示最终图片

2.按键w——直接胜利

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值