JAVA数字华容道,要有图形化界面-完整代码
时间: 2024-02-17 19:01:55 浏览: 38
好的,以下是一个简单的Java数字华容道图形化界面的完整代码,使用的是Swing库:
```java
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class DigitalHuarongDao extends JFrame implements ActionListener {
private static final long serialVersionUID = 1L;
private final int ROWS = 4; // 行数
private final int COLS = 4; // 列数
private JButton[][] btns = new JButton[ROWS][COLS]; // 按钮数组
private ArrayList<Integer> nums = new ArrayList<Integer>(); // 存储数字
private int blankRow; // 空白块所在行
private int blankCol; // 空白块所在列
public DigitalHuarongDao() {
setTitle("数字华容道");
setSize(400, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
setLocationRelativeTo(null);
init();
setVisible(true);
}
private void init() {
JPanel panel = new JPanel(new GridLayout(ROWS, COLS));
for (int i = 0; i < ROWS; i++) {
for (int j = 0; j < COLS; j++) {
JButton btn = new JButton();
btn.addActionListener(this);
panel.add(btn);
btns[i][j] = btn;
}
}
add(panel);
startGame();
}
private void startGame() {
nums.clear();
for (int i = 1; i < ROWS * COLS; i++) {
nums.add(i);
}
nums.add(0); // 0表示空白块
Collections.shuffle(nums);
for (int i = 0; i < ROWS; i++) {
for (int j = 0; j < COLS; j++) {
int num = nums.get(i * COLS + j);
btns[i][j].setText(num == 0 ? "" : num + "");
if (num == 0) {
blankRow = i;
blankCol = j;
}
}
}
}
private boolean move(int row, int col) {
if (row == blankRow && col == blankCol) {
return false;
}
if (row == blankRow) { // 同一行
int min = Math.min(col, blankCol);
int max = Math.max(col, blankCol);
for (int i = min + 1; i < max; i++) {
if (nums.get(row * COLS + i) != 0) {
return false;
}
}
nums.set(blankRow * COLS + blankCol, nums.get(row * COLS + col));
nums.set(row * COLS + col, 0);
btns[blankRow][blankCol].setText(btns[row][col].getText());
btns[row][col].setText("");
blankCol = col;
return true;
} else if (col == blankCol) { // 同一列
int min = Math.min(row, blankRow);
int max = Math.max(row, blankRow);
for (int i = min + 1; i < max; i++) {
if (nums.get(i * COLS + col) != 0) {
return false;
}
}
nums.set(blankRow * COLS + blankCol, nums.get(row * COLS + col));
nums.set(row * COLS + col, 0);
btns[blankRow][blankCol].setText(btns[row][col].getText());
btns[row][col].setText("");
blankRow = row;
return true;
}
return false;
}
private boolean isWin() {
for (int i = 0; i < ROWS * COLS - 1; i++) {
if (nums.get(i) != i + 1) {
return false;
}
}
return true;
}
@Override
public void actionPerformed(ActionEvent e) {
JButton btn = (JButton) e.getSource();
int row = -1, col = -1;
for (int i = 0; i < ROWS; i++) {
for (int j = 0; j < COLS; j++) {
if (btns[i][j] == btn) {
row = i;
col = j;
break;
}
}
}
if (move(row, col)) {
if (isWin()) {
JOptionPane.showMessageDialog(this, "恭喜您,游戏胜利!");
startGame();
}
}
}
public static void main(String[] args) {
new DigitalHuarongDao();
}
}
```
在这个代码中,我们首先创建了一个JFrame窗口,并在其中添加了一个4x4的按钮矩阵。在startGame方法中,我们使用Collections.shuffle方法打乱了数字,并将它们放置在按钮上。然后,我们实现了move方法来移动数字块,并使用isWin方法来判断游戏是否胜利。最后,我们在actionPerformed方法中监听按钮点击事件,并在移动数字块后检查是否获胜。