Java笔记_10(项目阶段----拼图游戏)

项目阶段

  • 页面搭建
    • 创建窗口
  • 界面设置和菜单搭建
    • 创建菜单
  • 添加图片
    • 图片对象
  • 打乱图片
    • 用一维数组添加值到二维数组中
  • 事件
  • 美化页面
  • 移动图片
  • 查看完整图片,作弊器,判断胜利
  • 计步器和菜单业务的实现
    • 弹窗创建
  • 更换图片和登陆页面的建立
    • 表单
  • 所有源码的实现
    • 游戏规则
    • 工具类
    • 登录窗口
    • 注册窗口(些许功能目前难以实现)
    • 游戏窗口
    • 进入游戏的入口

页面搭建

创建窗口

  • 使用 JFrame JavaBean类
  • 调用格式
    • JFrame 名称 = new JFrame();
  • 相关属性:
    • 宽高的设置
      • 名称.setSize(宽(px),高(px))
    • 界面的显示
      • 名称.setVisible(布尔值)
    • 界面的标题
      • 名称.setTitle(String)
    • 界面置顶
      • 名称.setAlwaysOnTop(布尔值)
    • 界面居中
      • 名称.setLocationRelativeTo(null)
    • 设置关闭模式
      • 名称.setDefaultCloseOperation(number)
      • 每一种数字都是一种关闭模式
    • 取消窗口默认居中放置,只有取消了才能按照XY轴的方式添加组件
      • 名称.setLayout(null)
    • 在窗口中添加组件
      • 名称.setgetContentPane().add(组件名称)
    • 清除已经出现的组件
      • 窗口名称.getContentPane().removeAll()
    • 重新刷新界面
      • 窗口名称.getContentPane().repaint()
    • 关闭运营
      • System.exit(0);
        Java笔记_10(项目阶段----拼图游戏)_第1张图片
package smulll.ui;

import javax.swing.*;

public class GameJFrame extends JFrame {
    //跟游戏相关的界面
    public GameJFrame (){
        this.setSize(603,680);
        this.setVisible(true);
    }
}
package smulll.ui;

import javax.swing.*;

public class LoginJFrame extends JFrame {
    //跟登录相关的界面
    public LoginJFrame (){
        this.setSize(488,430);
        this.setVisible(true);
    }
}
package smulll.ui;

import javax.swing.*;

public class RegisterFrame extends JFrame {
    //跟注册相关的代码
    public RegisterFrame (){
        this.setSize(488,500);
        this.setVisible(true);
    }
}

界面设置和菜单搭建

创建菜单

  • 给整个窗口界面设置一个菜单
    • 窗口名称.setJMenuBar(菜单名称)
  • 菜单对象
    • JMenuBar 名称 = new JMenuBar();
    • 添加选项的属性
      • 名称.add(选项名称);
  • 菜单中的选项
    • JMenu 名称 = new JMenu(String);
    • 添加条目对象的属性
      • 名称.add(条目对象名称);
  • 选项下的条目对象
    • JMenuItem 名称 = new JMenuItem();
package smulll.ui;

import javax.swing.*;

public class GameJFrame extends JFrame {
    //跟游戏相关的界面
    public GameJFrame() {
        //初始化界面
        initJFrame();
        //初始化菜单
        initJFrameBar();

        this.setVisible(true);
    }
    private void initJFrame() {
        this.setSize(603, 680);
        //设置页面标题
        this.setTitle("拼图游戏 v1.0");
        //设置页面在页面顶层
        this.setAlwaysOnTop(true);
        //页面居中
        this.setLocationRelativeTo(null);
        //设置关闭模式
        this.setDefaultCloseOperation(3);
    }
    private void initJFrameBar(){
        //创建一个菜单
        JMenuBar jMenuBar = new JMenuBar();
        //创建菜单选项
        JMenu functionJMenu = new JMenu("功能");
        JMenu aboutJMenu = new JMenu("关于我们");
        //创建选项下面的条目对象
        JMenuItem replayItem = new JMenuItem("重新游戏");
        JMenuItem reloginItem = new JMenuItem("重新登录");
        JMenuItem closeItem = new JMenuItem("关闭游戏");

        JMenuItem accountItem = new JMenuItem("公众号");
        //添加到项目之下
        functionJMenu.add(replayItem);
        functionJMenu.add(reloginItem);
        functionJMenu.add(closeItem);

        aboutJMenu.add(accountItem);
        //添加选项到菜单中
        jMenuBar.add(functionJMenu);
        jMenuBar.add(aboutJMenu);
        //添加菜单
        this.setJMenuBar(jMenuBar);

    }
}

