使用JavaFx实现拼图游戏

最近学习JavaFx,发现网上大概只有官方文档可以查阅,学习资料较少,写个拼图游戏供记录。。

大概说一下思路:

1.面板的构建:面板采用GridPane,方便3*3的图片布局。

2.每个小格子中的图片当然不是一张张手工切好的,利用imageview.setViewPort(Rectangle2D 2d)的方法进行切割。

3.再来说鼠标点击时图片的移动,这时候以里面的空格子为中心,不以鼠标点击的那个事件源为中心,这样可以避免走弯路(当时我是有一种柳暗花明的感觉。。。)。

4.鼠标点击后空格子和其周围带图片格子的交换就比较简单了,重新设置位置即可。

5.每交换一次检查是否拼图成功。

关于界面初始化:定义一个ImageView的数组,长度为9,将其按顺序分别为第1,2,3....个格子,然后再产生8个0-8的不重复并且逆序数为偶数的随机数的数组,然后将此随机数作为ImageView数组的下标,将ImageView顺序排列在格子中。为什么必须要逆序数为偶数呢?这是因为这样图才能拼成功!

关于判断拼图成功:有了上面的初始化方法,判断就很简单了,只需要ImageView[0]对应第一个格子,,后面类似,,这样就拼成功了。需要注意我们只产生了8个随机数,而我们有9个格子,所以得把那个随机数组中没有的数字找出来,然后比较。有公式:n = 3 * r + c。其中n表示ImageView数组的下标,r表示此imageView的行号,c表示列号。

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.geometry.Rectangle2D;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import java.util.Random;

public class myJigsaw extends Application {
    public int m;      
  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,下面是一个简单的javafx拼图游戏实现,主要是通过拖拽完成拼图: 1. 创建一个JavaFX项目,并在主类中添加以下代码: ```java public class Main extends Application { private static final int TILE_SIZE = 100; private static final int COLUMNS = 4; private static final int ROWS = 4; private Tile[][] board = new Tile[COLUMNS][ROWS]; private Group tileGroup = new Group(); private double dragStartX, dragStartY; private int emptyColumn, emptyRow; @Override public void start(Stage primaryStage) throws Exception{ BorderPane root = new BorderPane(); GridPane grid = new GridPane(); grid.setAlignment(Pos.CENTER); root.setCenter(grid); for (int row = 0; row < ROWS; row++) { for (int column = 0; column < COLUMNS; column++) { Tile tile = new Tile(column, row); board[column][row] = tile; grid.add(tile, column, row); } } shuffle(); Scene scene = new Scene(new Group(tileGroup)); primaryStage.setScene(scene); primaryStage.show(); } private void shuffle() { do { for (int row = 0; row < ROWS; row++) { for (int column = 0; column < COLUMNS; column++) { board[column][row].setColumn(column); board[column][row].setRow(row); tileGroup.getChildren().add(board[column][row]); } } } while (!isSolvable()); removeTile(0, 0); for (int i = 0; i < 1000; i++) { int randomNum = (int) (Math.random() * 4); switch (randomNum) { case 0: if (emptyColumn > 0) { Tile tile = getTile(emptyColumn - 1, emptyRow); if (tile != null) { swap(tile); } } break; case 1: if (emptyColumn < COLUMNS - 1) { Tile tile = getTile(emptyColumn + 1, emptyRow); if (tile != null) { swap(tile); } } break; case 2: if (emptyRow > 0) { Tile tile = getTile(emptyColumn, emptyRow - 1); if (tile != null) { swap(tile); } } break; case 3: if (emptyRow < ROWS - 1) { Tile tile = getTile(emptyColumn, emptyRow + 1); if (tile != null) { swap(tile); } } break; } } } private boolean isSolvable() { int inversions = 0; int[] tiles = new int[COLUMNS * ROWS]; for (int row = 0; row < ROWS; row++) { for (int column = 0; column < COLUMNS; column++) { tiles[row * COLUMNS + column] = board[column][row].getNumber(); } } for (int i = 0; i < tiles.length; i++) { for (int j = i + 1; j < tiles.length; j++) { if (tiles[i] > tiles[j] && tiles[j] != 0) { inversions++; } } } return inversions % 2 == 0; } private void removeTile(int column, int row) { tileGroup.getChildren().remove(board[column][row]); board[column][row] = null; } private Tile getTile(int column, int row) { if (column < 0 || column >= COLUMNS || row < 0 || row >= ROWS) { return null; } return board[column][row]; } private void swap(Tile tile) { double tempX = tile.getLayoutX(); double tempY = tile.getLayoutY(); tile.setLayoutX(emptyColumn * TILE_SIZE); tile.setLayoutY(emptyRow * TILE_SIZE); emptyColumn = tile.getColumn(); emptyRow = tile.getRow(); board[emptyColumn][emptyRow] = tile; tile.setLayoutX(tempX); tile.setLayoutY(tempY); board[tile.getColumn()][tile.getRow()] = null; } public static void main(String[] args) { launch(args); } private class Tile extends StackPane { private int number; private int column; private int row; public Tile(int column, int row) { this.column = column; this.row = row; this.number = row * COLUMNS + column; Rectangle border = new Rectangle(TILE_SIZE, TILE_SIZE); border.setFill(null); border.setStroke(Color.BLACK); setAlignment(Pos.CENTER); getChildren().addAll(border, new Text(String.valueOf(number + 1))); setOnMousePressed(e -> { dragStartX = e.getSceneX(); dragStartY = e.getSceneY(); }); setOnMouseDragged(e -> { relocate(e.getSceneX() - dragStartX + emptyColumn * TILE_SIZE, e.getSceneY() - dragStartY + emptyRow * TILE_SIZE); }); setOnMouseReleased(e -> { int newColumn = (int) (getLayoutX() / TILE_SIZE); int newRow = (int) (getLayoutY() / TILE_SIZE); Tile tile = getTile(newColumn, newRow); if (tile == null) { swap(this); } else { relocate(emptyColumn * TILE_SIZE, emptyRow * TILE_SIZE); } }); } public int getNumber() { return number; } public void setColumn(int column) { this.column = column; } public int getColumn() { return column; } public void setRow(int row) { this.row = row; } public int getRow() { return row; } } } ``` 2. 运行程序,即可看到一个4x4的拼图游戏界面。 3. 拖动拼图块以完成拼图。 以上是一个简单的javafx拼图游戏实现,你可以根据自己的需要进行更改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值