基于JAVA的课程设计《智能捡火柴小程序》

因为时间较长,内容较多,仅提供代码进行沟通交流,因为笔者水平不足,仍然有较多的bug没有进行处理,不提供代码运行界面以及界面的图片

Main:

package 智能捡火柴小游戏;

class Main {
    public static void main(String[] args) {
        new Display().DisplayIt();
    }
}

Config:

package 智能捡火柴小游戏;

class Config {
    private boolean isStart;
    private String aiLv;
    private int matchNum;
    private int mode;
    private String player;
    private boolean pre;
    private  AI ai;
    private int matchs;
    private boolean first;
    Config(){
        isStart = false;
        aiLv = "简单";
        matchNum =0;
        mode = 1;
        pre = false;
    }
    int getMatchNum() {
        return matchNum;
    }
    int getMode() {
        return mode;
    }
    void setMode(int mode) {
        this.mode = mode;
    }
    boolean getPre(){
        return pre;
    }
    String getAiLv(){
        return aiLv;
    }
    void setAiLv(String lv){
        aiLv = lv;
    }
    String dataOut(){
        return  "玩家先手" + pre;
    }
    void set(boolean pre){
        this.pre = pre;
    }
    boolean isStart(){
        return isStart;
    }
    void setMatches(int n){
        this.matchs=n;
    }
    int getMatches(){
        return matchs;
    }
    boolean start(){
        if(isStart)
            return false;
        else {
            isStart = true;
            matchNum = (int) (Math.random()*31+20);
            if(mode == 1){
                if(pre){
                    player="玩家1";
                }else{
                 player="电脑";
                }
                if(aiLv.equals("简单"))
                    ai = new EasyAi();
                else if (!pre) {
                    ai = new DifficultAi1();
                }else if(pre){
                    ai = new DifficultAi2();
                }

            }else{
                player="玩家1";
            }
            first=true;
            return true;
        }
    }
    void setPlayer(String player){
        this.player=player;
    }
    void stop(){
        isStart=false;
    }
    void remove(int num){
        matchNum -= num;
    }
    int ai(){
        int drop = ai.index(matchNum,matchs,first);
        if(first){
            first=false;
        }
        if(drop>0&&matchNum>0) {
            matchNum -= drop;
        }
        return drop;
    }
    String getPlayer(){
        return player;
    }
}

Display:

package 智能捡火柴小游戏;

import javax.swing.*;
import java.awt.*;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.awt.event.*;
import java.util.Date;