添加图片

图片对象

  • 创建一个图片对象
    • ImageIcon 名称 = new ImageIcon (文件的完整路径)
  • 创建一个图片管理容器对象
    • JLabel 名称 = new JLabel(图片对象名称)
  • 把管理容器添加到界面中
    • 窗口名称.getContentPane().add(管理容器名称)
  • 图片放置位置
    • 图片管理容器名称.setBounds(x轴位置,y轴位置,宽,高)

打乱图片

用一维数组添加值到二维数组中

打乱一维数组中的数据,添加到二维数组中

public static void main(String[] args) {
        int[] tempArr = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0};
        
        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;
        }
        for (int i = 0; i < tempArr.length; i++) {
            System.out.print(tempArr[i]+" ");
        }
        System.out.println();

        int[][] data = new int[4][4];
		//将一维数组中的数据添加到二维数组中
        for (int i = 0; i < tempArr.length; i++) {
            data[i/4][i%4] = tempArr[i];
        }
		//遍历二维数组
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                System.out.print(data[i][j]+" ");
            }
            System.out.println();
        }
private void initData() {
        int[] tempArr = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0};
        //打乱图片的顺序
        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;
        }
        //把一维数组的数添加到二维数组中
        for (int i = 0; i < tempArr.length; i++) {
            data[i/4][i%4] = tempArr[i];
        }

    }

事件

  • 事件源:按钮 图片 窗体…
  • 事件:某些操作
    如:鼠标单击,鼠标划入…
  • 绑定监听:当事件源上发生了某个事件,则执行某段代码

常用的监听事件

  • 键盘监听:KeyListener
  • 鼠标监听:MouseListener
  • 动作监听:ActionListener
  • 按钮对象
    • JButten 名称 = new JButton(按钮里面显示的文本);
    • 设置按钮宽高
      • 按钮名称.setBounds(X轴位置,Y轴位置,宽,高);
    • e.getSource()
      • 获取当前被操作的按钮对象

鼠标监听机制-MouseListener

Modifier and Type 方法 描述
void mouseClicked (MouseEvent e) 在组件上单击(按下并释放)鼠标按钮时调用。
void mouseEntered (MouseEvent e) 当鼠标进去组件时调用
void mouseExited (MouseEvent e) 当鼠标退出组件时调用
void mousePressed (MouseEvent e) 在组件上按下鼠标按钮时调用
void mouseReleased (MouseEvent e) 在组件上释放鼠标按钮时调用

键盘监听机制-KeyListener

Modifier and Type 方法 描述
void keyPressed (KeyEvent e) 按下键时调用
void keyReleased (KeyEvent e) 当键已被释放时调用
void keyTyped (KeyEvent e) 键入键时调用
  • 设置键盘监听事件如果设置了按下事件不松,会重复的调用该事件
  • e.getKeyCode()
    • 获取键盘上每一个按键的编号
    • a=65其他字母按顺序排序

美化页面

  1. 调整图片的位置,使其在窗口的中下方,通过给每个图片添加坐标像素来完成
  2. 给图片添加边框
    • .setBorder(new 类名)
      • BevelBorder类,控制突起和凹入的边框
      • 具体类名通过API文档查询
  3. 添加背景图片需要在最后进行添加,前面添加的图片会覆盖后面添加的图片
private void initImage() {


        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                int number = data[i][j];
                //创建一个图片对象
                //创建一个图片管理容器
                JLabel jLabel1 = new JLabel(new ImageIcon("project__one\\pintu_game\\David_Tao\\image\\two\\I-‘m-ok_"+number+".jpg"));
                //指定图片位置
                jLabel1.setBounds(105 * j+83, 105 * i+134, 105, 105);
                //给图片加上一个边框
                jLabel1.setBorder(new BevelBorder(1));
                //把容器添加到界面中
                this.getContentPane().add(jLabel1);
                //背景图片在后面添加


            }
        }
    }

