Java怎么实现拼图游戏
发表于:2025-11-15 作者:千家信息网编辑
千家信息网最后更新 2025年11月15日,本篇内容介绍了"Java怎么实现拼图游戏"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!大概说一下思路
千家信息网最后更新 2025年11月15日Java怎么实现拼图游戏
本篇内容介绍了"Java怎么实现拼图游戏"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
大概说一下思路:
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; //m是不在随机数组的那个数字 ImageView[] imageViews = new ImageView[9]; public static void main(String[] args) { Application.launch(args); } @Override public void start(Stage arg0) throws Exception { init(arg0); } public void init(Stage stage) { int[] n = random(); //自定义的函数,产生逆序数为偶数的不重复数组 Image image = new Image("1.png"); GridPane gridPane = new GridPane(); for(int i = 0, k = 0; i <= 2; ++i) { for(int j = 0; j <= 2; ++j, ++k) { imageViews[k] = new ImageView(image); //初始化数组 imageViews[k].setOnMouseClicked(new myevent()); //设置点击事件 imageViews[k].setViewport(new Rectangle2D(100 * j, 100 * i, 100, 100)); //切割图片 } } gridPane.add(imageViews[n[0]], 0, 0); //按照产生的随机数将imageView数组加入面板 gridPane.add(imageViews[n[1]], 1, 0); gridPane.add(imageViews[n[2]], 2, 0); gridPane.add(imageViews[n[3]], 0, 1); gridPane.add(imageViews[n[4]], 1, 1); gridPane.add(imageViews[n[5]], 2, 1); gridPane.add(imageViews[n[6]], 0, 2); gridPane.add(imageViews[n[7]], 1, 2); m = findnum(n); //找出那个不在随机数组里面的数字 ImageView incomp = new ImageView(imageViews[m].getImage()); //用于显示空格子的图片 ImageView comp = new ImageView(image); //用于显示完整的大图 incomp.setViewport(imageViews[m].getViewport()); Image image2 = new Image("2.png"); //2.png为一个透明图,放在空格子中 imageViews[m].setImage(image2); gridPane.add(imageViews[m], 2, 2); gridPane.setGridLinesVisible(true); BorderPane borderPane = new BorderPane(gridPane); VBox right = new VBox(20, incomp, comp); borderPane.setRight(right); Scene scene = new Scene(borderPane, 820, 420); stage.setScene(scene); stage.setResizable(false); stage.show(); } public int[] random() { //生成8个不重复的逆序数为偶数的数字 int[] ran = new int[8]; while(iso(ran) == false) { ran = random_num(); } return ran; } public int[] random_num() { //生成8个不重复数 int r[] = new int[8]; Random random = new Random(); for(int i = 0; i < 8; ++i) { r[i] = random.nextInt(9); for(int j = 0;j < i; ++j) { while(r[i] == r[j]) { i--; break; } } } return r; } public boolean iso(int[] num) { //判断逆序数是否为偶数 int sum = 0; for(int i = 0; i <= 6; ++i) { for(int j = i; j <= 7; j++) { if(num[i] > num[j]) { sum++; } } } if((sum % 2) == 0 && sum != 0) { return true; } return false; } class myevent implements EventHandler { //点击事件的实现 @Override public void handle(MouseEvent arg0) { // TODO Auto-generated method stub ImageView img = (ImageView) arg0.getSource(); double sx = img.getLayoutX(); double sy = img.getLayoutY(); double dispx = sx - imageViews[m].getLayoutX(); double dispy = sy - imageViews[m].getLayoutY(); if((dispx == -100) && (dispy == 0 )) { //点击的空格左边的格子 swapimg(img, imageViews[m]); //交换imageView if(issucc(imageViews)) { //判断是否拼成功 Alert alert = new Alert(AlertType.WARNING, "成功!"); alert.show(); } } else if ((dispx == 0) && (dispy == -100)) { //上面的格子 swapimg(img, imageViews[m]); if(issucc(imageViews)) { Alert alert = new Alert(AlertType.WARNING, "成功!"); alert.show(); } } else if((dispx == 100) && (dispy == 0)) { //右边的格子 swapimg(img, imageViews[m]); if(issucc(imageViews)) { Alert alert = new Alert(AlertType.WARNING, "成功!"); alert.show(); } } else if((dispx == 0) && (dispy == 100)) { //下面的格子 swapimg(img, imageViews[m]); if(issucc(imageViews)) { Alert alert = new Alert(AlertType.WARNING, "成功!"); alert.show(); } } } public void swapimg(ImageView i1, ImageView i2) { //交换两个imageView的实现 int row1 = GridPane.getRowIndex(i1); int colu1 = GridPane.getColumnIndex(i1); int row2 = GridPane.getRowIndex(i2); int colu2 = GridPane.getColumnIndex(i2); GridPane.setRowIndex(i1, row2); GridPane.setColumnIndex(i1, colu2); GridPane.setRowIndex(i2, row1); GridPane.setColumnIndex(i2, colu1); } } public boolean issucc(ImageView[] imageViews) { //判断是否拼成功 for(int i = 0; i <= 8; ++i) { if(i != 3 * GridPane.getRowIndex(imageViews[i]) + GridPane.getColumnIndex(imageViews[i])) { return false; } } return true; } public int findnum(int[] n) { //找出m for(int j = 0; j <= 8; ++j) { if((j == n[0]) || (j == n[1]) || (j == n[2]) || (j == n[3]) || (j == n[4]) || (j == n[5]) || (j == n[6]) || (j == n[7])) { } else { return j; } } return -1; } } "Java怎么实现拼图游戏"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!
成功
数组
格子
图片
偶数
空格
逆序
数字
随机数
事件
面板
面的
鼠标
下标
内容
方法
更多
知识
顺序
生成
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
支部网络安全法
服务器管理口英文
项目经理助理软件开发
中国网安网络安全监测事业部
erp系统关联数据库
美国最快的网络技术
成都德源软件开发企业公司
软件开发验证账号
上海祺轩网络技术 五险一金
房天下网络技术
网络安全网络文明主题班会记录
一个服务器几个ip
交易终端软件开发
开票可视化数据库管理系统
app软件开发手机
ice服务器能用吗
计算机网络安全常用的措施
服务器内存可以装在家用电脑上吗
树莓派web服务器通讯
软件开发协议
西青区电子网络技术答疑解惑
电力机车视频软件开发
山东软件开发兼职
学网络安全怎么入门
大巴包车软件开发
券商 软件开发投入
如何提升服务器的安全性
telnet远程登陆服务器
网络安全团活动报告
抚湖享游网络技术有限公司