qml 写的扫雷

    前段时间无聊的时候写的扫雷程序。最近用qml比较多,所以都是用qml实现,其实逻辑都是放在JS文件里面,不能算是qml了。

    思路:

    1,在新建游戏的时候就把整个界面的数据做成一个数组保存下来。按照从上到下、从左到右的顺序来放置这个数组。他的四周有几个雷,数组里面就存放数字几,为雷的时候放数字9。

    2,在鼠标操作的时候,通过轮训他的周围的8个位置的没雷的位置,然后递归下去。这样就可以出现扫雷时候 ,点一下出现一大片的时候。

    具体实现过程:

    1,新建一个用来保存数据的数组。我这里用来3个数组。

     var bord = new Array(480);//用来存放qml上面的界面上的对象。                           
 
  
     var bord_data = new Array(480);//后台数据的存放数组。     

     var bord_flag = new Array(100);//用来保存480生成随机的100个数,在一开始就确定雷的位置。
 用来生成雷的位置的函数,生成后并把它们排序,然后放入到 bord_data 中,并且的到每个boad_data的数据,实际上用二维数组更加的直观。没仔细研究过JS的二维数组,这里就用来以为的来代替, 代码显得很拖沓。  
 
  
function getFlagData() {
    for(var index = 0 ; index < 100 ; index++) {
        bord_flag[index] = -1;
    }

    for(var i = 0; i < 101; ) {
        var flag = Math.floor(Math.random()*480);

        var isInbord = 0;
        for(var j = 0; j < i +1; j++) {
            if(bord_flag[j] === flag){
                break;
            }
        }

        if(!isInbord) {
            bord_flag[i] = flag;
            i++;
        }
    }

    //排序
    var temp = new Array(100);
    temp = bord_flag.slice(0);
    for(var temp_index = 0; temp_index < 99; temp_index++) {
        for(var k = temp_index +1; k <100; k++) {
            if(temp[k] < temp [temp_index]) {
                var tempdata = temp [temp_index];
                temp[temp_index] = temp[k];
                temp[k] = tempdata;
            }
        }
    }
    bord_flag = temp.slice(0);
}
2,根据生成的后台的数据,生成对应的界面对象。
 
  
function startGame() {
    getbord_data();

    for(var row = 0; row < 16; row ++) {
        bord[row] = new Array(30);
        for(var column = 0; column < 30; column++) {

            bord[row][column] = null;
            var compnent = null;
            compnent = Qt.createComponent("Block.qml");

            var dynamicObject = compnent.createObject(gameCanvas);
            if(dynamicObject === null) {
                console.log("creat block failure!");
                return false;
            }

            if(compnent.status === Component.Ready) {
                dynamicObject.x = column * 20 + 2;
                dynamicObject.y = row * 20 + 2;
                dynamicObject.width = 20;
                dynamicObject.height = 20;
                bord[row][column] = dynamicObject;
                bord[row][column].bomb = bord_data[row *30 + column];
            } else {
                console.log("creat block failure!");
                return false;
            }
        }
    }

    return true;
}
3,点击鼠标后递归查找周围的安全的区块。
 
  
 
  
function findRoundSafe(column, row) {
    if(bord[row][column].type === 1 && bord[row][column].bomb === 0) {
        for(var i = column - 1; i< column + 2; i++) {
            for(var j = row - 1; j< row + 2; j++) {
                if(i< 0 || i > 29 || j < 0 || j > 15) continue;
                if(i === column && j === row ) continue;
                if(bord[j][i] && bord[j][i].type === -1) {
                    showBlock(i,j);
                    if(bord[j][i].bomb === 0) {
                        findRoundSafe(i, j);
                    }
                }
            }
        }
    }
}
4,判断是否程序完成。一个是点击到雷,另外一个是胜利。
 
  
function isComplete() {
    for(var row = 0; row < 16; row++) {
        for(var column = 0; column < 30; column++) {
            if(bord[row][column].type === -1)
                return false;
            if(bord[row][column].type === 2 && !bord[row][column].flag ) {
                return false;
            }
        }
    }

    return true;
}
这样大部分的逻辑就在这里面实现了。
不足的地方:1,界面那看、各个区块放在一起后难看。
            2,没有实现扫雷的各种难度,和界面的自适应。
            3,代码没有优化,各个函数的命名有点让人让人混乱。
            4, window下面使用的左右键同时点击来实现打开周围的地方的,qml我没找到实现的方法。用的滚轮代替的。
如果有兴趣改动他的朋友可以一起交流下。邮箱:[email protected]

环境:win7+qt5.3

下载代码链接:http://download.csdn.net/detail/lwei3600103/8084613

 
  
 
 

你可能感兴趣的:(QT)