class Display {
    public Config config;
    private JFrame frame, frame2;
    private DateFormat df = new SimpleDateFormat("HH:mm:ss");
    private JMenuBar bar;
    private JMenu mode, set, help;
    private JMenuItem pc, pp;
    private JMenuItem SystemSet, AiSet;
    private JMenuItem rule, about;
    private final static String RUL = "游戏规则:\n系统随机产生总数在 20-50 范围内的火柴。\n" + "用户可以选择和用户进行游戏、或者和电脑进行游戏。\n轮流捡起火柴,每次捡起 1-3 根,以捡起最后一根为胜利。\n\n操作方法:\nstart:开始游戏\nstop:结束游戏";
    private final static String VER = "智能捡火柴小游戏 \n\n版本号:V1.0\n\n开发者:SmashDreams\n开发时间:2022年6月";
    private final static Object[] AI = {"简单", "困难"};
    private ImageIcon bg, ks, play, way1, way2, dts1, dts2, p1_1, p2_1, c1_1, hc2_1, hc2_2, hc2_3, c_1, c_2, c_3, c_4,restart_1;
    private JLabel bglabel, playlabel, p1, p2, computer, hc2;
    private JButton start, choice1, choice2, choice3, choice4, c1, c2, c3, c4, c5, c6, c7,restart;
    private JLabel num, mode1, mode2;
    private TextArea log;
    public int n;
    Display() {
        config=new Config();
        frame = new JFrame("智能捡火柴小游戏");
        bar = new JMenuBar();
        mode = new JMenu("模式(M)");
        mode.setMnemonic(KeyEvent.VK_M);
        pc = new JMenuItem("人机对战(当前)");
        pc.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_DOWN_MASK));
        pp = new JMenuItem("玩家对战");
        pp.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P, InputEvent.CTRL_DOWN_MASK));
        set = new JMenu("设置(S)");
        set.setMnemonic(KeyEvent.VK_S);
        SystemSet = new JMenuItem("系统设置");
        SystemSet.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_DOWN_MASK));
        AiSet = new JMenuItem("AI 设置");
        AiSet.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_DOWN_MASK));
        help = new JMenu("帮助(H)");
        help.setMnemonic(KeyEvent.VK_H);
        rule = new JMenuItem("游戏帮助");
        rule.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H, InputEvent.CTRL_DOWN_MASK));
        about = new JMenuItem("关于");
        about.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_DOWN_MASK));
        bg = new ImageIcon("首页.png");
        bglabel = new JLabel(bg);
        bglabel.setBounds(0, 0, bg.getIconWidth(), bg.getIconHeight());
        start = new JButton();
        start.setBounds(800, 600, 200, 100);
        ks = new ImageIcon("开始游戏.png");
        ks.setImage(ks.getImage().getScaledInstance(200, 100, Image.SCALE_DEFAULT));
        start.setIcon(ks);
        start.setBorderPainted(false);
        start.setBorder(null);
        start.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
        start.setContentAreaFilled(false);
        play = new ImageIcon("游戏界面.png");
        playlabel = new JLabel(play);
        playlabel.setBounds(0, 0, play.getIconWidth(), play.getIconHeight());
        Font font = new Font("宋体", Font.PLAIN, 35);
        Font font2 = new Font("宋体", Font.PLAIN, 20);
        mode1 = new JLabel("请选择游戏模式");
        mode1.setBounds(800, 300, 300, 100);
        mode1.setFont(font);
        choice1 = new JButton();
        choice1.setBounds(700, 400, 200, 60);
        way1 = new ImageIcon("人机对战.png");
        way1.setImage(way1.getImage().getScaledInstance(200, 60, Image.SCALE_DEFAULT));
        choice1.setIcon(way1);
        choice1.setBorderPainted(false);
        choice1.setBorder(null);
        choice1.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
        choice1.setContentAreaFilled(false);
        choice2 = new JButton();
        choice2.setBounds(950, 400, 200, 60);
        way2 = new ImageIcon("玩家对战.png");
        way2.setImage(way2.getImage().getScaledInstance(200, 60, Image.SCALE_DEFAULT));
        choice2.setIcon(way2);
        choice2.setBorderPainted(false);
        choice2.setBorder(null);
        choice2.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
        choice2.setContentAreaFilled(false);
        mode2 = new JLabel("请选择电脑难度");
        mode2.setBounds(800, 300, 300, 100);
        mode2.setFont(font);
        choice3 = new JButton();
        choice3.setBounds(700, 400, 200, 60);
        dts1 = new ImageIcon("简单.png");
        dts1.setImage(dts1.getImage().getScaledInstance(200, 60, Image.SCALE_DEFAULT));
        choice3.setIcon(dts1);
        choice3.setBorderPainted(false);
        choice3.setBorder(null);
        choice3.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
        choice3.setContentAreaFilled(false);
        choice4 = new JButton();
        choice4.setBounds(950, 400, 200, 60);
        dts2 = new ImageIcon("困难.png");
        dts2.setImage(dts2.getImage().getScaledInstance(200, 60, Image.SCALE_DEFAULT));
        choice4.setIcon(dts2);
        choice4.setBorderPainted(false);
        choice4.setBorder(null);
        choice4.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
        choice4.setContentAreaFilled(false);
        num = new JLabel("火柴的个数为:");
        num.setBounds(780, 30, 300, 100);
        num.setFont(font);
        log = new TextArea("",20,20,log.SCROLLBARS_VERTICAL_ONLY);
        //Border border = BorderFactory.createLineBorder(Color.BLACK, 3);
        log.setBounds(700, 340, 450, 530);
        log.setFont(font2);
        log.setEditable(false);
        p1_1 = new ImageIcon("玩家1.png");
        p1 = new JLabel(p1_1);
        p1.setBounds(350, 200, p1_1.getIconWidth(), p1_1.getIconHeight());
        p1.setOpaque(false);
        p2_1 = new ImageIcon("玩家2.png");
        p2 = new JLabel(p2_1);
        p2.setBounds(1250, 200, p2_1.getIconWidth(), p2_1.getIconHeight());
        p2.setOpaque(false);
        c1_1 = new ImageIcon("电脑.png");
        computer = new JLabel(c1_1);
        computer.setBounds(1250, 200, c1_1.getIconWidth(), c1_1.getIconHeight());
        computer.setOpaque(false);
        hc2_1 = new ImageIcon("火柴1.png");
        hc2_2 = new ImageIcon("火柴2.png");
        hc2_3 = new ImageIcon("火柴3.png");
        hc2 = new JLabel(hc2_1);
        hc2.setBounds(750, 115, hc2_1.getIconWidth(), hc2_1.getIconHeight());
        hc2.setOpaque(false);
        c1 = new JButton();
        c2 = new JButton();
        c3 = new JButton();
        c4 = new JButton();
        c5 = new JButton();
        c6 = new JButton();
        c1.setBounds(250, 520, 120, 160);
        c_1 = new ImageIcon("按钮1.png");
        c_1.setImage(c_1.getImage().getScaledInstance(120, 160, Image.SCALE_DEFAULT));
        c1.setIcon(c_1);
        c1.setBorderPainted(false);
        c1.setBorder(null);
        c1.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
        c1.setContentAreaFilled(false);
        c2.setBounds(400, 520, 120, 160);
        c_2 = new ImageIcon("按钮2.png");
        c_2.setImage(c_2.getImage().getScaledInstance(120, 160, Image.SCALE_DEFAULT));
        c2.setIcon(c_2);
        c2.setBorderPainted(false);
        c2.setBorder(null);
        c2.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
        c2.setContentAreaFilled(false);
        c3.setBounds(550, 520, 120, 160);
        c_3 = new ImageIcon("按钮3.png");
        c_3.setImage(c_3.getImage().getScaledInstance(120, 160, Image.SCALE_DEFAULT));
        c3.setIcon(c_3);
        c3.setBorderPainted(false);
        c3.setBorder(null);
        c3.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
        c3.setContentAreaFilled(false);
        c4.setBounds(1180, 520, 120, 160);
        c_1 = new ImageIcon("按钮1.png");
        c_1.setImage(c_1.getImage().getScaledInstance(120, 160, Image.SCALE_DEFAULT));
        c4.setIcon(c_1);
        c4.setBorderPainted(false);
        c4.setBorder(null);
        c4.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
        c4.setContentAreaFilled(false);
        c5.setBounds(1330, 520, 120, 160);
        c_2 = new ImageIcon("按钮2.png");
        c_2.setImage(c_2.getImage().getScaledInstance(120, 160, Image.SCALE_DEFAULT));
        c5.setIcon(c_2);
        c5.setBorderPainted(false);
        c5.setBorder(null);
        c5.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
        c5.setContentAreaFilled(false);
        c6.setBounds(1480, 520, 120, 160);
        c_3 = new ImageIcon("按钮3.png");
        c_3.setImage(c_3.getImage().getScaledInstance(120, 160, Image.SCALE_DEFAULT));
        c6.setIcon(c_3);
        c6.setBorderPainted(false);
        c6.setBorder(null);
        c6.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
        c6.setContentAreaFilled(false);
        c7 = new JButton();
        c7.setBounds(1330, 520, 120, 160);
        c_4 = new ImageIcon("问号.png");
        c_4.setImage(c_4.getImage().getScaledInstance(120, 160, Image.SCALE_DEFAULT));
        c7.setIcon(c_4);
        c7.setBorderPainted(false);
        c7.setBorder(null);
        c7.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
        c7.setContentAreaFilled(false);
        restart_1=new ImageIcon("重新开始.png");
        restart=new JButton();
        restart.setBounds(830,830,200,160);
        restart_1.setImage(restart_1.getImage().getScaledInstance(200, 60, Image.SCALE_DEFAULT));
        restart.setIcon(restart_1);
        restart.setBorderPainted(false);
        restart.setBorder(null);
        restart.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
        restart.setContentAreaFilled(false);
        start.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                init_Override();
            }
        });
        choice1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                config.setMode(1);
                try {
                    Thread.sleep(500);
                } catch (InterruptedException interruptedException) {
                    interruptedException.printStackTrace();
                }
                init2();
            }
        });
        choice2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                config.setMode(2);
                config.start();
                try {
                    Thread.sleep(500);
                } catch (InterruptedException interruptedException) {
                    interruptedException.printStackTrace();
                }
                init3();
            }
        });
        choice3.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                config.setAiLv("简单");
                config.start();
                init_Override3();
                init4();
                init_Override2();
                init_Override3();
                try {
                    Thread.sleep(500);
                } catch (InterruptedException interruptedException) {
                    interruptedException.printStackTrace();
                }
                init4();
                if(config.getPlayer()=="电脑"){
                    n = config.ai();
                    if (n == 1) {
                        c7.setIcon(c_1);
                    } else if (n == 2) {
                        c7.setIcon(c_2);
                    } else if (n == 3) {
                        c7.setIcon(c_3);
                    }
                    num.setText("火柴的个数为:" + config.getMatchNum());
                    log.append("电脑取走了" + n + "根火柴\n");
                    config.setPlayer("玩家1");
                }
            }
        });
        choice4.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                config.setAiLv("困难");
                config.start();
                init_Override3();
                init4();
                init_Override2();
                init_Override3();
                try {
                    Thread.sleep(500);
                } catch (InterruptedException interruptedException) {
                    interruptedException.printStackTrace();
                }
                init4();
                if(config.getPlayer()=="电脑"){
                    n = config.ai();
                    if (n == 1) {
                        c7.setIcon(c_1);
                    } else if (n == 2) {
                        c7.setIcon(c_2);
                    } else if (n == 3) {
                        c7.setIcon(c_3);
                    }
                    num.setText("火柴的个数为:" + config.getMatchNum());
                    log.append("电脑取走了" + n + "根火柴\n");
                    config.setPlayer("玩家1");
                }
            }
        });
        restart.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                frame2.dispose();
                init_Override2();
                config.stop();
            }
        });
        c1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (config.isStart()){
                    if (config.getMode() == 2) {
                        if (config.getPlayer().equals("玩家1")) {
                            config.remove(1);
                            if (config.getMatchNum() <= 0) {
                                num.setText("火柴的个数为:0");
                                log.append("玩家1胜利,游戏结束\n");
                                config.stop();
                                JOptionPane.showMessageDialog(frame2, "玩家1胜利!", "恭喜", JOptionPane.PLAIN_MESSAGE);
                            } else {
                                num.setText("火柴的个数为:" + config.getMatchNum());
                                log.append("玩家1取走了一根火柴\n");
                            }
                            if (config.getMatchNum() <= 30 && config.getMatchNum() > 10) {
                                hc2.setIcon(hc2_2);
                            } else if (config.getMatchNum() <= 10 && config.getMatchNum() > 0) {
                                hc2.setIcon(hc2_3);
                            }
                            config.setPlayer("玩家2");
                        } else {
                            JOptionPane.showMessageDialog(frame2, "当前是玩家2的回合!", "提示", JOptionPane.PLAIN_MESSAGE);
                        }
                    } else {
                        if (config.getPlayer().equals("玩家1")) {
                            config.remove(1);
                            if (config.getMatchNum() <= 0) {
                                num.setText("火柴的个数为:0");
                                log.append("玩家胜利,游戏结束\n");
                                config.stop();
                                JOptionPane.showMessageDialog(frame2, "玩家胜利!", "恭喜", JOptionPane.PLAIN_MESSAGE);
                            } else {
                                num.setText("火柴的个数为:" + config.getMatchNum());
                                config.setMatches(1);
                                log.append("玩家取走了1根火柴\n");
                            }
                            if (config.getMatchNum() <= 30 && config.getMatchNum() > 10) {
                                hc2.setIcon(hc2_2);
                            } else if (config.getMatchNum() <= 10 && config.getMatchNum() > 0) {
                                hc2.setIcon(hc2_3);
                            }
                            config.setPlayer("电脑");
                            try {
                                Thread.sleep(1000);
                            } catch (InterruptedException interruptedException) {
                                interruptedException.printStackTrace();
                            }
                            n = config.ai();
                            if (n == 1) {
                                c7.setIcon(c_1);
                            } else if (n == 2) {
                                c7.setIcon(c_2);
                            } else if (n == 3) {
                                c7.setIcon(c_3);
                            }
                            if (config.getMatchNum() <= 0&& config.isStart()) {
                                num.setText("火柴的个数为:0");
                                log.append("电脑胜利,游戏结束\n");
                                config.stop();
                                JOptionPane.showMessageDialog(frame2, "电脑胜利!", "很遗憾", JOptionPane.PLAIN_MESSAGE);
                            } else if(n>0&&config.getMatchNum()>0){
                                num.setText("火柴的个数为:" + config.getMatchNum());
                                log.append("电脑取走了" + n + "根火柴\n");
                            }
                            config.setPlayer("玩家1");

                        } else {
                            JOptionPane.showMessageDialog(frame2, "当前是电脑的回合!", "提示", JOptionPane.PLAIN_MESSAGE);
                        }
                    }
            }else{
                    JOptionPane.showMessageDialog(frame2,"游戏已结束!","提示",JOptionPane.PLAIN_MESSAGE);
                }
            }
        });
        c2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (config.isStart()){
                if (config.getMode() == 2) {
                    if (config.getPlayer().equals("玩家1")) {
                        config.remove(2);
                        if(config.getMatchNum()<=0){
                            num.setText("火柴的个数为:0" );
                            log.append("玩家1胜利,游戏结束\n");
                            config.stop();
                            JOptionPane.showMessageDialog(frame2,"玩家1胜利!","恭喜",JOptionPane.PLAIN_MESSAGE);
                        }else {
                            num.setText("火柴的个数为:" + config.getMatchNum());
                            log.append("玩家1取走了两根火柴\n");
                        }
                        if(config.getMatchNum()<=30&&config.getMatchNum()>10){
                            hc2.setIcon(hc2_2);
                        }else if(config.getMatchNum()<=10&&config.getMatchNum()>0){
                            hc2.setIcon(hc2_3);
                        }
                        config.setPlayer("玩家2");
                    } else {
                        JOptionPane.showMessageDialog(frame2, "当前是玩家2的回合!", "提示", JOptionPane.PLAIN_MESSAGE);
                    }
                }else{
                    if (config.getPlayer().equals("玩家1")) {
                        config.remove(2);
                        if(config.getMatchNum()<=0){
                            num.setText("火柴的个数为:0" );
                            log.append("玩家胜利,游戏结束\n");
                            config.stop();
                            JOptionPane.showMessageDialog(frame2,"玩家胜利!","恭喜",JOptionPane.PLAIN_MESSAGE);
                        }else {
                            num.setText("火柴的个数为:" + config.getMatchNum());
                            config.setMatches(2);
                            log.append("玩家取走了2根火柴\n");
                        }
                        if(config.getMatchNum()<=30&&config.getMatchNum()>10){
                            hc2.setIcon(hc2_2);
                        }else if(config.getMatchNum()<=10&&config.getMatchNum()>0){
                            hc2.setIcon(hc2_3);
                        }
                        config.setPlayer("电脑");
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException interruptedException) {
                            interruptedException.printStackTrace();
                        }
                        n= config.ai();
                        if(n==1){
                            c7.setIcon(c_1);
                        }else if(n==2){
                            c7.setIcon(c_2);
                        }else if(n==3){
                            c7.setIcon(c_3);
                        }
                        if(config.getMatchNum()<=0&& config.isStart()){
                            num.setText("火柴的个数为:0" );
                            log.append("电脑胜利,游戏结束\n");
                            config.stop();
                            JOptionPane.showMessageDialog(frame2,"电脑胜利!","很遗憾",JOptionPane.PLAIN_MESSAGE);
                        }else if(n>0&&config.getMatchNum()>0){
                            num.setText("火柴的个数为:" + config.getMatchNum());
                            log.append("电脑取走了" + n + "根火柴\n");
                        }
                        config.setPlayer("玩家1");

                    } else {
                        JOptionPane.showMessageDialog(frame2, "当前是电脑的回合!", "提示", JOptionPane.PLAIN_MESSAGE);
                    }
                }
            }else{
                    JOptionPane.showMessageDialog(frame2,"游戏已结束!","提示",JOptionPane.PLAIN_MESSAGE);
                }}
        });
        c3.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (config.isStart()){
                if (config.getMode() == 2) {
                    if (config.getPlayer().equals("玩家1")) {
                        config.remove(3);
                        if(config.getMatchNum()<=0){
                            num.setText("火柴的个数为:0" );
                            log.append("玩家1胜利,游戏结束\n");
                            config.stop();
                            JOptionPane.showMessageDialog(frame2,"玩家1胜利!","恭喜",JOptionPane.PLAIN_MESSAGE);
                        }else {
                            num.setText("火柴的个数为:" + config.getMatchNum());
                            log.append("玩家1取走了三根火柴\n");
                        }
                        if(config.getMatchNum()<=30&&config.getMatchNum()>10){
                            hc2.setIcon(hc2_2);
                        }else if(config.getMatchNum()<=10&&config.getMatchNum()>0){
                            hc2.setIcon(hc2_3);
                        }
                        config.setPlayer("玩家2");
                    } else {
                        JOptionPane.showMessageDialog(frame2, "当前是玩家2的回合!", "提示", JOptionPane.PLAIN_MESSAGE);
                    }
                }else{
                    if (config.getPlayer().equals("玩家1")) {
                        config.remove(3);
                        if(config.getMatchNum()<=0){
                            num.setText("火柴的个数为:0" );
                            log.append("玩家胜利,游戏结束\n");
                            config.stop();
                            JOptionPane.showMessageDialog(frame2,"玩家胜利!","恭喜",JOptionPane.PLAIN_MESSAGE);
                        }else {
                            num.setText("火柴的个数为:" + config.getMatchNum());
                            config.setMatches(3);
                            log.append("玩家取走了3根火柴\n");
                        }
                        if(config.getMatchNum()<=30&&config.getMatchNum()>10){
                            hc2.setIcon(hc2_2);
                        }else if(config.getMatchNum()<=10&&config.getMatchNum()>0){
                            hc2.setIcon(hc2_3);
                        }
                        config.setPlayer("电脑");
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException interruptedException) {
                            interruptedException.printStackTrace();
                        }
                        n= config.ai();
                        if(n==1){
                            c7.setIcon(c_1);
                        }else if(n==2){
                            c7.setIcon(c_2);
                        }else if(n==3){
                            c7.setIcon(c_3);
                        }
                        if(config.getMatchNum()<=0&& config.isStart()){
                            num.setText("火柴的个数为:0" );
                            log.append("电脑胜利,游戏结束\n");
                            config.stop();
                            JOptionPane.showMessageDialog(frame2,"电脑胜利!","很遗憾",JOptionPane.PLAIN_MESSAGE);
                        }else if(n>0&&config.getMatchNum()>0){
                            num.setText("火柴的个数为:" + config.getMatchNum());
                            log.append("电脑取走了" + n + "根火柴\n");
                        }
                        config.setPlayer("玩家1");
                    } else {
                        JOptionPane.showMessageDialog(frame2, "当前是电脑的回合!", "提示", JOptionPane.PLAIN_MESSAGE);
                    }
                }
            }else{
                    JOptionPane.showMessageDialog(frame2,"游戏已结束!","提示",JOptionPane.PLAIN_MESSAGE);
                }}
        });
        c4.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(config.isStart()){
                    if (config.getPlayer().equals("玩家2")) {
                        config.remove(1);
                        if(config.getMatchNum()<=0){
                            num.setText("火柴的个数为:0" );
                            log.append("玩家2胜利,游戏结束");
                            config.stop();
                            JOptionPane.showMessageDialog(frame2,"玩家2胜利!","恭喜",JOptionPane.PLAIN_MESSAGE);
                        }else {
                            num.setText("火柴的个数为:" + config.getMatchNum());
                            log.append("玩家2取走了一根火柴\n");
                        }
                        if(config.getMatchNum()<=30&&config.getMatchNum()>10){
                            hc2.setIcon(hc2_2);
                        }else if(config.getMatchNum()<=10&&config.getMatchNum()>0){
                            hc2.setIcon(hc2_3);
                        }
                        config.setPlayer("玩家1");
                    } else {
                        JOptionPane.showMessageDialog(frame2, "当前是玩家1的回合!", "提示", JOptionPane.PLAIN_MESSAGE);
                    }
            }else{
                    JOptionPane.showMessageDialog(frame2,"游戏已结束!","提示",JOptionPane.PLAIN_MESSAGE);
                }}
        });
        c5.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(config.isStart()){
                if (config.getPlayer().equals("玩家2")) {
                    config.remove(2);
                    if(config.getMatchNum()<=0){
                        num.setText("火柴的个数为:0" );
                        log.append("玩家2胜利,游戏结束");
                        config.stop();
                        JOptionPane.showMessageDialog(frame2,"玩家2胜利!","恭喜",JOptionPane.PLAIN_MESSAGE);
                    }else {
                        num.setText("火柴的个数为:" + config.getMatchNum());
                        log.append("玩家2取走了两根火柴\n");
                    }
                    if(config.getMatchNum()<=30&&config.getMatchNum()>10){
                        hc2.setIcon(hc2_2);
                    }else if(config.getMatchNum()<=10&&config.getMatchNum()>0){
                        hc2.setIcon(hc2_3);
                    }
                    config.setPlayer("玩家1");
                } else {
                    JOptionPane.showMessageDialog(frame2, "当前是玩家1的回合!", "提示", JOptionPane.PLAIN_MESSAGE);
                }
            }else{
                    JOptionPane.showMessageDialog(frame2,"游戏已结束!","提示",JOptionPane.PLAIN_MESSAGE);
                }}
        });
        c6.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(config.isStart()){
                if (config.getPlayer().equals("玩家2")) {
                    config.remove(3);
                    if(config.getMatchNum()<=0){
                        num.setText("火柴的个数为:0" );
                        log.append("玩家2胜利,游戏结束");
                        config.stop();
                        JOptionPane.showMessageDialog(frame2,"玩家2胜利!","恭喜",JOptionPane.PLAIN_MESSAGE);
                    }else {
                        num.setText("火柴的个数为:" + config.getMatchNum());
                        log.append("玩家2取走了三根火柴\n");
                    }
                    if(config.getMatchNum()<=30&&config.getMatchNum()>10){
                        hc2.setIcon(hc2_2);
                    }else if(config.getMatchNum()<=10&&config.getMatchNum()>0){
                        hc2.setIcon(hc2_3);
                    }
                    config.setPlayer("玩家1");
                } else {
                    JOptionPane.showMessageDialog(frame2, "当前是玩家1的回合!", "提示", JOptionPane.PLAIN_MESSAGE);
                }
            }else{
                    JOptionPane.showMessageDialog(frame2,"游戏已结束!","提示",JOptionPane.PLAIN_MESSAGE);
                }}
        });
        c7.setEnabled(false);
    }

    public void init() {
        mode.add(pc);
        mode.add(pp);
        set.add(SystemSet);
        set.add(AiSet);
        help.add(rule);
        help.add(about);
        bar.add(mode);
        bar.add(set);
        bar.add(help);
        frame.setJMenuBar(bar);
        Toolkit tk = frame.getToolkit();
        frame.setSize(1860, 1010);
        Dimension dm = tk.getScreenSize();
        frame.setLocation((int) (dm.getWidth() - frame.getWidth()) / 2, (int) (dm.getHeight() - frame.getHeight()) / 2);
        frame.setDefaultCloseOperation(3);
        frame.getLayeredPane().add(bglabel, new Integer(Integer.MIN_VALUE));
        JPanel jp = (JPanel) frame.getContentPane();
        jp.setOpaque(false);
        frame.setLayout(null);
        frame.add(start);
    }

    public void init_Override() {
        frame.dispose();
        frame2 = new JFrame("智能捡火柴小游戏");
        frame2.setJMenuBar(bar);
        Toolkit tk = frame2.getToolkit();
        frame2.setSize(1860, 1010);
        Dimension dm = tk.getScreenSize();
        frame2.setLocation((int) (dm.getWidth() - frame2.getWidth()) / 2, (int) (dm.getHeight() - frame2.getHeight()) / 2);
        frame2.getLayeredPane().add(playlabel, new Integer(Integer.MIN_VALUE));
        JPanel jp = (JPanel) frame2.getContentPane();
        jp.setOpaque(false);
        frame2.setLayout(null);
        frame2.add(mode1);
        frame2.add(choice1);
        frame2.add(choice2);
        mode1.setVisible(true);
        choice1.setVisible(true);
        choice2.setVisible(true);
        frame2.setVisible(true);
    }
    public void init_Override2() {
        c1.setVisible(false);
        c2.setVisible(false);
        c3.setVisible(false);
        c4.setVisible(false);
        c5.setVisible(false);
        c6.setVisible(false);
        c7.setVisible(false);
        p1.setVisible(false);
        p2.setVisible(false);
        computer.setVisible(false);
        num.setVisible(false);
        log.setVisible(false);
        hc2.setVisible(false);
        restart.setVisible(false);
        hc2.setIcon(hc2_1);
        log.setText("");
        c7.setIcon(c_4);
        choice1.setVisible(true);
        choice2.setVisible(true);
        mode1.setVisible(true);
        frame2.setVisible(true);
    }
    public void init_Override3(){
        mode1.setVisible(false);
        choice2.setVisible(false);
        choice1.setVisible(false);
    }

    public void init2() {
        choice1.setVisible(false);
        choice2.setVisible(false);
        mode1.setVisible(false);
        frame2.add(mode2);
        frame2.add(choice3);
        frame2.add(choice4);
        mode2.setVisible(true);
        choice3.setVisible(true);
        choice4.setVisible(true);
    }

    public void init3() {
        choice1.setVisible(false);
        choice2.setVisible(false);
        mode1.setVisible(false);
        frame2.add(p1);
        frame2.add(p2);
        frame2.add(num);
        frame2.add(log);
        frame2.add(hc2);
        frame2.add(c1);
        frame2.add(c2);
        frame2.add(c3);
        frame2.add(c4);
        frame2.add(c5);
        frame2.add(c6);
        num.setText("火柴的个数为:"+config.getMatchNum());
        p1.setVisible(true);
        p2.setVisible(true);
        num.setVisible(true);
        log.setVisible(true);
        hc2.setVisible(true);
        c1.setVisible(true);
        c2.setVisible(true);
        c3.setVisible(true);
        c4.setVisible(true);
        c5.setVisible(true);
        c6.setVisible(true);
        frame2.add(restart);
        restart.setVisible(true);
    }
    public void init4() {
        choice4.setVisible(false);
        choice3.setVisible(false);
        mode2.setVisible(false);
        frame2.add(p1);
        frame2.add(computer);
        frame2.add(num);
        frame2.add(log);
        frame2.add(hc2);
        frame2.add(c1);
        frame2.add(c2);
        frame2.add(c3);
        frame2.add(c7);
        frame2.add(restart);
        num.setText("火柴的个数为:"+config.getMatchNum());
        c1.setIcon(c_1);
        c2.setIcon(c_2);
        c3.setIcon(c_3);
        p1.setIcon(p1_1);
        computer.setIcon(c1_1);
        restart.setIcon(restart_1);
        p1.setVisible(true);
        computer.setVisible(true);
        num.setVisible(true);
        log.setVisible(true);
        hc2.setVisible(true);
        c1.setVisible(true);
        c2.setVisible(true);
        c3.setVisible(true);
        c7.setVisible(true);
        restart.setVisible(true);
    }

    public void reg() {
        pc.addActionListener(e1 -> {
            pc.setText("人机对战(当前)");
            pp.setText("玩家对战");
            config.setMode(1);
            System.out.println(df.format(new Date()) + "设置模式为人机对战");
        });
        pp.addActionListener(e1 -> {
            pc.setText("人机对战");
            pp.setText("玩家对战(当前)");
            config.setMode(2);
            System.out.println(df.format(new Date()) + "设置模式为玩家对战");
        });
        AiSet.addActionListener(e4 -> {
            String aiLv = (String) JOptionPane.showInputDialog(frame, "请选择 AI 难度\n", "AI 设置", JOptionPane.QUESTION_MESSAGE, null, AI, config.getAiLv());
            if (aiLv != null) {
                config.setAiLv(aiLv);
                System.out.println(df.format(new Date()) + "设置AI难度为" + aiLv);
                if(aiLv.equals("简单")){
                    init_Override();
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    init_Override3();
                    config.start();
                    init4();
                    if(config.getPlayer().equals("电脑")) {
                        n = config.ai();
                        if (n == 1) {
                            c7.setIcon(c_1);
                        } else if (n == 2) {
                            c7.setIcon(c_2);
                        } else if (n == 3) {
                            c7.setIcon(c_3);
                        }
                        num.setText("火柴的个数为:" + config.getMatchNum());
                        log.append("电脑取走了" + n + "根火柴\n");
                        config.setPlayer("玩家1");
                    }}else {
                        init_Override();
                        try {
                            Thread.sleep(500);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        init_Override3();
                        config.start();
                        init4();
                        if(config.getPlayer().equals("电脑")) {
                            n = config.ai();
                            if (n == 1) {
                                c7.setIcon(c_1);
                            } else if (n == 2) {
                                c7.setIcon(c_2);
                            } else if (n == 3) {
                                c7.setIcon(c_3);
                            }
                            num.setText("火柴的个数为:" + config.getMatchNum());
                            log.append("电脑取走了" + n + "根火柴\n");
                            config.setPlayer("玩家1");
                        }
                    }
                }

        });
        SystemSet.addActionListener(new SystemSet());
        rule.addActionListener(e5 -> JOptionPane.showMessageDialog(frame, RUL, "游戏帮助", JOptionPane.PLAIN_MESSAGE));
        about.addActionListener(e6 -> JOptionPane.showMessageDialog(frame, VER, "关于", JOptionPane.PLAIN_MESSAGE));
    }
    private class SystemSet implements ActionListener {
        private JDialog dialog;
        private JCheckBox pre;
        private JButton yes;
        private JButton no;

        SystemSet() {
            dialog = new JDialog(frame, "系统设置", true);
            pre = new JCheckBox("人机对战先手");
            yes = new JButton("确认");
            no = new JButton("取消");
            JPanel north = new JPanel();
            GridLayout grid = new GridLayout(1, 2);
            north.setLayout(grid);
            JPanel center = new JPanel();
            center.add(pre);
            JPanel south = new JPanel();
            south.add(yes);
            south.add(no);
            dialog.add(center, BorderLayout.CENTER);
            dialog.add(south,BorderLayout.SOUTH);
            dialog.pack();
            dialog.setResizable(false);
            dialog.setDefaultCloseOperation(dialog.DISPOSE_ON_CLOSE);
            dialog.setLocationRelativeTo(null);
            yes.addActionListener(e1 -> {
                boolean isPre;
                isPre=pre.isSelected();
                config.set(isPre);
                System.out.println(df.format(new Date()) + "设置" + config.dataOut());
                dialog.dispose();
            });
            no.addActionListener(e2 -> dialog.dispose());
        }
        @Override
        public void actionPerformed(ActionEvent e) {
            pre.setSelected(config.getPre());
            dialog.setVisible(true);
        }
    }

        void DisplayIt() {
            init();
            reg();
            frame.setVisible(true);
        }
    }

