2048小游戏java源代码(通过GUI界面)带注释
时间: 2023-07-12 14:13:34 浏览: 51
很高兴回答您的问题。以下是一个简单的2048小游戏Java源代码,带有注释,通过GUI界面实现:
```
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class Game2048 extends JFrame implements ActionListener {
private static final long serialVersionUID = 1L;
private JPanel gamePanel; // 游戏界面面板
private JButton[][] grid; // 游戏面板的格子
private int[][] values; // 每个格子的值
private int score; // 当前得分
private Random random; // 用于生成随机数的随机器
public Game2048() {
setTitle("2048 Game");
setSize(500, 500);
setDefaultCloseOperation(EXIT_ON_CLOSE);
// 初始化游戏面板和格子
gamePanel = new JPanel(new GridLayout(4, 4));
grid = new JButton[4][4];
values = new int[4][4];
random = new Random();
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
grid[i][j] = new JButton();
gamePanel.add(grid[i][j]);
grid[i][j].addActionListener(this);
}
}
// 在随机的两个格子上生成数字
generateRandomNumber();
generateRandomNumber();
// 将游戏面板添加到窗口上
add(gamePanel);
setVisible(true);
}
// 生成随机数
private void generateRandomNumber() {
int i, j;
do {
i = random.nextInt(4);
j = random.nextInt(4);
} while (values[i][j] != 0);
values[i][j] = random.nextDouble() < 0.9 ? 2 : 4;
grid[i][j].setText("" + values[i][j]);
}
// 判断游戏是否结束
private boolean gameOver() {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (values[i][j] == 0)
return false;
if (i > 0 && values[i][j] == values[i - 1][j])
return false;
if (i < 3 && values[i][j] == values[i + 1][j])
return false;
if (j > 0 && values[i][j] == values[i][j - 1])
return false;
if (j < 3 && values[i][j] == values[i][j + 1])
return false;
}
}
return true;
}
// 处理按钮点击事件
@Override
public void actionPerformed(ActionEvent e) {
// 找到被点击的按钮在数组中的位置
int row = -1, col = -1;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (e.getSource() == grid[i][j]) {
row = i;
col = j;
break;
}
}
}
// 合并数字
boolean merged = false;
if (row > 0 && values[row - 1][col] == values[row][col]) {
values[row - 1][col] += values[row][col];
values[row][col] = 0;
grid[row - 1][col].setText("" + values[row - 1][col]);
grid[row][col].setText("");
score += values[row - 1][col];
merged = true;
}
if (row < 3 && values[row + 1][col] == values[row][col]) {
values[row + 1][col] += values[row][col];
values[row][col] = 0;
grid[row + 1][col].setText("" + values[row + 1][col]);
grid[row][col].setText("");
score += values[row + 1][col];
merged = true;
}
if (col > 0 && values[row][col - 1] == values[row][col]) {
values[row][col - 1] += values[row][col];
values[row][col] = 0;
grid[row][col - 1].setText("" + values[row][col - 1]);
grid[row][col].setText("");
score += values[row][col - 1];
merged = true;
}
if (col < 3 && values[row][col + 1] == values[row][col]) {
values[row][col + 1] += values[row][col];
values[row][col] = 0;
grid[row][col + 1].setText("" + values[row][col + 1]);
grid[row][col].setText("");
score += values[row][col + 1];
merged = true;
}
// 移动数字
if (!merged && row >= 0 && col >= 0 && row <= 3 && col <= 3
&& values[row][col] != 0) {
JOptionPane.showMessageDialog(this, "Invalid move!");
} else {
generateRandomNumber();
if (gameOver()) {
JOptionPane.showMessageDialog(this, "Game over!\nYour score: " + score);
System.exit(0);
}
}
}
public static void main(String[] args) {
new Game2048();
}
}
```
希望这个程序对您有所帮助!