Java练手小项目拼图小游戏 从代码到打包成.exe完整教程

目录

 前言

 下载地址:

 分析业务

主界面:

主界面代码实现:

 登录界面

登录界面代码实现:

注册界面 

注册界面代码实现 

业务逻辑分析: 

 登录完整代码

注册完整代码 

 主页面主要代码:

 打包成.exe

准备软件

将代码打包成jar包 


 

 前言

学习了这么长时间JAVA,都是一个模块一个模块的学习,不知道自己到底掌握了多少知识点,虽然早已经将JAVA基础部分学习完毕,但我一直都不敢说自己有JAVA基础。

以前写过几个小案例(简易版学生管理系统、康小汪双色球彩票系统),都觉得so easy,也确实非常简单,我觉得只要有一丢丢JAVA基础的人都能写出来。但是,这一次不一样!!!

这个小项目将封装、继承、多态、抽象类、接口、内部类、集合、字符串、数组、循环、判断等等知识点综合起来,可以锻炼我们的思维能力,了解前面学习的知识点在实际开发中的应用场景。所以一定要多敲代码,多练项目。

演示视频;https://live.csdn.net/v/317795Java练手小项目 演示视频https://live.csdn.net/v/317795

 下载地址:

我已经将打包好的.exe文件放在了百度网盘里,可以下载安装

 链接:https://pan.baidu.com/s/1T9OihEC5wPVfV96RH0mWgA?pwd=c6mj 
提取码:c6mj

 分析业务

主界面:

可以发现,我们的游戏主界面包括了 最外层的窗体,菜单栏还有菜单条目,当我们点击菜单栏或者菜单条目的相应按键时,就会触发不同的效果。

比如:我们点击了菜单中的关闭游戏,整个程序就会停止运行并且关闭主界面。

那么,怎么实现这个窗口呢。

首先,我们需要创建最外层的窗体,接着创建菜单对象,创建菜单中的选项对象,创建菜单选项中条目的对象,将每个选项中的条目添加到选项中,将选项添加到菜单中,最后在给整个界面设置菜单就ok了。

主界面代码实现:

创建一个宽1125像素,高1125像素的游戏主界面:

//初始化最外层窗体
private void initJFgame() {
        //设置主界面的宽高
        this.setSize(1125,1125);
        //设置主界面标题
        this.setTitle("单机拼图游戏 v1.0");
        //设置主界面置顶
        this.setAlwaysOnTop(true);
        //设置主界面居中
        this.setLocationRelativeTo(null);
        //设置主界面关闭模式
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //取消默认居中放置,只有取消了才会按照XY轴的方式添加组件
        this.setLayout(null);
        //给整个界面添加键盘监听事件
        this.addKeyListener(this);
        //设置主界面显示,建议放在最后一行
        this.setVisible(true);


    }

创建菜单对象,创建菜单中的选项对象,创建菜单选项中条目的对象,将每个选项中的条目添加到选项中,将选项添加到菜单中,最后在给整个界面设置菜单 

        //创建菜单对象
        JMenuBar jMenuBar = new JMenuBar();

        //创建菜单中的选项对象
        JMenu functionjMenu = new JMenu("菜单");
        JMenu aboutjMenu = new JMenu("关于我们");
        JMenu helpjMenu = new JMenu("帮助");
        JMenu choosejMenu = new JMenu("类别");

        //创建菜单选项中条目的对象
        JMenuItem rePlay = new JMenuItem("重新游戏");
        JMenuItem reLogin = new JMenuItem("重新登录");
        JMenuItem closeGame = new JMenuItem("关闭游戏");
        JMenuItem beautyGame = new JMenuItem("美女");
        JMenuItem animalGame = new JMenuItem("动物");
        JMenuItem carGame = new JMenuItem("汽车");
        JMenuItem helpGame = new JMenuItem("操作教程");
        JMenuItem contactOur = new JMenuItem("联系我们");

        //将每个选项中的条目添加到选项中
        functionjMenu.add(choosejMenu);
        functionjMenu.add(rePlay);
        functionjMenu.add(reLogin);
        functionjMenu.add(closeGame);
        choosejMenu.add(beautyGame);
        choosejMenu.add(animalGame);
        choosejMenu.add(carGame);
        helpjMenu.add(helpGame);
        aboutjMenu.add(contactOur);

        //将选项添加到菜单中
        jMenuBar.add(functionjMenu);
        jMenuBar.add(aboutjMenu);
        jMenuBar.add(helpjMenu);
        //给整个界面设置菜单
        this.setJMenuBar(jMenuBar);

