具体思路
1、根据当前关卡的难度,确定行列
2、计算所需的图片的总数
3、选取随机图片
4、对素材和格子进行匹配
生成格子序列
/**
* 生成格子的序列,返回数组
* @param row
* @returns {any[]}
*/
function gridSequence(row){
var liarr = new Array();
for(let i=1;i<=row*row;i++){
liarr.push(i);
}
return liarr
}
图片数量计算
let total = row*row/2;
生成随机素材
/**
* 随机范围内不重复的值,用于随机的分配素材
* @param n
* @param m
* @param arr
* @returns {*} 返回图片的索引序列
*/
function randomNum(n,m,arr) {
let result = Math.round(Math.random()*(m-n))+n;
if(arr){
for(let i=0;i<arr.length;i++){
if(arr[i]==result){
return randomNum(n,m,arr);
}
}
}
return result;
}
计算图片需要匹配格子的数量
/**
* 每个图片需要分配到多少个格子
* @param total
* @param pageid
* @return {any[]|boolean}
*/
function average(total,pageid)
{
if(pageid>total){
return false;
}
let parr = new Array();
if(Math.floor(total/pageid) === total/pageid){ //整除
isfix = true;
psize = total/pageid;
}else{ //非整除
isfix = false;
psize = Math.ceil(total/pageid); //向上取整
}
if(isfix === true){
for(i=0;i<pageid;i++){
parr.push(psize);
}
}else{
y = 0;
for(i=0;i<pageid;i++){
psize = Math.floor(total/pageid);
y += psize;
parr.push(psize);
}
if(y<total){
last = total - y;
for(i=0;i<last;i++){
parr[i]++;
}
}
}
return parr;
}
对图片和随机的两个格子进行配对
/**
* 完成两个格子的配对,以及格子和图片id的配对
* @param liarr 格子的序列数组
* @param icons 图片的id 索引数组
* @return rowarr 返回数组索引,demo: 12,9,2 解释:第12格和第9格配对,素材id为2
*/
function pairing(grid,icons,averarr){
//配对格子
rowarr = new Array();
for(let i=0;i<icons.length;i++){
for(let y=0;y<averarr[i];y++){
let a = arrForOne(grid);
grid = delArr(grid,a);
let b = arrForOne(grid);
grid = delArr(grid,b);
let c = a+','+b+','+icons[i];
rowarr.push(c);
}
}
return rowarr
}
最终Demo
function test(row){
//根据当前关卡的难度确定行列
let grid = gridSequence(row);
//需要图片的总数
let total = row*row/2;
//选取随机图片
let icons = new Array();
for(i=0;i<row;i++){
rander = randomNum(1,20,icons);
icons.push(rander);
}
//图片的匹配个数
let average1 = average(total,row);
//素材图片个格子的匹配
var pair = pairing(grid,icons,average1);
console.log(pair);
}
test(4)
运行效果
test.PNG