javaswing做扫雷
时间: 2025-01-04 18:20:43 浏览: 13
### 使用 Java Swing 开发扫雷游戏
#### 创建主类和初始化窗口
为了构建一个基本的扫雷游戏,首先需要设置好项目的结构并创建主要的应用程序入口。这涉及到定义应用程序的主要框架以及配置初始的游戏参数。
```java
import javax.swing.*;
import java.awt.*;
public class Minesweeper extends JFrame {
private static final int WIDTH = 800;
private static final int HEIGHT = 600;
public Minesweeper() {
setTitle("Minesweeper Game");
setSize(WIDTH, HEIGHT);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null); // Center the window on screen.
initUI();
}
private void initUI() {
add(new Board());
}
}
```
这段代码设置了应用的基本属性,并通过`initUI()`方法引入了核心组件——游戏板(`Board`)[^1]。
#### 设计游戏面板 (Board 类)
接下来是实现游戏的核心逻辑部分,在这里将定义棋盘大小、地雷分布规则以及其他必要的操作函数:
```java
class Board extends JPanel implements ActionListener {
private Timer timer;
private final int MINE_SIZE = 20;
private final int BOARD_WIDTH = 400 / MINE_SIZE;
private final int BOARD_HEIGHT = 400 / MINE_SIZE;
private final int TOTAL_MINES = 40;
private boolean[][] mineField = new boolean[BOARD_WIDTH][BOARD_HEIGHT];
private JLabel statusbar;
public Board() {
setLayout(new GridLayout(BOARD_WIDTH, BOARD_HEIGHT));
setBackground(Color.lightGray);
setupGame();
statusbar = new JLabel(" Welcome to Minesweeper!");
add(statusbar);
timer = new Timer(35, this);
timer.start();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
drawGrid((Graphics2D)g);
}
private void drawGrid(Graphics2D g2d){
for(int row=0 ;row<BOARD_HEIGHT; ++row){
for(int col=0;col<BOARD_WIDTH;++col){
if(mineField[col][row]){
g2d.setColor(Color.RED);
}else{
g2d.setColor(Color.BLUE);
}
g2d.fillRect(col * MINE_SIZE , row*MINE_SIZE,MINE_SIZE-1,MINE_SIZE-1 );
}
}
}
private void setupGame(){
placeMinesRandomly();
// Additional game initialization can be done here...
}
private void placeMinesRandomly(){
int minesPlaced = 0;
while(minesPlaced < TOTAL_MINES){
int x = (int)(Math.random()*BOARD_WIDTH);
int y = (int)(Math.random()*BOARD_HEIGHT);
if(!mineField[x][y]){
mineField[x][y]=true;
++minesPlaces;
}
}
}
@Override
public void actionPerformed(ActionEvent e) {
repaint();
}
}
```
上述代码片段展示了如何绘制网格状布局,并随机放置一定数量的地雷到游戏中去。注意这里的绘图过程是在重写的 `paintComponent` 方法内完成的,而定时器用于触发重新绘制界面的操作[^3]。
#### 启动应用程序
最后一步就是编写启动代码来运行整个程序:
```java
public static void main(String[] args) {
EventQueue.invokeLater(() -> {
var ex = new Minesweeper();
ex.setVisible(true);
});
}
```
此段代码利用了Java中的事件调度线程(Event Dispatch Thread),确保所有的GUI更新都在同一个线程中执行,从而保持界面响应的一致性和稳定性[^2]。
阅读全文