到这里,主界面就算创建完成了,要想利用鼠标点击或键盘输入触发不同的效果,还要给每个条目绑定不同的事件,具体代码看全部代码吧。 

 登录界面

 

这里的登录界面有登录按钮和注册按钮,所以我们需要创建两个按钮对象。同时有用户名输入框和密码输入框还有验证码输入框,我们需要创建 相应的输入框对象。

这里的验证码是我自己写的一个类,专门用于生成验证码,支持生成同时含有字母大小写和数字的总共五位的验证码,数字出现的位置是随机的,每个位置都有可能。

登录界面代码实现:

 这是最外层窗体:

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

这是创建的登录 注册 按钮,以及相应的输入框

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

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

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

当输入相应的用户名和密码后点击登录按钮,就会进入主界面,当点击注册按钮则会进入注册界面,点击验证码时,验证码会发生变化。

当然,需要点击有效,我们要给两个按钮绑定相应的事件。

这是绑定相应事件的代码:

        //给验证码框绑定鼠标事件
        rightCode.addMouseListener(this);
        //给登录按钮绑定鼠标事件
        login.addMouseListener(this);
        //给注册按钮绑定鼠标事件
        register.addMouseListener(this);

这是对接口MouseListener中方法的重写:

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

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

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

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


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


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

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

    }

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

    }

注册界面 

注册界面包含注册 重置 按钮,还有用户名 密码 确认密码 输入框,所以我们要创建相应的按钮对象和输入框,当我们输入用户名密码 确认密码,点击注册后,就会弹出如上界面,当我们点击登录时,就会跳转到登录界面,就可以用我们刚才注册的用户名和密码进行登录了。 

注册界面代码实现 

最外层窗体:

 private void initJFrame() {
        this.setSize(500,550);
        //设置界面的标题
        this.setTitle("拼图 注册");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置关闭模式
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //让显示显示出来,建议写在最后
        this.setVisible(true);
    }

这是注册 重置 按钮,以及相应的输入框:

    JButton jButton = new JButton("注册成功");
    JDialog jDialog = new JDialog();
    JButton register = new JButton();
    JButton resetting = new JButton();
    JTextField username = new JTextField();
    JPasswordField password = new JPasswordField();
    JPasswordField rpassword = new JPasswordField();

同样的, 

需要点击有效,我们要给两个按钮绑定相应的事件。

这是绑定相应事件的代码:

//给注册按钮绑定鼠标事件
        register.addMouseListener(this);
//给重置按钮绑定鼠标事件
        resetting.addMouseListener(this);
//给登录按钮绑定鼠标事件
        jButton.addMouseListener(this);

这是点击注册后弹窗的代码实现:

 public void rshowJDialog(String content) {
        //创建一个弹框对象

        //给弹框设置大小
        jDialog.setSize(250, 200);
        //让弹框置顶
        jDialog.setAlwaysOnTop(true);
        //让弹框居中
        jDialog.setLocationRelativeTo(null);
        //弹框不关闭永远无法操作下面的界面
        jDialog.setModal(true);

        //创建Jlabel对象管理文字并添加到弹框当中
        JLabel warning = new JLabel(content);
        warning.setBounds(50, -100, 0, 0);
        jDialog.getContentPane().add(warning);
        //5.添加登录按钮
        jButton.setBounds(130, 120, 128, 47);
        jButton.setIcon(new ImageIcon("image\\login\\登录按钮.png"));
        //去除按钮的边框
        jButton.setBorderPainted(false);
        //去除按钮的背景
        jButton.setContentAreaFilled(false);
        //给登录按钮绑定鼠标事件
        jButton.addMouseListener(this);
        jDialog.getContentPane().add(jButton);

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

到这里,所有的界面设置完成,接下来就是业务逻辑分析。

业务逻辑分析: 

 首先,我们想,怎样实现移动界面中图片的位置?

当然是二维数组了,试想一下,我们将每张图片对应二维数组中的每个元素,如果二维数组之间的元素发生位置变化,我们的图片不就也发生了位置的变化吗? 

那么,我们就要创建一个二维数组了,并且要将二维数组进行随机打乱顺序处理,因为我们的图片是随机分布的。

首先,创建一个一维数组,里面按顺序存放9个元素,0~8。

int[] tempArr = {0,1,2,3,4,5,6,7,8};

然后再创建一个二维数组,将一维数组中的元素随机的添加到二维数组中。

 private void initDate() {
        int[] tempArr = {0,1,2,3,4,5,6,7,8};
        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 / 3;
                y = i % 3;
            }
            arr[i/3][i%3] = tempArr[i];
        }
    }

