以下是修改后的代码,实现了简单、普通、困难三种不同难度的拿火柴游戏:
import java.awt.Color; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JButton; import javax.swing.JTextField; import javax.swing.ButtonGroup; import javax.swing.JOptionPane; import javax.swing.JRadioButton;
public class Test1 extends JFrame implements ActionListener {
private static final long serialVersionUID = 920921981358099067L;
public int sumMatch, difficulty;
private JLabel lbPer, lbCom, lbLast, lbDifficulty;
private JButton btnStart, btnOne, btnTwo, btnThree;
private JTextField tfPcshow, tfLastshow;
private JRadioButton rbEasy, rbNormal, rbHard;
private boolean win = true;
public Test1() {
super("计科2班第六组拿火柴小游戏");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(600, 350);
setResizable(false);
initUI();
setLocationRelativeTo(null);
}
private void initUI() {
Container container = getContentPane();
ButtonGroup group = new ButtonGroup();
btnStart = new JButton("开始游戏");
btnStart.setBounds(410, 100, 150, 30);
lbPer = new JLabel("你拿火柴数");
lbPer.setBounds(40, 50, 120, 30);
lbCom = new JLabel("电脑拿火柴数");
lbCom.setBounds(40, 100, 120, 30);
lbLast = new JLabel("剩余火柴数");
lbLast.setBounds(40, 150, 120, 30);
lbDifficulty = new JLabel("请选择难度");
lbDifficulty.setBounds(40, 200, 120, 30);
btnOne = new JButton("1");
btnOne.setBounds(210, 50, 80, 40);
btnTwo = new JButton("2");
btnTwo.setBounds(310, 50, 80, 40);
btnThree = new JButton("3");
btnThree.setBounds(410, 50, 80, 40);
tfPcshow = new JTextField();
tfPcshow.setBounds(210, 100, 150, 30);
tfPcshow.setEditable(false);
tfLastshow = new JTextField();
tfLastshow.setBounds(210, 150, 150, 30);
tfLastshow.setEditable(false);
rbEasy = new JRadioButton("简单", true);
rbEasy.setBounds(180,200 ,60 ,30 );
rbNormal = new JRadioButton("普通");
rbNormal.setBounds(240 ,200 ,60 ,30 );
rbHard= new JRadioButton("困难");
rbHard.setBounds(300 ,200 ,60 ,30 );
group.add(rbEasy);
group.add(rbNormal);
group.add(rbHard);
container.setLayout(null);
container.add(lbPer);
container.add(lbCom);
container.add(lbLast);
container.add(btnStart);
container.add(btnOne);
container.add(btnTwo);
container.add(btnThree);
container.add(tfPcshow);
container.add(tfLastshow);
container.add(rbEasy);
container.add(rbNormal);
container.add(rbHard);
btnStart.addActionListener(this);
btnOne.addActionListener(this);
btnTwo.addActionListener(this);
btnThree.addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == btnStart) {
sumMatch = (int) (Math.random() * (50 - 20)) + 20;
tfPcshow.setText("电脑已经确定了初始火柴数,你先拿吧!");
tfLastshow.setText("剩余火柴数:" + sumMatch);
if(rbEasy.isSelected()) {
difficulty = 1;
} else if(rbNormal.isSelected()) {
difficulty = 2;
} else if(rbHard.isSelected()) {
difficulty = 3;
}
} else if (e.getSource() instanceof JButton) {
int k = Integer.parseInt(((JButton)e.getSource()).getText());
sumMatch -= k;
if(sumMatch < 0) {
JOptionPane.showMessageDialog(this, "请点击开始游戏按钮", "TEST", JOptionPane.INFORMATION_MESSAGE);
return;
}
tfLastshow.setText("剩余火柴数:" + sumMatch);
if(sumMatch == 0) {
win = false;
showResult();
} else {
tfPcshow.setText("电脑正在思考,请稍等...");
computerMove();
}
}
}
private void computerMove() {
new Thread(new Runnable() {
public void run() {
try{Thread.sleep(1000);} catch(Exception e){}
int comNum;
switch(difficulty) {
case 1: // 简单难度,电脑随机拿取一定数量的火柴
comNum=(int)(Math.random()*3)+1;
break;
case 2: // 普通难度,电脑根据当前火柴数量计算拿取数量
comNum=(sumMatch-1)%4;
if(comNum == 0) {
comNum = (int)(Math.random()*3)+1;
}
break;
case 3: // 困难难度,电脑使用人工智能算法计算拿取数量
comNum=AI.calculate(sumMatch);
break;
default:
return;
}
sumMatch -= comNum;
if(sumMatch <= 0) {
win = true;
showResult();
} else {
tfPcshow.setText("电脑拿了 " + comNum + " 根火柴,轮到你了!");
}
tfLastshow.setText("剩余火柴数:" + sumMatch);
}
}).start();
}
private void showResult() { // 显示游戏结果的方法
if(win) {
JOptionPane.showMessageDialog(this, "恭喜你赢了!", "TEST", JOptionPane.INFORMATION_MESSAGE);
} else {
JOptionPane.showMessageDialog(this, "你输了,再试一次吧", "TEST", JOptionPane.INFORMATION_MESSAGE);
}
btnStart.setEnabled(true); // 结束后启用开始游戏按钮
rbEasy.setEnabled(true); rbNormal.setEnabled(true); rbHard.setEnabled(true); // 启用单选按钮组
}
public static void main(String[] args) {
Test1 frame = new Test1();
frame.setVisible(true);
}
}
在新的代码中,增加了一个单选按钮组用来选择难度,共有三个选项:简单、普通、困难。根据不同的难度,电脑会采取不同的策略来拿取火柴。
- 简单难度:电脑随机拿取 1~3 根火柴。
- 普通难度:电脑计算剩余火柴数对 4 取模后得到的余数,然后根据这个余数来决定拿多少根火柴。如果计算结果为 0,则电脑随机拿取 1~3 根火柴。
- 困难难度:电脑使用人工智能算法计算应该拿多少根火柴。
当玩家点击开始游戏按钮时,程序会生成一个初始的火柴数量,并且让玩家先手。当玩家和电脑轮流拿取火柴时,程序会实时更新剩余的火柴数量,并在每一步之后显示出轮到谁操作以及提示信息。当最后一根火柴被拿走时,游戏结束并展示胜负结果。
需要注意的是,在新代码中我们使用了线程(Thread)来模拟电脑思考过程,并且在困难模式下使用了人工智能算法。这样可以让程序更加灵活,不会因为电脑思考过程而阻塞主线程的运行。