java火柴游戏_java编写火柴游戏

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

展开全部

画面上按左边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();

}

}

}

本回答由网友推荐

2Q==

已赞过

已踩过<

你对这个回答的评价是?

评论

收起

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值