这样,每次调用这个方法,二维数组都是不一样的。

接下来要做的就是将每一张图片对应到每个元素上,我们将图片命名成 数字.png 的方式,这样就会按照二维数组中存放的元素去找照片了

for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                int num = arr[i][j];
                //创建图片的Imageicon的对象
                ImageIcon icon = new ImageIcon(path2 +num+".png");
                //创建jLabel的对象
                JLabel jLabel = new JLabel(icon);
                //指定图片添加的位置
                jLabel.setBounds(375 * j,375 * i,375,375);
                //给图片添加边框
                jLabel.setBorder(new BevelBorder(BevelBorder.RAISED));
                //将管理容器添加到页面中
                //this.add(jLabel);
                this.getContentPane().add(jLabel);
            }
        }

那么,又怎么判断游戏的输赢呢?

也很简单,我们创建一个二维数组,里面按顺序存放0~8的元素,每移动一次图片,我们就让两个二维数组进行一次比较,如果相同了,就说明游戏结束,弹出相应的提示,否则继续游戏。

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

 简单的游戏逻辑就是这样,需要完整的游戏代码可以私信我!

 登录完整代码

package com.itkxw.ui;

import com.itkxw.domain.User;
import com.itheima.util.CodeUtil;

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

public class LoginJFrame extends JFrame implements MouseListener {

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


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

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

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


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

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


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

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

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

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

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

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


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

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


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

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

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


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

    }


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



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

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

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

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


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


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

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

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

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


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

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

    }

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

    }

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


}

注册完整代码 

package com.itkxw.ui;
import com.itkxw.domain.User;
import javax.swing.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import com.itkxw.ui.LoginJFrame;

public class RegisterJFrame extends JFrame implements MouseListener {
    JButton jButton = new JButton("注册成功");
    JDialog jDialog = new JDialog();
    JButton register = new JButton();
    JButton resetting = new JButton();
    JTextField username = new JTextField();
    JPasswordField password = new JPasswordField();
    JPasswordField rpassword = new JPasswordField();
    //跟注册相关的代码,都写在这个界面中
    public RegisterJFrame(){
        //初始化界面
        initJFrame();
        //在这个界面中添加内容
        initView();
        //让显示显示出来,建议写在最后
        this.setVisible(true);


        getContentPane();
    }

