引自免费微信小程序:皆我百晓生
为了创建一个简单的Java拼图游戏,我们可以按照以下几个步骤进行:
- 创建一个基本的图形界面(GUI)。
- 定义拼图的逻辑,包括图片切割、随机排列、移动块等。
- 实现用户交互,如鼠标点击事件处理。
首先,我们需要导入必要的库:
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import static javax.imageio.ImageIO.read;
然后,我们定义一个名为JigsawPuzzleGame
的类,包含主方法和游戏逻辑:
public class JigsawPuzzleGame extends JFrame {
private static final int WINDOW_WIDTH = 800;
private static final int WINDOW_HEIGHT = 600;
private static final int TILE_SIZE = 100;
private static final int NUM_TILES_X = 8;
private static final int NUM_TILES_Y = 6;
private static final String IMAGE_PATH = "path_to_your_image.jpg"; // 替换为你的图片路径
private BufferedImage originalImage;
private List<JButton> tiles;
private int[][] tileMap;
private int remainTimes = 56; // 总计时秒数
private int dijiguan = 0; // 秒数计数器
public JigsawPuzzleGame() {
setTitle("Jigsaw Puzzle Game");
setSize(WINDOW_WIDTH, WINDOW_HEIGHT);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
originalImage = loadOriginalImage(IMAGE_PATH);
createTiles();
generateTileMap();
addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
moveTile(e.getX(), e.getY());
}
});
setVisible(true);
}
private void loadOriginalImage(String imagePath) {
try {
return read(new File(imagePath));
} catch (IOException ex) {
System.out.println("Error loading image: " + ex.getMessage());
return null;
}
}
private void createTiles() {
tiles = new ArrayList<>();
int tileSize = originalImage.getWidth() / NUM_TILES_X;
for (int y = 0; y < NUM_TILES_Y; y++) {
for (int x = 0; x < NUM_TILES_X; x++) {
int startX = x * tileSize;
int startY = y * tileSize;
int endX = Math.min(startX + tileSize, originalImage.getWidth());
int endY = Math.min(startY + tileSize, originalImage.getHeight());
BufferedImage tile = originalImage.getSubimage(startX, startY, endX - startX, endY - startY);
JButton button = new JButton();
button.setPreferredSize(new Dimension(tileSize, tileSize));
button.setBorderPainted(false);
button.setContentAreaFilled(false);
button.setIcon(new ImageIcon(tile));
tiles.add(button);
add(button);
}
}
}
private void generateTileMap() {
tileMap = new int[NUM_TILES_X][NUM_TILES_Y];
for (int i = 0; i < tiles.size(); i++) {
tileMap[i % NUM_TILES_X][i / NUM_TILES_X] = i;
}
Collections.shuffle(Arrays.asList(tileMap), new Random(System.currentTimeMillis()));
}
private void moveTile(int mouseX, int mouseY) {
for (JButton tile : tiles) {
Rectangle bounds = tile.getBounds();
if (bounds.contains(mouseX, mouseY)) {
int targetIndex = getTileIndexAtPosition(mouseX, mouseY);
swapTiles(tile, targetIndex);
break;
}
}
}
private int getTileIndexAtPosition(int mouseX, int mouseY) {
int col = mouseX / TILE_SIZE;
int row = mouseY / TILE_SIZE;
return row * NUM_TILES_X + col;
}
private void swapTiles(JButton sourceTile, int targetIndex) {
int sourceIndex = tiles.indexOf(sourceTile);
int temp = tileMap[targetIndex / NUM_TILES_X][targetIndex % NUM_TILES_X];
tileMap[targetIndex / NUM_TILES_X][targetIndex % NUM_TILES_X] = tileMap[sourceIndex / NUM_TILES_X][sourceIndex % NUM_TILES_X];
tileMap[sourceIndex / NUM_TILES_X][sourceIndex % NUM_TILES_X] = temp;
JButton targetTile = tiles.get(targetIndex);
remove(sourceTile);
remove(targetTile);
add(sourceTile);
add(targetTile);
validate();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new JigsawPuzzleGame());
}
}
这个代码示例提供了一个基本的Java拼图游戏,它将图片分割成小方块并随机排列。玩家可以通过拖动这些方块来尝试完成拼图。注意,这个实现没有包含计时功能,你需要在主方法里添加一个线程来控制剩余时间和暂停/继续功能。此外,你可能还需要根据需求对UI进行美化和优化。