移动图片

Java笔记_10(项目阶段----拼图游戏)_第2张图片

public void keyPressed(KeyEvent e) {

        int code = e.getKeyCode();
        if(code==37){
            if (y==3){
                return;
            }
            System.out.println("向左移动");
            data[x][y] = data[x][y+1];
            data[x][y+1] = 0;
            y++;
            initImage();
        } else if (code==38) {
            System.out.println("向上移动");
            //当方块在最下方时,点击向上按钮会报错
            if (x==3){
                return;
            }
            //逻辑:
            //把空白方块下方的数字赋值给空白方块
            data[x][y] = data[x+1][y];
            data[x+1][y] = 0;
            x++;
            initImage();
        } else if (code==39) {
            if (y==0){
                return;
            }
            System.out.println("向右移动");
            data[x][y] = data[x][y-1];
            data[x][y-1] = 0;
            y--;
            initImage();
        } else if (code==40) {
            if (x==0){
                return;
            }
            System.out.println("向下移动");
            data[x][y] = data[x-1][y];
            data[x-1][y] = 0;
            x--;
            initImage();
        }
    }

查看完整图片,作弊器,判断胜利

设置一个键盘监听事件

public void keyPressed(KeyEvent e) {
        int code = e.getKeyCode();
        if(code==65){
            //删除原来的图片
            this.getContentPane().removeAll();
            //创建一个图片容器
            JLabel jLabel2 = new JLabel(new ImageIcon(project+"\\all.jpg"));
            //设置图片出现的位置
            jLabel2.setBounds(83,134,420,420);
            this.getContentPane().add(jLabel2);

            this.getContentPane().repaint();
        }

    }

作弊码通过修改data数组的值来完成

