sbc11

第六周

完成内部类学习并进行了简单的项目练习;
学会了容器的部分用法,做简单的小游戏

点击查看代码
package ui;
import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.*;
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 {
    //创建二维数组,因为要多次使用做成员变量
    int[][] date = new int[4][4];
    //x,y为二维数组的位置
    int x = 0;
    int y = 0;
    //win为正确图片排列位置
    int[][] win = new int[][]{
            {0, 1, 2, 3},
            {4, 5, 6, 7},
            {8, 9, 10, 11},
            {12, 13, 14, 15}
    };
    //用于记录步数
    int count = 0;
    //创建功能选项的条目
    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() {
        int[] tempArray = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
        //将一维数组打乱
        Random r = new Random();
        for (int i = 0; i < tempArray.length; i++) {
            int index = r.nextInt(tempArray.length);
            int temp = tempArray[i];
            tempArray[i] = tempArray[index];
            tempArray[index] = temp;
        }
        //将打乱的一维数组放入二维数组中
        for (int i = 0; i < tempArray.length; i++) {
            //空白图片的位置
            if (tempArray[i] == 15) {
                x = i / 4;
                y = i % 4;
            }
            date[i / 4][i % 4] = tempArray[i];
        }
    }

    //初始化图片
    private void initImage() {
        //清空以前图片
        this.getContentPane().removeAll();


        //判断是否胜利
        if (victory()){
            //创建容器管理图片
            JLabel panel = new JLabel(new ImageIcon("D:\\java\\案例\\formal\\puzzlegame\\src\\photo1\\th.jpg"));
            panel.setBounds(203,283,197,73);
            this.getContentPane().add(panel);
        }


        //创建容器管理文字
        JLabel stepCount = new JLabel("步数: "+ count);
        stepCount.setBounds(50,20,100,20);
        this.getContentPane().add(stepCount);


        //通过循环添加图片
        //循环列
        for(int i=0;i<4;i++){
            //添加行的图片
            for(int j=0;j<4;j++){
                //选用第num个图片
                int num = date[i][j];
                //创建一个图片Image对象
                ImageIcon icon = new ImageIcon("D:\\java\\案例\\formal\\puzzlegame\\src\\photo1\\"+num+".png");
                //创建一个Jabel对象
                JLabel label = new JLabel(icon);
                //指定图片的位置,xy看左上角的坐标
                label.setBounds(105*j + 83, 105*i + 134, 105,105);
                //添加边框
                //1是让图片凹进去
                //0是让图片凸出来
                label.setBorder(new BevelBorder(1));
                //把管理容器添加到主界面中
                this.getContentPane().add(label);
            }
        }


        //添加背景图片,在最后放,如果先设置因为图片较大覆盖打乱的图片
        ImageIcon icon1 = new ImageIcon("D:\\java\\案例\\formal\\puzzlegame\\src\\photo1\\112.jpg");
        JLabel label1 = new JLabel(icon1);
        label1.setBounds(40,40,508,560);
        this.getContentPane().add(label1);
        //刷新界面
        this.getContentPane().repaint();
    }


    //初始化界面方法
    private void initJFrame() {
        //设置主界面的宽高
        this.setSize(603, 680);
        //设置主界面标题
        this.setTitle("拼图单机版 v1.0");
        //设置主界面置顶
        this.setAlwaysOnTop(true);
        //设置主界面居中
        this.setLocationRelativeTo(null);
        //设置主界面关闭
        this.setDefaultCloseOperation(3);
        //取消默认的居中方式,只有取消才能按照xy轴方式添加组件
        this.setLayout(null);
        //在界面添加键盘接听事件
        this.addKeyListener(this);
    }






    //初始化菜单方法
    private void initJMenuBar() {
        //设置菜单
        //创建菜单对象
        JMenuBar menuBar = 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);


        //将选项添加到菜单中
        menuBar.add(functionJMenu);
        menuBar.add(aboutJMenu);


        //将菜单添加到主界面中
        this.setJMenuBar(menuBar);
    }

    @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("D:\\java\\案例\\formal\\puzzlegame\\src\\photo1\\all.jpg"));
            all.setBounds(83,134,420,420);
            this.getContentPane().add(all);
            //加载背景图片
            ImageIcon icon1 = new ImageIcon("D:\\java\\案例\\formal\\puzzlegame\\src\\photo1\\112.jpg");
            JLabel label1 = new JLabel(icon1);
            label1.setBounds(40,40,508,560);
            this.getContentPane().add(label1);
            this.getContentPane().repaint();
        }
    }
    //松开按键
    @Override
    public void keyReleased(KeyEvent e) {
        //胜利之后不能再移动
        if(victory()){
            initImage();
            return;
        }

        int code = e.getKeyCode();
        //左移
        if (code == 37) {
            //为最左方
            if(y==0){
                return;
            }
            //交换位置
            date[x][y] = date[x][y-1] ;
            date[x][y-1] = 15;
            //交换后空白图片x+1,y不变
            y--;
            count++;
            //加载图片
            initImage();
        }
        //上移
        else if (code == 38) {
            //为最下方
            if(x==0){
                return;
            }
            //交换位置
            date[x][y] = date[x-1][y] ;
            date[x-1][y] = 15;
            //交换后空白图片x+1,y不变
            x--;
            count++;
            //加载图片
            initImage();
        }
        //右移
        else if (code == 39) {
            //为最右方
            if(y==3){
                return;
            }
            //交换位置
            date[x][y] = date[x][y+1] ;
            date[x][y+1] = 15;
            //交换后空白图片x+1,y不变
            y++;
            count++;

            //加载图片
            initImage();
        }
        //下移
        else if (code == 40) {
            //为最下方
            if(x==3){
                return;
            }
            //交换位置
            date[x][y] = date[x+1][y] ;
            date[x+1][y] = 15;
            //交换后空白图片x+1,y不变
            x++;
            count++;

            //加载图片
            initImage();
        }
        else if (code == 65) {
            initImage();
        }
        else if (code == 87) {
            date = new int[][]{
                    {0,1,2,3},
                    {4,5,6,7},
                    {8,9,10,11},
                    {12,13,14,15}
            } ;
            initImage();
        }
    }

    //判断date数组是否和win相同及胜利判断
    public boolean victory(){
        for(int i=0;i<date.length;i++){
            for(int j=0;j<date[i].length;j++){
                if(date[i][j] != win[i][j]){
                    return false;
                }
            }
        }
        //因为胜利之x=3,y=3,防止出现bug
        x = 3;
        y = 3;
        return true;
    }

    //事件触发
    @Override
    public void actionPerformed(ActionEvent e) {
        //获取当前被点击的条目对象
        Object obj  = e.getSource();
        //判断
        if(obj == replayItem){
            System.out.println("重新开始");
            //打乱二维数据中数组
            initDate();
            //计数器清零,因为计数器在加载图片中显示所以要先清零在加载图片
            count = 0;
            //加载图片
            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 jd = new JDialog();
            //创建一个管理图片的容器
            JLabel jLabel = new JLabel(new ImageIcon("D:\\java\\案例\\formal\\puzzlegame\\src\\photo1\\vx.jpg"));
            jLabel.setBounds(0,0,623,619);
            jd.getContentPane().add(jLabel);
            //设置弹窗大小
            jd.setSize(623,619);
            //设置弹窗置顶
            jd.setAlwaysOnTop(true);
            //设置弹窗居中
            jd.setLocationRelativeTo(null);
            //弹窗不关闭无法操作其他界面
            jd.setModal(true);
            //显示弹窗
            jd.setVisible(true);


        }
    }
}
点击查看代码
package ui;
import javax.swing.*;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.Objects;
//登录界面搭建
public class LoginJFrame extends JFrame implements MouseListener {
    //创建集合添加用户名与对应的密码
    static ArrayList<User> allUers = new ArrayList<User>();