    private void initJFrame() {
        this.setSize(500,550);
        //设置界面的标题
        this.setTitle("拼图 注册");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置关闭模式
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

    private void initView() {
        //添加用户文字
        JLabel userNameText = new JLabel(new ImageIcon("image\\register\\注册用户名.png"));
        userNameText.setBounds(100, 164, 79, 17);
        this.getContentPane().add(userNameText);

        //2.添加用户名输入框
        username.setBounds(195, 160, 200, 30);
        this.getContentPane().add(username);

        //3.添加密码文字
        JLabel passwordText = new JLabel(new ImageIcon("image\\register\\注册密码.png"));
        passwordText.setBounds(100, 205, 66, 16);
        this.getContentPane().add(passwordText);

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

        //3.添加确认密码文字
        JLabel rpasswordText = new JLabel(new ImageIcon("image\\register\\再次输入密码.png"));
        rpasswordText.setBounds(90, 245, 96, 17);
        this.getContentPane().add(rpasswordText);

        //4.确认密码输入框
        rpassword.setBounds(195, 235, 200, 30);
        this.getContentPane().add(rpassword);

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

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


        JLabel background = new JLabel(new ImageIcon("image\\register\\background.png"));
        background.setBounds(0, 0, 470, 390);
        this.getContentPane().add(background);
    }

    //点击
    @Override
    public void mouseClicked(MouseEvent e) {
        Object source = e.getSource();
        if (source == register){
            System.out.println("点击了注册按钮");
            //获取输入框的内容
            String userNameText = username.getText();
            String passwordText = password.getText();
            String rpasswordText = rpassword.getText();
            //创建一个USER对象
            User user = new User(userNameText,passwordText);
            System.out.println("用户输入的用户名为" + userNameText);
            System.out.println("用户输入的密码为" + passwordText);

            if (userNameText.length() == 0 && passwordText.length() == 0){
                System.out.println("用户名或者密码为空");
                //调用showJDialog方法并展示弹框
                showJDialog("用户名或者密码为空");
            } else if (!(passwordText.equals(rpasswordText))) {
                System.out.println("两次密码输入不一致");
                //调用showJDialog方法并展示弹框
                showJDialog("两次密码输入不一致");
            } else if (source == jButton) {
                System.out.println("点击了登录按钮");
                this.setVisible(false);
                new LoginJFrame();
            } else {
                LoginJFrame.kk(user);
                //调用showJDialog方法并展示弹框
                rshowJDialog("注册成功");
            }
        }

    }
    //按下不松
    @Override
    public void mousePressed(MouseEvent e) {

    }
    //松开按钮
    @Override
    public void mouseReleased(MouseEvent e) {
        Object source = e.getSource();
        if (source == jButton){
            System.out.println("点击了登录按钮");
            this.setVisible(false);
            jDialog.setVisible(false);
            new LoginJFrame();
        }
    }
    //鼠标划入
    @Override
    public void mouseEntered(MouseEvent e) {

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

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

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

        //让弹框展示出来
        jDialog.setVisible(true);
    }
    public void rshowJDialog(String content) {
        //创建一个弹框对象

        //给弹框设置大小
        jDialog.setSize(250, 200);
        //让弹框置顶
        jDialog.setAlwaysOnTop(true);
        //让弹框居中
        jDialog.setLocationRelativeTo(null);
        //弹框不关闭永远无法操作下面的界面
        jDialog.setModal(true);

        //创建Jlabel对象管理文字并添加到弹框当中
        JLabel warning = new JLabel(content);
        warning.setBounds(50, -100, 0, 0);
        jDialog.getContentPane().add(warning);
        //5.添加登录按钮
        jButton.setBounds(130, 120, 128, 47);
        jButton.setIcon(new ImageIcon("image\\login\\登录按钮.png"));
        //去除按钮的边框
        jButton.setBorderPainted(false);
        //去除按钮的背景
        jButton.setContentAreaFilled(false);
        //给登录按钮绑定鼠标事件
        jButton.addMouseListener(this);
        jDialog.getContentPane().add(jButton);

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

 主页面主要代码:

这都是对方法的封装

 public GameJf(){

        //初始化界面
        initJFgame();

        //初始化菜单
        initJFMenuBar();

        //初始化数据
        initDate();

        //初始化图片
        initImage();



        //设置主界面显示,建议放在最后一行
        this.setVisible(true);
    }

 打包成.exe

准备软件

  1. Idea:将代码打包成jar包(java形式的压缩包)
  2. exe4j:将jar包转换成exe的工具。
  3. innosetup:将游戏用到的图片,Java的运行环境和第二步打包的代码,组合成最终的安装程序。

这里需要的软件在最后我都会分享给大家一个链接,点击下载安装即可。 

将代码打包成jar包 

1.点击File,再点Project Structure。


2.点击Artifaces。


3.下方图片箭头指向位置应为空白,如果有其他内容,可以选中之后,点击减号删除。

 4.选中左侧的Artifacts,点击中间上方位置的+, 点击JAR,点击From modules with dependencies...
如下图所示:

5.Module:选择要打包的项目。 

6.Main Class:点击红框最后的那个小图标,项目中是哪个main方法所在的类去启动项目,这里就选择哪个类。我的项目是由com.itkxw.ui.App里面的main方法启动的,所以我就选择com.itkxw.ui.App 

7.设置 META-INF/MANIFEST.MF。点击箭头指向的图标进行设置。 然后ok。

8.出现一个puzzlegame:jar的提示。点击右下角的OK。

 9.在idea主界面上方,点击Build里面的Build Artifacts。如果是灰色的不能按,请确定在上面第一步~第九步有没有配置好jar包的信息。如果已经配置好了jar的信息,此处就可以正常点击。

 10.在主界面正中央。选择puzzlegame:jar。再选择Build。idea会帮我们生成jar包。

11.等页面右下角的进度条结束,jar就已经生成完毕。 

 12.点击File,再点Project Structure。点击Artifaces。在下图红色框中的路径下,可以找到生成好的jar包。

第一步:代码打包成jar包

第二步整合资源文件 

第三步:将jar包打包成exe 

第四步:将jdk、资源文件、jar包转换后的exe三者再次打包成最终的exe。 

这些步骤请点击链接获取。 

 链接:https://pan.baidu.com/s/1BidJgpN8x-jRnktzik0b-g?pwd=nyku 
提取码:nyku

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
拼图 原创 游戏 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { Random r = new Random();//随机种子 Point pi = new Point();//出界返回 Point[] pt = new Point[8];//判断胜负 string[] st = new string[8];//判断胜负 public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { pictureBox1.Left -= 800; tianjia(); panduan(); } void tianjia()//添加图片 { string si;//获取坐标 int i = 7;//图片数量 int n = 0;//变量 string[] s = { "000000", "000100", "000200", "100000", "100100", "100200", "200000", "200100"}; ComboBox cb = new ComboBox(); ComboBox cc = new ComboBox(); cb.Items.AddRange(s);//确定坐标 cc.Items.AddRange(s);//确定图像 for (n = 0; n < 8; n++) { PictureBox p = new PictureBox();//创建拼图 p.Name = "i" + i; p.Size = new Size(100, 100); p.BackColor = Color.Red; si = cb.Items[r.Next(0,i)].ToString();//打乱拼图坐标 p.Location = new Point(Convert.ToInt32(si) / 1000, Convert.ToInt32(si) % 1000); cb.Items.Remove(si); Bitmap bit = new Bitmap(99, 99);//给拼图添加背景图片 Graphics g = Graphics.FromImage(bit); g.DrawImageUnscaled(pictureBox1.Image, -Convert.ToInt32(cc.Items[i]) / 1000, -Convert.ToInt32(cc.Items[i]) % 1000); p.Image = bit; Controls.Add(p);//把拼图画到窗体上 pt[n] = new Point(Convert.ToInt32(cc.Items[i]) / 1000, Convert.ToInt32(cc.Items[i]) % 1000); st[n] = p.Name; i--; } } private void Form1_KeyPress(object sender, KeyPressEventArgs e) { pi = pictureBox2.Location; string key = e.KeyChar.ToString(); switch (key)//图片移动 { case "w": pictureBox2 .Top -= 100; break; case "s": pictureBox2.Top += 100; break; case "a": pictureBox2.Left -= 100; break; case "d": pictureBox2.Left += 100; break; } if (pictureBox2.Location.X < 0 || pictureBox2.Location.X > 200 || pictureBox2.Location.Y < 0 || pictureBox2.Location.Y > 200) pictureBox2.Location = pi;//判断出界 foreach (Control i in Controls)//反向移动 if (i.Location == pictureBox2.Location&&i.Name!="pictureBox2") { switch (key) { case "w": i.Top += 100; break; case "s": i.Top -= 100; break; case "a": i.Left += 100; break; case "d": i.Left -= 100; break; } } panduan(); } void panduan() { int ai = 0; for (int n = 0; n < 8; n++) foreach (Control i in Controls) if (i.Name == st[n] && i.Location == pt[n]) ai++; label1.Text = ai.ToString(); if (ai == 8) { MessageBox.Show("恭喜你,通关了"); Close(); } } private void button1_Click(object sender, EventArgs e) { if (pictureBox1.Location.X == -800) pictureBox1.Left += 800; else pictureBox1.Left -= 800; } } }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值