使用kotlin開發javafx程序,拼圖遊戲

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
    }
}
相關文章
相關標籤/搜索