    static {
        allUers.add(new User("张三", "123"));
        allUers.add(new User("李四", "1234"));
    }

    //创建输入的验证码容器,因为其他方法要用所以作为成员变量
    JLabel ringtCode = new JLabel();
    //创建登录,注册按钮,同上
    JButton login = new JButton();
    JButton register = new JButton();
    //创建用户名输入框
    JTextField username = new JTextField();
    //密码输入框
    JPasswordField password = new JPasswordField();
    //验证码输入框
    JTextField code = new JTextField();

    //登陆界面无参构造
    public LoginJFrame() {
        //初始化界面
        initJframe ();
        //在登陆界面添加内容
        initView();


        //设置登陆界面显现
        this.setVisible(true);
    }

    private void initJFrame() {
    }

    //在登陆界面添加内容
    private void initView() {
        //添加用户名文字图片

        //创建容器管理图片
        JLabel usernameText = new JLabel(new ImageIcon("D:\\java\\案例\\formal\\puzzlegame\\src\\login\\用户名.png"));
        //设置大小位置
        usernameText.setBounds(116, 135, 47, 17);
        //添加到登陆界面
        this.getContentPane().add(usernameText);

        //添加用户名的输入框


        //设置大小位置
        username.setBounds(195, 134, 200, 30);
        //添加到登陆界面
        this.getContentPane().add(username);

        //添加密码文字图片

        //创建容器管理图片
        JLabel passwordText = new JLabel(new ImageIcon("D:\\java\\案例\\formal\\puzzlegame\\src\\login\\密码.png"));
        //设置大小位置
        passwordText.setBounds(130, 195, 32, 16);
        //添加到登录界面
        this.getContentPane().add(passwordText);

        //添加密码输入框

        //创建输入框
        //设置大小位置
        password.setBounds(195, 195, 200, 30);
        //添加到登陆界面
        this.getContentPane().add(password);

        //验证码提示
        JLabel codeText = new JLabel(new ImageIcon("D:\\java\\案例\\formal\\puzzlegame\\src\\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();
        //将验证码显示在界面上
        ringtCode.setText(codestr);
        //绑定鼠标事件
        ringtCode.addMouseListener(this);
        //设置验证码的大小位置
        ringtCode.setBounds(300, 256, 50, 30);
        //添加到登陆界面上
        this.getContentPane().add(ringtCode);

        //添加登录按钮
        login.setBounds(123, 310, 128, 47);
        login.setIcon(new ImageIcon("D:\\java\\案例\\formal\\puzzlegame\\src\\login\\登录按钮.png"));
        //去除按钮边框
        login.setBorderPainted(false);
        //去除按钮背景
        login.setContentAreaFilled(false);
        //绑定鼠标事件
        login.addMouseListener(this);
        //添加到界面中
        this.getContentPane().add(login);

        //添加注册按钮
        register.setBounds(256, 310, 128, 47);
        register.setIcon(new ImageIcon("D:\\java\\案例\\formal\\puzzlegame\\src\\login\\注册按钮.png"));
        register.setBorderPainted(false);
        register.setContentAreaFilled(false);
        register.addMouseListener(this);
        this.getContentPane().add(register);

        //添加背景图片
        JLabel background = new JLabel(new ImageIcon("D:\\java\\案例\\formal\\puzzlegame\\src\\login\\background.png"));
        background.setBounds(0, 0, 470, 390);
        this.getContentPane().add(background);





    }


    //初始化界面
    public void initJframe(){
        //设置登陆界面宽高
        this.setSize(488, 430);
        //设置登陆界面标题
        this.setTitle("登录");
        //设置登陆界面置顶
        this.setAlwaysOnTop(true);
        //设置登陆界面居中
        this.setLocationRelativeTo(null);
        //设置登陆界面关闭
        this.setDefaultCloseOperation(3);
    }

    //点击
    @Override
    public void mouseClicked(MouseEvent e) {
        //点击登录
        if(e.getSource() == login) {
            //获取用户名与密码输入框中内容
            String usernameInput = username.getText();
            String passwordInput = password.getText();
            //验证码
            String codeInput = code.getText();
            //创建一个User对象
            User user = new User(usernameInput, passwordInput);
            if(codeInput.length() == 0) {
                //创建一个弹窗,输出文字
                showJDialog("验证码不能为空");
            } else if (usernameInput.length()==0||passwordInput.length()==0) {
                showJDialog("用户名或者密码为空");
            } else if (!codeInput.equalsIgnoreCase(ringtCode.getText())) {
                showJDialog("验证码输入错误");
                //判断用户名密码是否正确
            } else if (contains(user)) {
                //关闭当前登陆界面
                this.setVisible(false);
                //打开游戏界面
                new GameJFrame();
            }
            else {
                showJDialog("用户名或密码错误");
            }
            //点击注册
        } else if (e.getSource()==register) {
            showJDialog("当前功能未开放");
            //点击验证码
        } else if (e.getSource()==ringtCode) {
            String code = CodeUtil.getCode();
            ringtCode.setText(code);
        }
    }

    private 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("D:\\java\\案例\\formal\\puzzlegame\\src\\login\\登录按下.png"));

        }else if (e.getSource() == register) {
            register.setIcon(new ImageIcon("D:\\java\\案例\\formal\\puzzlegame\\src\\login\\注册按下.png"));
        }
    }

    //松开按钮
    @Override
    public void mouseReleased(MouseEvent e) {
        if(e.getSource() == login) {
            login.setIcon(new ImageIcon("D:\\java\\案例\\formal\\puzzlegame\\src\\login\\登录按钮.png"));

        }else if (e.getSource() == register) {
            register.setIcon(new ImageIcon("D:\\java\\案例\\formal\\puzzlegame\\src\\login\\注册按钮.png"));
        }
    }

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

    }

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

    }

    //判断用户在集合中是否存在
    public boolean contains (User user) {
        for (int i = 0; i < allUers.size(); i++) {
            User u = allUers.get(i);
            if(user.getName().equals(u.getName()) && user.getPassword().equals(u.getPassword())) {
                return true;
            }
        }
        return false;
    }
}
点击查看代码
package ui;