AI interface:

package 智能捡火柴小游戏;

public interface AI {
    int index(int match,int matches,boolean first);
}

Easy Ai:

package 智能捡火柴小游戏;

public class EasyAi implements AI {
    @Override
    public int index(int match,int matches,boolean first) {
        if (match == 1)
            return 1;
        else if (match <= 3) {
            return match;
        } else {
            return (int) (Math.random() * 3 + 1);        //随机取火柴直到火柴小于6根
        }
    }
}

Difficult Ai1:

package 智能捡火柴小游戏;

import com.sun.org.apache.xpath.internal.operations.And;

public class DifficultAi1 implements AI {
    @Override
    public int index(int match, int matches, boolean first) {
        if ((first) & (match % 4 != 0)) {
            return match % 4;
        }
        else if ((first) & (match % 4 == 0)) {
            return (int) (Math.random() * 3 + 1);
        } else if (match > 3) {
            return 4 - matches;
        } else if (match == 1) {
            return 1;
        } else {
            return 4-matches;
        }
    }
}

Difficult Ai2:

package 智能捡火柴小游戏;

public class DifficultAi2 implements AI {
    @Override
    public int index(int match,int matches,boolean first) {
        if ((first) & (match % 4 != 0)) {
            return match % 4;
        }
        else if ((first) & (match % 4 == 0)) {
            return (int) (Math.random() * 3 + 1);
        } else if (match > 3) {
            return 4 - matches;
        } else if (match == 1) {
            return 1;
        } else {
            return 4-matches;
        }
    }
}

