夜晚八点,老太打开了 Visual Studio Code,心想要是有个小游戏热炕头,就会彻夜难眠了。
突然,她想到了在娘胎里玩的扫雷,正好自己大一的时候学过一点点 java,那就用 java 编写一个扫雷来解解闷吧。
老太经过上网搜寻,发现 java.swing 包中自带一个好货 JFrame:
在 Java 中,是 Swing 库中的一个类,用于创建图形用户界面(GUI)。对象是一个窗口,可以包含其他 Swing 组件,如按钮()、标签()、文本框()等。
例如:
导入 javax.swing.*;
公共类 SimpleFrameDemo {
public static void main(String [] 参数) {
创建一个新的 JFrame 实例
JFrame 帧 = new JFrame(“我的第一个 JFrame”);
设置窗口关闭时的操作
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
设置窗口的大小
frame.setSize(300, 200);
显示窗口
frame.setVisible(真);
}
}
于是老太决定导入 awt 和 swing 包
import java.util.*;
import java.awt.*;
然后创建一个类继承 JFrame
public class Minesweeper extends JFrame{}
老太再三思索决定设置一个面板为 10*10,10 个雷的扫雷,这样既不会太简单也不会太难:
// 设置面板大小
private static final int SIZE = 10;
// 设置初始雷数
private static final int MINE_COUNT = 10;
// 设置二位数组
private JButton[][] buttons = new JButton[SIZE][SIZE];
// 判断是否为雷
private boolean[][] mines = new boolean[SIZE][SIZE];
老太苦思冥想,终于想起来是一种将组件布局成行列网格的布局管理器。创建了一个新的实例,其行数和列数都等于,于是自信的打下了
public Minesweeper() {
setLayout(new GridLayout(SIZE, SIZE));
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(600, 600);
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int x = -1, y = -1;
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
if (button == buttons[i][j]) {
x = i;
y = j;
}
}
}
if (mines[x][y]) {
JOptionPane.showMessageDialog(null, “You lost!”);
System.exit(0);
} else {
int mineCount = 0;
for (int dx = -1; dx <= 1; dx++) {
for (int dy = -1; dy <= 1; dy++) {
int nx = x + dx;
int ny = y + dy;
if (nx >= 0 && ny >= 0 && nx < SIZE && ny < SIZE) {
if (mines[nx][ny]) {
mineCount++;
}
}
}
}
button.setText(Integer.toString(mineCount));
}
}
});
buttons[i][j] = button;
add(button);
}
}
Random random = new Random();
for (int i = 0; i < MINE_COUNT; i++) {
int x = random.nextInt(SIZE);
int y = random.nextInt(SIZE);
mines[x][y] = true;
}
setVisible(true);
}
以下是以上代码的知识点:
这行代码创建了一个新的按钮
JButton button = new JButton();
这行代码为按钮添加了一个动作监听器。当用户点击按钮时,就会触发这个监听器的方法
button.addActionListener(new ActionListener() {...});
actionPerformed
在方法中,首先通过遍历所有的按钮来找出被点击的按钮的坐标。然后,检查这个坐标在数组中对应的值。如果值为,那么说明这个方格中有雷,游戏结束,显示一个对话框告诉用户他们输了,然后退出程序。如果值为,那么说明这个方格中没有雷,需要计算这个方格周围的雷的数量。计算完成后,将这个数量显示在按钮上
actionPerformed
mines
true
false
这行代码将创建的按钮存储在数组中,以便后续使用
buttons[i][j] = button;
buttons
这行代码将按钮添加到窗口中,使其可以在界面上显示出来
add(button);
加入 min 函数就可以运行啦
public static void main(String[] args) {
new Minesweeper();
}
至此,老太心满意足的开始游 van 了。
更多博客可以访问我的博客--玛卡巴卡的小推车欢迎来到—-玛卡巴卡的小推车 – 大概或许可能温馨的小站 (marcbarkblog.azurewebsites.net)