之前写的一个点灯小游戏,没什么技术含量。
截图:
代码:
类Start:
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.UIManager;
public class Start {
public static void main(String[] args) {
// 使用Windows的界面风格
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
} catch (Exception e) {
e.printStackTrace();
}
new MainFrame().setVisible(true);
}
}
类MainFrame:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Random;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class MainFrame extends JFrame implements ActionListener {
private static final long serialVersionUID = 1L;
private static final int PER_PIECE_SIZE = 50;
private static final int GAMEAREA_X = 10, GAMEAREA_Y = 20;
private static final int MAX_PIECES_DEGREE = (Toolkit.getDefaultToolkit().getScreenSize().height - 100) / PER_PIECE_SIZE;
private GamePanel gamePanel;
private JPanel configPanel;
private JTextField sizeTF;
private JButton startBtn;
private JLabel stepLabel;
private int light[][];
private int steps;
private boolean isWin;
private Random rand = new Random(System.currentTimeMillis());
public MainFrame() {
setTitle("点灯游戏");
setSize(400, 300);
//setLayout(null);
setResizable(false);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
gamePanel = new GamePanel();
gamePanel.setBorder(BorderFactory.createTitledBorder("规则:将所有灯调至同种颜色"));
gamePanel.addMouseListener(new MyMouseListener());
add(gamePanel, BorderLayout.CENTER);
configPanel = new JPanel();
add(configPanel, BorderLayout.SOUTH);
sizeTF = new JTextField("4");
sizeTF.setColumns(6);
sizeTF.addKeyListener(new MyKeyListener());
configPanel.add(sizeTF);
startBtn = new JButton("开始");
startBtn.addActionListener(this);
configPanel.add(startBtn);
stepLabel = new JLabel();
configPanel.add(stepLabel);
start();
}
public void init(int rows) {
light = new int[rows][];
for (int i = 0; i < rows; i++) {
light[i] = new int[rows];
}
for (int i = 0; i < rows; i++) {
int r = Math.abs(rand.nextInt() % (rows * rows));
light[r / rows][r % rows] = 1;
}
}
public void start() {
int rows = 0;
try {
rows = Integer.valueOf(sizeTF.getText().trim());
if (rows < 2) {
JOptionPane.showMessageDialog(null, "大点行么?", "干", JOptionPane.INFORMATION_MESSAGE);
sizeTF.setText("");
sizeTF.requestFocus();
return;
} else if (rows > MAX_PIECES_DEGREE) {
JOptionPane.showMessageDialog(null, "小点行么,你屏幕放的下?", "干", JOptionPane.INFORMATION_MESSAGE);
sizeTF.setText("");
sizeTF.requestFocus();
return;
}
} catch (Exception e1) {
JOptionPane.showMessageDialog(null, "不要乱输入,OK?", "无语", JOptionPane.ERROR_MESSAGE);
sizeTF.setText("");
sizeTF.requestFocus();
return;
}
init(rows);
int width = PER_PIECE_SIZE * rows + 20;
int height = PER_PIECE_SIZE * rows + 30;
gamePanel.setSize(width, height);
gamePanel.repaint();
steps = 0;
stepLabel.setText("");
setSize(width + 10, height + 70);
repaint();
setLocationRelativeTo(null);
isWin = false;
}
@Override
public void actionPerformed(ActionEvent e) {
start();
}
public void click(int x, int y) {
int rows = light.length;
for (int i = x - 1; i <= x + 1; i++) {
if (i < 0 || i > rows - 1 || i == x) continue;
light[y][i] = light[y][i] == 0 ? 1 : 0;
//System.out.println("m" + i + " " + y);
}
for (int j = y - 1; j <= y + 1; j++) {
if (j < 0 || j > rows - 1 || j == y) continue;
light[j][x] = light[j][x] == 0 ? 1 : 0;
}
light[y][x] = light[y][x] == 0 ? 1 : 0;
}
public boolean win() {
if (isWin == true) return true;
int first = light[0][0];
for (int i = 0; i < light.length; i++) {
for (int j = 0; j < light[i].length; j++) {
if (light[i][j] != first) return false;
}
}
isWin = true;
return true;
}
class MyKeyListener extends KeyAdapter {
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
start();
}
}
}
class GamePanel extends JPanel {
private static final long serialVersionUID = 1L;
@Override
public void paint(Graphics g) {
super.paint(g);
if (light == null) return;
int rows = light.length;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < rows; j++) {
if (light[i][j] == 0)
g.setColor(Color.BLACK);
else
g.setColor(Color.WHITE);
g.fillRect(j * PER_PIECE_SIZE + GAMEAREA_X, i * PER_PIECE_SIZE + GAMEAREA_Y, PER_PIECE_SIZE - 1, PER_PIECE_SIZE - 1);
}
}
g.setColor(Color.GRAY);
int tmp;
for (int i = 0; i <= rows; i++) {
tmp = PER_PIECE_SIZE * i - 1;
g.drawLine(GAMEAREA_X - 1, tmp + GAMEAREA_Y, PER_PIECE_SIZE * rows + GAMEAREA_X - 1, tmp + GAMEAREA_Y);
g.drawLine(tmp + GAMEAREA_X, GAMEAREA_Y - 1, tmp + GAMEAREA_X, PER_PIECE_SIZE * rows + GAMEAREA_Y - 1);
}
g.setColor(Color.RED);
if (isWin) {
g.drawString("You Win! steps:" + steps, 20, 65);
}
}
}
class MyMouseListener extends MouseAdapter {
@Override
public void mousePressed(MouseEvent e) {
if (isWin || light == null) return;
int rows = light.length;
int x = e.getX() - 10;
int y = e.getY() - 20;
if (x < 0 || x >= PER_PIECE_SIZE * rows || y < 0 || y >= PER_PIECE_SIZE * rows) return;
x /= PER_PIECE_SIZE;
y /= PER_PIECE_SIZE;
//System.out.println(x + " " +y);
switch (e.getButton()) {
case MouseEvent.BUTTON1:
click(x, y);
break;
case MouseEvent.BUTTON2:
return;
case MouseEvent.BUTTON3:
light[y][x] = light[y][x] == 0 ? 1 : 0;
break;
}
win();
steps++;
stepLabel.setText("步数:" + steps);
gamePanel.repaint();
}
}
}