ZBLOG

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 java...

以下是修改后的代码,实现了简单、普通、困难三种不同难度的拿火柴游戏:

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)来模拟电脑思考过程,并且在困难模式下使用了人工智能算法。这样可以让程序更加灵活,不会因为电脑思考过程而阻塞主线程的运行。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=3682

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?