前段时间无聊的时候写的扫雷程序。最近用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的二维数组,这里就用来以为的来代替, 代码显得很拖沓。2,根据生成的后台的数据,生成对应的界面对象。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); }
3,点击鼠标后递归查找周围的安全的区块。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; }
这样大部分的逻辑就在这里面实现了。4,判断是否程序完成。一个是点击到雷,另外一个是胜利。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); } } } } } }
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