js游戏设计Day01-卡片随机分配、两两配对核心算法

具体思路

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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容