展开全部
画面上按左边COMPTER FIRST那个按钮,就是电脑先拿,
如果右边32313133353236313431303231363533e4b893e5b19e31333236613366的TAKE按钮,就是人先拿。
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.util.Stack;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class Test {
public static void main(String[] args) {
new Test();
}
private static final int MIN_CNT = 20;
private static final int MAX_CNT = 50;
private static final int MAX_TAKE = 3;
private static final int DELAY = 1000;
private JFrame mainFrame;
private MyPaintPanel[] paints;
private JButton userBtn;
private JComboBox userNum;
private JButton compBtn;
private JLabel compTxt;
private Timer timer;
private Test() {
mainFrame = new JFrame();
mainFrame.setResizable(false);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel mainPanel = new JPanel();
mainPanel.setLayout(null);
mainPanel.setPreferredSize(new Dimension(600, 400));
mainFrame.add(mainPanel);
JLabel lab11 = new JLabel("COMPUTER");
lab11.setHorizontalAlignment(JLabel.CENTER);
lab11.setBounds(0, 10, 200, 20);
mainPanel.add(lab11);
JButton btn11 = new JButton("RESET");
btn11.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
init();
}
});
btn11.setBounds(250, 10, 100, 20);
mainPanel.add(btn11);
JLabel lab12 = new JLabel("USER");
lab12.setHorizontalAlignment(JLabel.CENTER);
lab12.setBounds(400, 10, 200, 20);
mainPanel.add(lab12);
compBtn = new JButton("COMPTER FIRST");
compBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
compTake();
}
});
compBtn.setBounds(10, 40, 180, 20);
mainPanel.add(compBtn);
compTxt = new JLabel();
compTxt.setBounds(10, 70, 400, 20);
mainPanel.add(compTxt);
userBtn = new JButton("TAKE");
userBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
userTake();
}
});
userBtn.setBounds(400, 40, 90, 20);
mainPanel.add(userBtn);
userNum = new JComboBox();
for (int i = 0; i < MAX_TAKE; i++) {
userNum.addItem(i + 1);
}
userNum.setBounds(495, 40, 90, 20);
mainPanel.add(userNum);
paints = new MyPaintPanel[3];
for (int i = 0; i < 3; i++) {
paints[i] = new MyPaintPanel();
paints[i].setBounds(5 + 200 * i, 110, 190, 285);
mainPanel.add(paints[i]);
}
mainFrame.pack();
mainFrame.setVisible(true);
init();
}
private void init() {
if (timer != null) {
timer.cancel();
}
timer = new Timer();
compTxt.setText("");
compBtn.setEnabled(true);
userBtn.setEnabled(true);
paints[0].reset();
paints[1].reset();
paints[2].reset();
int num = MIN_CNT + (int) ((MAX_CNT + 1 - MIN_CNT) * Math.random());
for (int i = 0; i < num; i++) {
paints[1].add(i + 1);
}
}
private void userTake() {
compBtn.setEnabled(false);
int takeCnt = userNum.getSelectedIndex() + 1;
int rel = paints[1].getCnt();
if (takeCnt > rel) {
JOptionPane.showMessageDialog(mainFrame, "There is only " + rel + " matches.");
return;
}
for (int i = 0; i < takeCnt; i++) {
int index = paints[1].remove();
paints[2].add(index);
}
if (takeCnt == rel) {
JOptionPane.showMessageDialog(mainFrame, "You are the winner.");
init();
} else {
compTake();
}
}
private void compTake() {
compBtn.setEnabled(false);
userBtn.setEnabled(false);
MyTask task = new MyTask();
timer.schedule(task, DELAY);
}
private class MyTask extends TimerTask {
@Override
public void run() {
int rel = paints[1].getCnt();
int takeCnt = 0;
if (rel <= MAX_TAKE) {
takeCnt = rel;
} else if (rel % (MAX_TAKE + 1) > 0) {
takeCnt = rel % (MAX_TAKE + 1);
} else {
takeCnt = 1 + (int) (MAX_TAKE * Math.random());
}
for (int i = 0; i < takeCnt; i++) {
int index = paints[1].remove();
paints[0].add(index);
}
compTxt.setText("Computer takes " + takeCnt + " matches this time.");
if (takeCnt == rel) {
JOptionPane.showMessageDialog(mainFrame, "Computer is the winner.");
init();
}
userBtn.setEnabled(true);
}
}
@SuppressWarnings("serial")
private class MyPaintPanel extends Component {
private BufferedImage bimg;
private Stack data;
private MyPaintPanel() {
bimg = new BufferedImage(190, 285, BufferedImage.TYPE_3BYTE_BGR);
Graphics2D g2 = bimg.createGraphics();
g2.setColor(Color.WHITE);
g2.fillRect(0, 0, 190, 285);
g2.dispose();
data = new Stack();
}
public void paint(Graphics g) {
g.drawImage(bimg, 0, 0, null);
g.dispose();
}
private void add(int num) {
Graphics2D g2 = bimg.createGraphics();
int loc = data.size();
int offX = loc % 3 * 65;
int offY = loc / 3 * 15;
g2.setColor(Color.YELLOW);
g2.fillRect(offX + 8, offY + 5, 50, 6);
g2.setColor(Color.PINK);
g2.fillArc(offX + 50, offY + 3, 10, 10, 0, 360);
g2.setColor(Color.BLACK);
g2.drawString(String.valueOf(num), offX, offY + g2.getFont().getSize());
data.push(num);
repaint();
g2.dispose();
}
private int remove() {
Graphics2D g2 = bimg.createGraphics();
int loc = data.size() - 1;
int offX = loc % 3 * 65;
int offY = loc / 3 * 15;
g2.setColor(Color.WHITE);
g2.fillRect(offX, offY, 60, 15);
g2.dispose();
repaint();
return data.pop();
}
private void reset() {
data.clear();
Graphics2D g2 = bimg.createGraphics();
g2.setColor(Color.WHITE);
g2.fillRect(0, 0, 190, 285);
g2.dispose();
repaint();
}
private int getCnt() {
return data.size();
}
}
}
本回答由网友推荐

已赞过
已踩过<
你对这个回答的评价是?
评论
收起
这是一个用Java编写的火柴游戏程序,包含用户与电脑的交互。用户可以选择先手或后手,每次可以拿走1到3根火柴。游戏的目标是让对方无法在一轮中拿完所有火柴。程序通过`TimerTask`模拟电脑的决策过程,并用`BufferedImage`绘制游戏状态。
532

被折叠的 条评论
为什么被折叠?



