Skip to content
main.qml 8.81 KiB
Newer Older
import QtQuick 2.4
import QtQuick.Window 2.2

Window {
    width: 400
    height: 400
    visible: true

    property var map: [
        [1,1,1,1,1,1,1],
        [1,0,0,2,0,0,1],
        [1,0,1,1,1,1,1],
        [1,0,0,0,0,0,1],
        [1,0,0,0,0,0,1],
        [1,0,0,0,0,0,1],
        [1,1,1,1,1,1,1]]

    property var start: {"id":31,"x":3,"y":1,"G":0,"H":0,"Z":0,"parent":-1}
    property var end:   {"id":45,"x":4,"y":5,"G":0,"H":0,"Z":0,"parent":-1}
    property var nodes: {"Zero":[]}
    property var openNodesId: []
    property var closedNodesId: []
    property var allNodeIds: []

    function getFriends(node) {
        var friends = []
        var modXZero  = (end.x-node.x < 0     ? -1*(end.x-node.x)     : end.x-node.x    )*10
        var modXPlus  = (end.x-(node.x+1) < 0 ? -1*(end.x-(node.x+1)) : end.x-(node.x+1))*10
        var modXMinus = (end.x-(node.x-1) < 0 ? -1*(end.x-(node.x-1)) : end.x-(node.x-1))*10
        var modYZero  = (end.y-node.y < 0     ? -1*(end.y-node.y)     : end.y-node.y    )*10
        var modYPlus  = (end.y-(node.y+1) < 0 ? -1*(end.y-(node.y+1)) : end.y-(node.y+1))*10
        var modYMinus = (end.y-(node.y-1) < 0 ? -1*(end.y-(node.y-1)) : end.y-(node.y-1))*10

//        if (node.x == 0) {
//            if (map[node.y][node.x + 1] != 1) {
//                var newNode1 = {"x":node.x+1,"y":node.y,"G":node.G+10,"H":modXPlus,"F":node.G+10+modXPlus+modYZero,"Z":1}
//                newNode1.id = ((newNode1.x*10) + newNode1.y) < 10 ? "0" + ((newNode1.x*10) + newNode1.y) : ((newNode1.x*10) + newNode1.y)
//                newNode1.parent = ""+ (((node.x*10) + node.y) < 10 ? "0" : "") + "" + ((node.x*10) + node.y)
//                friends.push(newNode1)
//            }
//        } else if (node.x == map[0].length) {
//            if (map[node.y][node.x - 1] != 1) {
//                var newNode2 = {"x":node.x-1,"y":node.y,"G":node.G+10,"H":modXMinus,"F":node.G+10+modXMinus+modYZero,"Z":2}
//                newNode2.id = ((newNode2.x*10) + newNode2.y) < 10 ? "0" + ((newNode2.x*10) + newNode2.y) : ((newNode2.x*10) + newNode2.y)
//                newNode2.parent = ""+ (((node.x*10) + node.y) < 10 ? "0" : "") + "" + ((node.x*10) + node.y)
//                friends.push(newNode2)
//            }
//        } else {
            if (map[node.y][node.x + 1] != 1) {
                var newNode3 = {"x":node.x+1,"y":node.y,"G":node.G+10,"H":modXPlus,"F":node.G+10+modXPlus+modYZero,"Z":3}
                newNode3.id = ((newNode3.x*10) + newNode3.y) < 10 ? "0" + ((newNode3.x*10) + newNode3.y) : ((newNode3.x*10) + newNode3.y)
                newNode3.parent = ""+ (((node.x*10) + node.y) < 10 ? "0" : "") + "" + ((node.x*10) + node.y)
                friends.push(newNode3)
            }
            if (map[node.y][node.x - 1] != 1) {
                var newNode4 = {"x":node.x-1,"y":node.y,"G":node.G+10,"H":modXMinus,"F":node.G+10+modXMinus+modYZero,"Z":4}
                newNode4.id = ((newNode4.x*10) + newNode4.y) < 10 ? "0" + ((newNode4.x*10) + newNode4.y) : ((newNode4.x*10) + newNode4.y)
                newNode4.parent = ""+ (((node.x*10) + node.y) < 10 ? "0" : "") + "" + ((node.x*10) + node.y)
                friends.push(newNode4)
            }
//        }

//        if (node.y == 0) {
//            if (map[node.y + 1][node.x] != 1) {
//                var newNode5 = {"x":node.x,"y":node.y+1,"G":node.G+10,"H":modYPlus,"F":node.G+10+modYPlus+modXZero,"Z":5}
//                newNode5.id = ((newNode5.x*10) + newNode5.y) < 10 ? "0" + ((newNode5.x*10) + newNode5.y) : ((newNode5.x*10) + newNode5.y)
//                newNode5.parent = ""+ (((node.x*10) + node.y) < 10 ? "0" : "") + "" + ((node.x*10) + node.y)
//                friends.push(newNode5)
//            }
//        } else if (node.y == map.length) {
//            if (map[node.y + 1][node.x] != 1) {
//                var newNode6 = {"x":node.x,"y":node.y-1,"G":node.G+10,"H":modYMinus,"F":node.G+10+modYMinus,"Z":6}
//                newNode6.id = ((newNode6.x*10) + newNode6.y) < 10 ? "0" + ((newNode6.x*10) + newNode6.y) : ((newNode6.x*10) + newNode6.y)
//                newNode6.parent = ""+((node.x*10) + node.y)
//                friends.push(newNode6)
//            }
//        } else {
            if (map[node.y + 1][node.x] != 1) {
                var newNode7 = {"x":node.x,"y":node.y+1,"G":node.G+10,"H":modYPlus,"F":node.G+10+modYPlus+modXZero,"Z":7}
                newNode7.id = ((newNode7.x*10) + newNode7.y) < 10 ? "0" + ((newNode7.x*10) + newNode7.y) : ((newNode7.x*10) + newNode7.y)
                newNode7.parent = ""+ (((node.x*10) + node.y) < 10 ? "0" : "") + "" + ((node.x*10) + node.y)
                friends.push(newNode7)
            }
            if (map[node.y - 1][node.x] != 1) {
                var newNode8 = {"x":node.x,"y":node.y-1,"G":node.G+10,"H":modYMinus,"F":node.G+10+modYMinus+modXZero,"Z":8}
                newNode8.id = ((newNode8.x*10) + newNode8.y) < 10 ? "0" + ((newNode8.x*10) + newNode8.y) : ((newNode8.x*10) + newNode8.y)
                newNode8.parent = ""+ (((node.x*10) + node.y) < 10 ? "0" : "") + "" + ((node.x*10) + node.y)
                friends.push(newNode8)
            }
//        }

        for (var i = 0; i < friends.length; i++) {
            map[friends[i].y][friends[i].x] = 3
        }

        console.log(friends.length)
        return friends
    }

    function orderByF(list) {
        var j,i,key;
        for(j = 1; j < list.length; j++){
            key = list[j];
            i = j - 1;
            while(i >= 0 && list[i].F > key.F){
                list[i + 1] = list[i];
                i = i - 1;
            }
            list[i + 1] = key;
        }
        return list
    }

    function orderByFFromNodes() {
        var j,i,key;
        for(j = 1; j < openNodesId.length; j++){
            key = nodes[openNodesId[j]];
            i = j - 1;
            console.log("ordering node = ",openNodesId[i]," i=",i," j=",j)
            while(i >= 0 && nodes[openNodesId[i]].F > key.F){
                openNodesId[i + 1] = openNodesId[i];
                i = i - 1;
            }
            openNodesId[i + 1] = key.id;
        }
    }

    function printMap() {
        console.log("\n")
        for (var i = 0; i < map.length; i++) {
            var line = ""
            for (var j = 0; j < map[i].length; j++) {
                line += map[i][j] + " "
            }
            console.log(line)
        }
        console.log("\n")
    }

    function search() {

        var it = 0;
        // First Round
        nodes[start.id] = start
        allNodeIds.push(start.id)
        closedNodesId.push(start.id)
        var friends = getFriends(start)
        for (var i = 0; i < friends.length; i++) {
            console.log("Adding to base: ",friends[i].id)
            nodes[friends[i].id] = friends[i]
            allNodeIds.push(friends[i].id)
            openNodesId.push(friends[i].id)
        }
        orderByFFromNodes()
        console.log("Start Friends Ready\n")
        printMap()
        var found = false

        while (!found) {
            // Second Round
            it++
            var bestF = openNodesId.shift()
            console.log("it = "+it," bestF = ",bestF)

            console.log("Before allNodeIds = ",allNodeIds.toString())
            closedNodesId.push(bestF)
            var current = nodes[bestF]
            console.log("current = F",bestF.F)
            friends = getFriends(current)
            for (var ix = 0; ix < friends.length; ix++) {
                if (!(openNodesId.indexOf(friends[ix].id) >= 0) && !(closedNodesId.indexOf(friends[ix].id) >=0)) {
                    console.log("add friend to nodes = "+friends[ix].id)
                    nodes[friends[ix].id] = (friends[ix])
                    allNodeIds.push(friends[ix].id)
                }
            }
            console.log("After allNodeIds = ",allNodeIds.toString())

            // Remove closed nodes
            for (ix = 0; ix < friends.length; ix++) {
                if (closedNodesId.indexOf(friends[ix].id) >= 0) {
                    console.log("remove closed friends = "+friends[ix].id)
                    friends.splice(ix,1)
                }
            }

            // Add missing nodes to open
            for (ix = 0; ix < friends.length; ix++) {
                if (!(openNodesId.indexOf(friends[ix].id) >= 0)) {
                    if (friends[ix].id != end.id) {
                        console.log("add new open friends = "+friends[ix].id)
                        openNodesId.push(friends[ix].id)
                    } else {
                        console.log("Search and Found!")
                        end = friends[ix]
                        map[start.y][start.x] = "S"
                        map[end.y][end.x] = "X"
                        found = true
                    }
                }
            }
            if (!found) { orderByFFromNodes() }
        }
        printMap()
    }

    Component.onCompleted: {
        search()
    }

}