if (code==87) {
            data = new int[][]{
                    {1,2,3,4},
                    {5,6,7,8},
                    {9,10,11,12},
                    {13,14,15,0}
            };

判断胜利,先定义一个函数

private boolean victory (int[][] win,int[][] data){
        for (int i = 0; i < data.length; i++) {
            for (int j = 0; j < data[i].length; j++){
                if(data[i][j]!=win[i][j]){
                    return false;
                }
            }
        }
        return true;
    }

当胜利以后,创建一个图片窗口存放胜利的图片(由于没有按图片,直接以代码形式略过)
并且在键盘事件事件中加一个return防止结束以后继续运行

if(victory(win,data)){
            return;
        }

计步器和菜单业务的实现

弹窗创建

  • 创建弹窗对象
    • JDialog 名称 = new JDialog();
  • 设置弹窗的大小
    • 弹窗对象名称.setSize(宽度,高度)
  • 弹窗不关闭则无法操作下面的界面
    • 弹窗对象名称.setModal(true)

添加ActionListener事件

public void actionPerformed(ActionEvent e) {
        Object obj =  e.getSource();
        if(obj == replayItem){
            //先将原来的界面清除
            this.getContentPane().removeAll();
            //步数清零
            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 gongzhong = new JDialog();
            //设置弹窗的宽高
            gongzhong.setSize(300,300);
            //弹窗不关闭则无法操作下面的界面
            gongzhong.setModal(true);
            //使弹窗居中显示
            gongzhong.setLocationRelativeTo(null);
            //使弹窗置顶
            gongzhong.setAlwaysOnTop(true);
            //添加弹窗
            gongzhong.setVisible(true);
        }

更换图片和登陆页面的建立

表单

  • 输入框
    • JTextField 名称 = new JTextField;
  • 密码框
    • JPasswordField 名称 = new JPasswordField;
  • 按钮对象
    • JButton 名称 = new JButton;
    • 去除按钮边框
      • 按钮名称.setBoderPainted(false);
    • 去除按钮背景
      • 按钮名称.setContentAreaFilled(false);
    • 给按钮添加图片
      • 按钮名称.setIcon();

更换图片

else if (obj==Jay) {
            //更换杰伦的图片
            this.getContentPane().removeAll();
            //改变图片路径
            project = "D:\\Java\\IDEA\\代码文件\\Project_one\\project__one\\pintu_game\\Jay_chou\\image";
            //更换number2 的值来改变图片
            Random r = new Random();
            int ran = r.nextInt(2)+1;
            number2 = ran;
            initData();
            initImage();
        }else if (obj==David) {
            //更换陶喆的图片
            project = "D:\\Java\\IDEA\\代码文件\\Project_one\\project__one\\pintu_game\\David_Tao\\image";
            //更换number2 的值来改变图片
            Random r = new Random();
            int ran = r.nextInt(2)+1;
            number2 = ran;
            initData();
            initImage();
        }

所有源码的实现

游戏规则

  1. 进入游戏必须先登录账号(账号密码在下面集合里面)
  2. 通过上下左右键在移动图片
  3. 长按A键可以查看完整图片
  4. 点击W键可以一键完成游戏
  5. 游戏完成后则不能继续进行游戏
  6. 许多附属功能在菜单的功能栏目有体现

工具类

package smulll.ui;

import java.util.Random;

public class CodeUtil {
    private CodeUtil(){}

    public static String getCOde(){
        //创建一个数组,存放大小写字母
        char[]arr= new char[52];

        for (int i = 0; i < 52; i++) {
            if(i<=25){
                //添加小写字母
                arr[i]= (char)(97+i);
            }else {
                //添加大写字母
                arr[i]=(char)(65+i-26);
            }
        }
        int[] arr2= {1,2,3,4,5,6,7,8,9,0};

        String code = "";
        //创建以一个随机数,使得抽取数组里面的数字以及字母加到字符串上
        Random r = new Random();
        for (int i = 0; i < 3; i++) {
            int index =  r.nextInt(arr.length);
            code = arr[index] + code;
        }
        System.out.println(code);
        for (int i = 0; i < 2; i++) {
            int index =  r.nextInt(arr2.length);
            code = arr2[index] + code;
        }
        System.out.println(code);
        //将字符串转换为字符数组,以便于打乱字符串的顺序
        char[] codeArr = code.toCharArray();

        for (int i = 0; i < codeArr.length; i++) {
            int index = r.nextInt(codeArr.length);

            if(index!=i){
                char c = codeArr[i];
                codeArr[i] = codeArr[index];
                codeArr[index] = c;
            }
        }
        //将字符数组再次转化为字符串,并且导出
        String code2 =  new String(codeArr);
        return code2;
    }
}

登录窗口

package smulll.ui;

import javax.swing.*;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.lang.reflect.Array;
import java.sql.SQLOutput;
import java.util.ArrayList;

public class LoginJFrame extends JFrame implements MouseListener {


    //跟登录相关的界面
    //创建事件条目对象
    JButton btn1 = new JButton("登录");
    JButton btn2 = new JButton("注册");
    JTextField username = new JTextField();
    JPasswordField jPasswordField = new JPasswordField();
    JTextField j1 = new JTextField();
    JLabel rightcode = new JLabel();
    String code = CodeUtil.getCOde();
    public LoginJFrame (){
        this.setSize(488,430);
        //设置页面标题
        this.setTitle("拼图游戏 登录界面");
        //设置页面在页面顶层
        this.setAlwaysOnTop(true);
        //页面居中
        this.setLocationRelativeTo(null);
        //设置关闭模式
        this.setDefaultCloseOperation(3);
        this.setLayout(null);
        initView();

        this.setVisible(true);
    }
    public class User{
        private String usernames ;
        private String password;
        public User() {
        }
        public User(String username, String password) {
            this.usernames = username;
            this.password = password;
        }
        public String getUsername() {
            return usernames;
        }
        public void setUsername(String username) {
            this.usernames = username;
        }
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }

        public String toString() {
            return "User{username = " + usernames + ", password = " + password + "}";
        }
    }
    private void initView(){
        JLabel usernameT = new JLabel("用户名:");
        usernameT.setBounds(116,105,200,30);
        this.getContentPane().add(usernameT);
        //创建用户名输入框

        username.setBounds(116,135,200,30);
        this.getContentPane().add(username);

        JLabel PasswordT = new JLabel("密码:");
        PasswordT.setBounds(116,170,200,30);
        this.getContentPane().add(PasswordT);
        //创建密码输入框

        jPasswordField.setBounds(116,196,200,30);
        this.getContentPane().add(jPasswordField);


        //创建验证码输入框

        j1.setBounds(116,250,70,30);
        this.getContentPane().add(j1);
        //创建验证码

        //System.out.println(code);
        //将验证码插入窗口

        //将生成的验证码添加给JLabel
        rightcode.setText(code);
        rightcode.setBounds(200,250,70,30);
        this.getContentPane().add(rightcode);

        //创建两个按钮

        btn1.setBounds(116,300,60,30);
        //去除按钮背景
        //btn1.setContentAreaFilled(flase);
        //去除按钮边框
        //btn1.setBorderPainted(false);
        this.getContentPane().add(btn1);


        btn2.setBounds(260,300,60,30);
        //去除按钮背景
        //btn2.setContentAreaFilled(flase);
        //去除按钮边框
        //btn2.setBorderPainted(false);
        this.getContentPane().add(btn2);

        //给两个按钮添加事件
        btn1.addMouseListener(this);
        btn2.addMouseListener(this);
        //给验证码窗口添加鼠标事件
        rightcode.addMouseListener(this);
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        //通过集合的方式装载用户信息
        ArrayList<User> user2 = new ArrayList<>();
        User u1 = new User("Smulll","123456");
        User u2 = new User("laohuang","112233");

        user2.add(u1);
        user2.add(u2);
        //建立两个数组在装在集合成员信息
        String[] userNamearr = new String[user2.size()];
        String[] userPassword = new String[user2.size()];

        for (int i = 0; i < user2.size(); i++) {
            userNamearr[i] = user2.get(i).usernames;
        }
        for (int i = 0; i < user2.size(); i++) {
            userPassword[i] = user2.get(i).password;
        }

        String password = new String(jPasswordField.getPassword());

        //获取用户点击事件焦点
        Object c = e.getSource();
        if(c == btn1){
            //点击了登录按钮
            System.out.println("点击了登录按钮");
            if(!(j1.getText().equals(code))){
                viewError("验证码输入错误");
                rightcode.removeAll();
                code = CodeUtil.getCOde();
                j1.setText("");
                initView();
                return;
            } else if ((userError(username.getText(),userNamearr))) {
                System.out.println(username.getText());
                viewError("用户名输入错误");
                username.setText("");
                jPasswordField.setText("");
                return;
            } else if ((userError(password,userPassword))) {
                viewError("密码输入错误");
                jPasswordField.setText("");
                return;
            }
            this.dispose();

            new GameJFrame();

        } else if (c == btn2) {
            //点击了注册按钮
            System.out.println("点击了注册按钮");
            
        }else if(c==rightcode){
            //点击了验证码
            System.out.println("点击了验证码");
            rightcode.removeAll();
            code = CodeUtil.getCOde();
            j1.setText("");
            initView();
        }
    }
    @Override
    public void mousePressed(MouseEvent e) {

    }
    @Override
    public void mouseReleased(MouseEvent e) {

    }
    @Override
    public void mouseEntered(MouseEvent e) {

    }
    @Override
    public void mouseExited(MouseEvent e) {

    }
    //弹窗显示函数
    public static void viewError(String count){
        JDialog gongzhong = new JDialog();
        //设置弹窗的宽高
        gongzhong.setSize(100,60);
        //弹窗不关闭则无法操作下面的界面
        gongzhong.setModal(true);
        //使弹窗居中显示
        gongzhong.setLocationRelativeTo(null);
        //使弹窗置顶
        gongzhong.setAlwaysOnTop(true);
        //创建一个窗口
        JLabel jLabel = new JLabel(count);
        //设置窗口大小
        jLabel.setBounds(0,0,100,30);
        //添加窗口到弹窗中
        gongzhong.getContentPane().add(jLabel);
        //弹窗显现
        gongzhong.setVisible(true);
    }
    public static boolean userError(String user, String[] arr){
        for (int i = 0; i < arr.length; i++) {
            if(!(user.equals(arr[i]))){
                return false;
            }
        }
        return true;
    }
}

注册窗口(些许功能目前难以实现)

  • 目前以几个的增减进行用户的管理
package smulll.ui;

import javax.swing.*;

public class RegisterFrame extends JFrame {


    //跟注册相关的代码
    public RegisterFrame (){
        this.setSize(488,500);
        //设置页面标题
        this.setTitle("拼图游戏 注册界面");
        //设置页面在页面顶层
        this.setAlwaysOnTop(true);
        //页面居中
        this.setLocationRelativeTo(null);
        //设置关闭模式
        this.setDefaultCloseOperation(3);
        this.setVisible(true);
    }
}

游戏窗口

package smulll.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.time.temporal.Temporal;
import java.util.Random;

public class GameJFrame extends JFrame implements KeyListener, ActionListener {
    //跟游戏相关的界面
    //创建一个二维数组
    int[][] data = new int[4][4];
    //设置胜利时的图片下标索引
    int[][] win= {
            {1,2,3,4},
            {5,6,7,8},
            {9,10,11,12},
            {13,14,15,0}
    };
    //找到0索引位置的图片
    int x = 0;
    int y = 0;
    //设置要放置的图片
    String project = "D:\\Java\\IDEA\\代码文件\\Project_one\\project__one\\pintu_game\\David_Tao\\image";
    //创建一个计步器
    int step = 0;
    //创建图片切换的number2
    int number2=1;
    //创建选项下面的条目对象
    JMenuItem replayItem = new JMenuItem("重新游戏");
    JMenuItem reloginItem = new JMenuItem("重新登录");
    JMenuItem closeItem = new JMenuItem("关闭游戏");
    JMenuItem accountItem = new JMenuItem("公众号");
    JMenuItem Jay = new JMenuItem("Jay");
    JMenuItem David = new JMenuItem("David");
    public GameJFrame() {
        //初始化界面
        initJFrame();
        //初始化菜单
        initJFrameBar();
        //打乱图片
        initData();
        //初始化图片
        initImage();
        //使窗口显示出来
        this.setVisible(true);
    }

    private void initData() {
        int[] tempArr = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0};
        //打乱图片的顺序
        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;
        }
        //把一维数组的数添加到二维数组中
        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(win,data)){
                System.out.println("你胜利了");
            }
            //创建一个显示并步数的窗口
        JLabel j2 = new JLabel("步数:"+step);
            j2.setBounds(50,30,100,20);

            this.getContentPane().add(j2);


        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                int number = data[i][j];
                //创建一个图片对象
                //创建一个图片管理容器
                JLabel jLabel1 = new JLabel(new ImageIcon(project+"\\"+number2+"\\"+number+".jpg"));
                //指定图片位置
                jLabel1.setBounds(105 * j+83, 105 * i+134, 105, 105);
                //给图片加上一个边框
                jLabel1.setBorder(new BevelBorder(1));
                //把容器添加到界面中
                this.getContentPane().add(jLabel1);
                //背景图片在后面添加
                this.getContentPane().repaint();
            }
        }
    }

    private void initJFrame() {
        this.setSize(603, 680);
        //设置页面标题
        this.setTitle("拼图游戏 v1.0");
        //设置页面在页面顶层
        this.setAlwaysOnTop(true);
        //页面居中
        this.setLocationRelativeTo(null);
        //设置关闭模式
        this.setDefaultCloseOperation(3);
        //取消默认居中放置
        this.setLayout(null);
        //给整个窗口添加一个键盘事件
        this.addKeyListener(this);
    }
    private void initJFrameBar(){
        //创建一个菜单
        JMenuBar jMenuBar = new JMenuBar();
        //创建菜单选项
        JMenu functionJMenu = new JMenu("功能");
        JMenu aboutJMenu = new JMenu("关于我们");
        JMenu replacement = new JMenu("更换图片");

        //添加到功能项目之下
        functionJMenu.add(replacement);
        functionJMenu.add(replayItem);
        functionJMenu.add(reloginItem);
        functionJMenu.add(closeItem);
        //添加更换图片目录
        replacement.add(Jay);
        replacement.add(David);
        //添加关于我们目录
        aboutJMenu.add(accountItem);
        //添加选项到菜单中
        jMenuBar.add(functionJMenu);
        jMenuBar.add(aboutJMenu);

        //给菜单选项添加事件
        replayItem.addActionListener(this);
        reloginItem.addActionListener(this);
        closeItem.addActionListener(this);
        accountItem.addActionListener(this);
        Jay.addActionListener(this);
        David.addActionListener(this);
        //添加菜单
        this.setJMenuBar(jMenuBar);

    }

    @Override
    public void keyTyped(KeyEvent e) {

    }
    @Override
    public void keyReleased(KeyEvent e) {
        //如果胜利了直接写return,使整个方法结束
        if(victory(win,data)){
            return;
        }
        int code = e.getKeyCode();
        if(code==37){
            if (y==3){
                return;
            }
            System.out.println("向左移动");
            data[x][y] = data[x][y+1];
            data[x][y+1] = 0;
            y++;
            //每走一步就会给步数加1
            step=step+1;
            initImage();

        } else if (code==38) {
            System.out.println("向上移动");
            //当方块在最下方时,点击向上按钮会报错
            if (x==3){
                return;
            }
            //逻辑:
            //把空白方块下方的数字赋值给空白方块
            data[x][y] = data[x+1][y];
            data[x+1][y] = 0;
            x++;
            //每走一步就会给步数加1
            step=step+1;
            initImage();
        } else if (code==39) {
            if (y==0){
                return;
            }
            System.out.println("向右移动");
            data[x][y] = data[x][y-1];
            data[x][y-1] = 0;
            y--;
            //每走一步就会给步数加1
            step=step+1;
            initImage();
        } else if (code==40) {
            if (x==0){
                return;
            }
            System.out.println("向下移动");
            data[x][y] = data[x-1][y];
            data[x-1][y] = 0;
            x--;
            //每走一步就会给步数加1
            step=step+1;
            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();
        }
    }
    @Override
    public void keyPressed(KeyEvent e) {
        int code = e.getKeyCode();
        if(code==65){
            //删除原来的图片
            this.getContentPane().removeAll();
            //创建一个图片容器
            JLabel jLabel2 = new JLabel(new ImageIcon(project+"\\all.jpg"));
            //设置图片出现的位置
            jLabel2.setBounds(83,134,420,420);
            this.getContentPane().add(jLabel2);

            this.getContentPane().repaint();
        }

    }

    private boolean victory (int[][] win,int[][] data){
        for (int i = 0; i < data.length; i++) {
            for (int j = 0; j < data[i].length; j++){
                if(data[i][j]!=win[i][j]){
                    return false;
                }
            }
        }
        return true;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        Object obj =  e.getSource();
        if(obj == replayItem){
            //先将原来的界面清除
            this.getContentPane().removeAll();
            //步数清零
            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 gongzhong = new JDialog();
            //设置弹窗的宽高
            gongzhong.setSize(300,300);
            //弹窗不关闭则无法操作下面的界面
            gongzhong.setModal(true);
            //使弹窗居中显示
            gongzhong.setLocationRelativeTo(null);
            //使弹窗置顶
            gongzhong.setAlwaysOnTop(true);
            //添加弹窗
            gongzhong.setVisible(true);
        } else if (obj==Jay) {
            //更换杰伦的图片
            this.getContentPane().removeAll();
            //改变图片路径
            project = "D:\\Java\\IDEA\\代码文件\\Project_one\\project__one\\pintu_game\\Jay_chou\\image";
            //更换number2 的值来改变图片
            Random r = new Random();
            int ran = r.nextInt(2)+1;
            number2 = ran;
            initData();
            initImage();
        }else if (obj==David) {
            //更换陶喆的图片
            project = "D:\\Java\\IDEA\\代码文件\\Project_one\\project__one\\pintu_game\\David_Tao\\image";
            //更换number2 的值来改变图片
            Random r = new Random();
            int ran = r.nextInt(2)+1;
            number2 = ran;
            initData();
            initImage();
        }
    }
}

进入游戏的入口

import com.sun.source.tree.NewArrayTree;
import smulll.ui.GameJFrame;
import smulll.ui.LoginJFrame;
import smulll.ui.RegisterFrame;

public class App {
    public static void main(String[] args) {
        new LoginJFrame();
        //new GameJFrame();
        //new RegisterFrame();
    }
}

效果展示
Java笔记_10(项目阶段----拼图游戏)_第3张图片
Java笔记_10(项目阶段----拼图游戏)_第4张图片

你可能感兴趣的:(java,笔记,前端)