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 fun main(args: Array<String>) = Application.launch(PingTu::class.java, *args) class PingTu : Application() { val N = 9 val n = random() //自定義的函數,產生逆序數爲偶數的不重複數組 val m = findnum(n) //找出那個不在隨機數組裏面的數字 val imageViews = (1..N).map { ImageView() }.toTypedArray() @Throws(Exception::class) override fun start(arg0: Stage) { init(arg0) } fun init(stage: Stage) { val image = Image("pingtu/1.png") val gridPane = GridPane() var k = 0 (0.. 2).forEach {i-> (0.. 2).forEach {j-> imageViews[k] = ImageView(image) //初始化數組 imageViews[k].onMouseClicked = Myevent() //設置點擊事件 imageViews[k].viewport = Rectangle2D(100.0 * j, 100.0 * i, 100.0, 100.0) //切割圖片 ++k } } k = 0 (0.. 2).forEach {i-> (0.. 2).forEach {j-> if (k<8){//按照產生的隨機數將imageView數組加入面板 gridPane.add(imageViews[n[k]], j, i) } ++k } } val incomp = ImageView(imageViews[m].image) //用於顯示空格子的圖片 incomp.viewport = imageViews[m].viewport val image2 = Image("pingtu/2.png") //2.png爲一個透明圖,放在空格子中 imageViews[m].image = image2 gridPane.add(imageViews[m], 2, 2) gridPane.isGridLinesVisible = true val borderPane = BorderPane(gridPane) val comp = ImageView(image) //用於顯示完整的大圖 borderPane.right = VBox(20.0, incomp, comp) stage.scene = Scene(borderPane, 820.0, 420.0) stage.isResizable = false stage.title = "拼圖" stage.show() } inner class Myevent : EventHandler<MouseEvent> { //點擊事件的實現 override fun handle(arg0: MouseEvent) { // TODO Auto-generated method stub val img = arg0.source as ImageView val sx = img.layoutX val sy = img.layoutY val dispx = sx - imageViews[m].layoutX val dispy = sy - imageViews[m].layoutY if (dispx == -100.0 && dispy == 0.0) { //點擊的空格左邊的格子 swapimg(img, imageViews[m]) //交換imageView if (issucc(imageViews)) { //判斷是否拼成功 val alert = Alert(AlertType.WARNING, "成功!") alert.show() } } else if (dispx == 0.0 && dispy == -100.0) { //上面的格子 swapimg(img, imageViews[m]) if (issucc(imageViews)) { val alert = Alert(AlertType.WARNING, "成功!") alert.show() } } else if (dispx == 100.0 && dispy == 0.0) { //右邊的格子 swapimg(img, imageViews[m]) if (issucc(imageViews)) { val alert = Alert(AlertType.WARNING, "成功!") alert.show() } } else if (dispx == 0.0 && dispy == 100.0) { //下面的格子 swapimg(img, imageViews[m]) if (issucc(imageViews)) { val alert = Alert(AlertType.WARNING, "成功!") alert.show() } } } fun swapimg(i1: ImageView, i2: ImageView) { //交換兩個imageView的實現 val row1 = GridPane.getRowIndex(i1) val colu1 = GridPane.getColumnIndex(i1) val row2 = GridPane.getRowIndex(i2) val colu2 = GridPane.getColumnIndex(i2) GridPane.setRowIndex(i1, row2) GridPane.setColumnIndex(i1, colu2) GridPane.setRowIndex(i2, row1) GridPane.setColumnIndex(i2, colu1) } } fun issucc(imageViews: Array<ImageView>): Boolean { //判斷是否拼成功 (0..8).forEach { i -> if (i != 3 * GridPane.getRowIndex(imageViews[i]) + GridPane.getColumnIndex(imageViews[i])) { return false } } return true } fun findnum(n: IntArray): Int { //找出m (0..8).forEach { j -> if (j in n) { } else { return j } } return -1 } fun random(): IntArray { //生成8個不重複的逆序數爲偶數的數字 var ran = IntArray(8) while (!iso(ran)) { ran = random_num() } return ran } fun random_num(): IntArray { //生成8個不重複數 val r = IntArray(8) val random = Random() var i = 0 while (i < 8) { r[i] = random.nextInt(9) for (j in 0 until i) { while (r[i] == r[j]) { i-- break } } ++i } return r } fun iso(num: IntArray): Boolean { //判斷逆序數是否爲偶數 var sum = 0 for (i in 0..6) { for (j in i..7) { if (num[i] > num[j]) { sum++ } } } return sum % 2 == 0 && sum != 0 } }