import java.util.ArrayList;
import java.util.Random;
//登陆界面中生成随机验证工具类
public class CodeUtil {
    public static String getCode(){
        //创建一个集合
        ArrayList<Character> list = new ArrayList<>();
        //将A-Z与a-z放入集合中
        //共52个字符,循环一次添加2个字符
        for (int i = 0; i < 26; i++) {
            list.add((char)('a' + i));
            list.add((char)('A' + i));
        }

        //随机生成四个字母
        String result = "";
        Random r = new Random();
        for(int i = 0; i < 4; i++){
            //从集合中随机抽取4个字母
            result += list.get(r.nextInt(list.size()));
        }

        //随机生成一个数字
        int number = r.nextInt(10);
        //将数字拼接到字母后面
        result = result + number;
        //将字符串变成一个字符数组
        char[] arr = result.toCharArray();
        //生成随机索引
        int index = r.nextInt(arr.length);
        //将数字放到随机索引处
        char ch = arr[4];
        arr[4] = arr[index];
        arr[index] = ch;
        //将字符数组转化为字符串
        String code = new String(arr);
        return code;
    }
}
点击查看代码
package ui;
//登陆界面用户对象
public class User {
    private String name;
    private String password;

    public User() {
    }

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

    public String getName() {
        return name;
    }

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

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}
点击查看代码
import ui.RegisterJFrame;
import ui.GameJFrame;
import ui.LoginJFrame;
//程序入口
public class App {
    public static void main(String[] args) {
        //new GameJFrame();
        //new RegisterJFrame();
        new LoginJFrame();
    }
}
下周对小学期测试进行准备 并完成pta实验报告

posted on 2024-08-10 17:23  沈八才11  阅读(8)  评论(0编辑  收藏  举报

导航