因为时间较长,内容较多,仅提供代码进行沟通交流,因为笔者水平不足,仍然有较多的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分辨率,如要进行借鉴请修改分辨率