以上为主要代码,主要是图形界面生成的时候因为我所学尚浅会存在许多的显示问题,并且仅适配于我的2560x1440分辨率,如要进行借鉴请修改分辨率

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java火柴游戏设计可以分为以下几个方面: 1. 定义游戏规则:取火柴游戏的规则可以根据实际需要自定义,比如可以定义每次取的火柴数量、起始的火柴数量、取火柴的顺序等。 2. 设计游戏界面:可以使用Java Swing或JavaFX来设计游戏界面,包括游戏标题、火柴数量、玩家信息、操作按钮等。 3. 实现游戏逻辑:游戏逻辑包括火柴数量的更新、玩家的操作、游戏结果的判断等,需要使用Java编写相关代码。 下面是一个简单的Java火柴游戏的设计示例: ``` import java.awt.*; import java.awt.event.*; import javax.swing.*; public class MatchstickGame extends JFrame { private int matchsticks = 21; private JLabel matchstickLabel; public MatchstickGame() { super("取火柴游戏"); setLayout(new FlowLayout()); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(300, 200); JLabel titleLabel = new JLabel("取火柴游戏"); titleLabel.setFont(new Font("微软雅黑", Font.BOLD, 20)); add(titleLabel); matchstickLabel = new JLabel("火柴数量:" + matchsticks); matchstickLabel.setFont(new Font("微软雅黑", Font.PLAIN, 16)); add(matchstickLabel); JButton oneButton = new JButton("取1根"); oneButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { takeMatchsticks(1); } }); add(oneButton); JButton twoButton = new JButton("取2根"); twoButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { takeMatchsticks(2); } }); add(twoButton); JButton threeButton = new JButton("取3根"); threeButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { takeMatchsticks(3); } }); add(threeButton); JButton fourButton = new JButton("取4根"); fourButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { takeMatchsticks(4); } }); add(fourButton); setVisible(true); } private void takeMatchsticks(int num) { if (num < 1 || num > 4 || num > matchsticks) { JOptionPane.showMessageDialog(this, "无效的输入,请重新输入!"); return; } matchsticks -= num; matchstickLabel.setText("火柴数量:" + matchsticks); if (matchsticks == 0) { JOptionPane.showMessageDialog(this, "你输了!"); System.exit(0); } int computerNum = (5 - num); matchsticks -= computerNum; matchstickLabel.setText("火柴数量:" + matchsticks); if (matchsticks == 0) { JOptionPane.showMessageDialog(this, "你赢了!"); System.exit(0); } } public static void main(String[] args) { MatchstickGame game = new MatchstickGame(); } } ``` 这个程序使用了Java Swing来实现游戏界面,包括取火柴的按钮和火柴数量的显示。在按钮的ActionListener中,根据玩家取火柴的数量来更新火柴数量,并且根据游戏规则让电脑也取火柴。当火柴数量为0时,根据最后一次取火柴的玩家判断游戏胜负。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值