文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java实现空指针后的猜拳游戏

2024-04-02 19:55

关注

前言

“java.lang.NullPointerException” 空指针异常可以说是Java程序最容易出现的异常了,我写了一个 IDEA 插件,每当程序出现空指针异常时就会弹出一个“猜拳游戏”窗口,该窗口不能直接关闭,只有当你游戏获胜时,窗口才会自动关闭。

作用是啥?

嘲讽罢了。

插件实现

创建项目

IDEA 创建一个插件开发项目非常方便,已经内置了。

猜拳游戏实现

很简单。

实现原理:提供3个按钮,分别为“石头、剪刀、布”,对应值“1、2、3”,再为按钮绑定点击事件,按键点击之后调用处理函数传入对应的值即可。

处理函数 handle(int selectedValue) 的实现:利用随机数随机为电脑生成一个值与用户选择的值做比较,“石头赢剪刀、剪刀赢布、布赢石头”,然后显示游戏结果,用户获胜时会触发回调函数(用于关闭弹窗)。

package cn.xeblog.mora.ui;

import javax.swing.*;
import java.awt.*;
import java.util.Random;


public class MoraGame extends JPanel {

    
    private Runnable runnable;

    
    private JLabel tipsLabel;

    
    private boolean isOver;

    public MoraGame(Runnable runnable) {
        setMinimumSize(new Dimension(250, 100));
        setLayout(new BorderLayout());
        this.runnable = runnable;
        init();
    }

    private void init() {
        this.tipsLabel = new JLabel("请出拳!", JLabel.CENTER);
        this.tipsLabel.setPreferredSize(new Dimension(250, 50));
        this.tipsLabel.setFont(new Font("", 0, 15));
        this.tipsLabel.setForeground(new Color(255, 128, 128));

        JButton stoneButton = new JButton("石头");
        JButton shearsButton = new JButton("剪刀");
        JButton clothButton = new JButton("布");

        stoneButton.setFocusPainted(false);
        stoneButton.setBorderPainted(false);
        stoneButton.addActionListener(l -> handle(1));

        shearsButton.setFocusPainted(false);
        shearsButton.setBorderPainted(false);
        shearsButton.addActionListener(l -> handle(2));

        clothButton.setFocusPainted(false);
        clothButton.setBorderPainted(false);
        clothButton.addActionListener(l -> handle(3));

        JPanel centerPanel = new JPanel();
        centerPanel.setPreferredSize(new Dimension(250, 30));
        centerPanel.add(stoneButton);
        centerPanel.add(shearsButton);
        centerPanel.add(clothButton);

        add(tipsLabel, BorderLayout.NORTH);
        add(centerPanel, BorderLayout.CENTER);
    }

    private void handle(int selectedValue) {
        if (isOver) {
            return;
        }

        int value = new Random().nextInt(3) + 1;
        boolean isWin = selectedValue == (value - 1 == 0 ? 3 : value - 1);

        String result;
        if (isWin) {
            isOver = true;
            result = "你赢~";
        } else if (selectedValue == value) {
            result = "平局~";
        } else {
            result = "电脑赢~";
        }
        showTips("电脑 -> " + getText(value) + ",你 -> " + getText(selectedValue) + "," + result);

        if (isWin) {
            new Thread(() -> {
                try {
                    Thread.sleep(800);
                    this.runnable.run();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }).start();
        }
    }

    private String getText(int value) {
        switch (value) {
            case 1:
                return "石头";
            case 2:
                return "剪刀";
            case 3:
                return "布";
        }

        return "";
    }

    private void showTips(String tips) {
        tipsLabel.setText(tips);
    }

}

游戏弹窗实现

将窗口设置为不可关闭,传递弹窗关闭回调函数到游戏处理对象。

package cn.xeblog.mora.ui;

import com.intellij.openapi.ui.DialogWrapper;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import javax.swing.*;


public class MoraDialog extends DialogWrapper {

    public MoraDialog() {
        super(true);
        setTitle("猜拳游戏?");
        setResizable(false);
        setCrossClosesWindow(false);
        init();
    }

    @Override
    protected @Nullable JComponent createCenterPanel() {
        return new MoraGame(() -> SwingUtilities.invokeLater(() -> this.close(0)));
    }

    @Override
    protected @NotNull Action[] createActions() {
        return new Action[]{};
    }

}

监听空指针异常

实现控制台过滤接口,判断控制台的输出内容是否包含 java.lang.NullPointerException ,如果包含则弹出游戏窗口。

package cn.xeblog.mora.filter;

import cn.xeblog.mora.ui.MoraDialog;
import com.intellij.execution.filters.ConsoleFilterProvider;
import com.intellij.execution.filters.Filter;
import com.intellij.openapi.project.Project;
import org.jetbrains.annotations.NotNull;

import javax.swing.*;


public class ConsoleFilter implements ConsoleFilterProvider {

    @Override
    public Filter @NotNull [] getDefaultFilters(@NotNull Project project) {
        return new Filter[]{(line, entireLength) -> {
            if (line.contains("java.lang.NullPointerException")) {
                SwingUtilities.invokeLater(() -> new MoraDialog().show());
            }

            return null;
        }};
    }

}

注册过滤器

plugin.xml 添加我们自定义的控制台过滤器实现。

    <extensions defaultExtensionNs="com.intellij">
        <consoleFilterProvider implementation="cn.xeblog.mora.filter.ConsoleFilter"/>
    </extensions>

安装插件

插件打包

Gradle -> Tasks -> build -> assemble

打包之后的文件位于项目的 build 目录下:build/distributions/xxx.zip

插件安装

进入插件中心,选择本地文件安装即可。

演示

会出现空指针的代码

    public static void main(String[] args) {
        Object obj = null;
        System.out.println(obj.toString());
    }

运行之后

当我猜拳赢了之后,窗口就自动关闭了。

最后

完整代码:https://github.com/anlingyi/Mora

到此这篇关于Java实现空指针后的猜拳游戏的文章就介绍到这了,更多相关Java猜拳游戏内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