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我没找到实现的方法。用的滚轮代替的。
如果有兴趣改动他的朋友可以一起交流下。邮箱:neightelf203@163.com

环境:win7+qt5.3

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Python中给QML接口,需要使用PyQt5模块,PyQt5是一个Python Qt5 GUI编程工具包。它能够在Python下使用Qt5的全部功能。 以下是一个简单的示例,演示如何在Python中创建一个QML应用程序,并在QML中调用Python中的函数: ```python from PyQt5.QtCore import QUrl, QObject, pyqtSlot from PyQt5.QtGui import QGuiApplication from PyQt5.QtQml import QQmlApplicationEngine class Backend(QObject): @pyqtSlot(str) def greet(self, name): print('Hello, {}!'.format(name)) if __name__ == '__main__': app = QGuiApplication([]) engine = QQmlApplicationEngine() backend = Backend() engine.rootContext().setContextProperty("backend", backend) engine.load(QUrl('main.qml')) app.exec_() ``` 在这个示例中,我们创建了一个Backend类,其中包含一个greet()函数,这个函数接受一个字符串参数,并将其打印到控制台上。 然后,在主函数中,我们创建了一个QGuiApplication并实例化了一个QQmlApplicationEngine。我们还创建了一个Backend对象并将其设置为QML的上下文属性,这样就可以在QML中访问该对象。 最后,我们使用engine.load()方法加载了main.qml文件,并启动了应用程序。 接下来,我们需要编一个main.qml文件,调用Python中的函数: ```qml import QtQuick 2.0 Rectangle { width: 200 height: 100 Text { anchors.centerIn: parent text: "Click me" onClicked: backend.greet("World") } } ``` 在这个QML文件中,我们创建了一个Rectangle元素,并包含一个Text元素。当用户单击Text元素时,会调用backend.greet()函数,并将"World"作为参数传递给它。 这样,我们就在Python中创建了一个QML应用程序,并且可以在QML中调用Python函数了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值