测评类游戏开发(一)记忆更新


游戏概述
1. 游戏正式关卡分为2个阶段,分布顺序为:引导关卡1 --- 正式关卡1(9试次)--- 引导关卡2--- 正式关卡2(9试次),合计18试次。
2. 游戏的主要玩法是记住屏幕中出现的3位数字及所在位置,在试次中会随机出现1位新数字(1~9)或问号,需要更新记忆最新的数字,在最后回合填写更新后的3位数字。
3. 在游戏第二阶段,数字将以加减法的方式呈现,新数字的结果以及相加减的数字都不能为原本方格里的数字,范围在3~7中的一个数字加减1~2。
4. 正式关卡的每个阶段里,需要包含5次、6次、7次提示,并以随机混合的方式各出现3次。问号与数字在回合内以随机混合的方式出现,每回合出现的次数如下:
4.1 5次提示:包含3次新数字和2次问号。
4.2 6次提示:包含3次新数字和3次问号。
4.3 7次提示:包含4次新数字和3次问号。

游戏流程图

生成游戏数据部分代码

/第一阶段的数据集合
let phase1Data = [1, 2, 3, 4, 5, 6, 7, 8, 9, '?'];
//第二阶段的数据集合 3~7  +/-  1~2  合计20种数据

let phase2Data = {
    1:['3-2'],
    2:['3-1','4-2'],
    3:['4-1','5-2'],
    4:['5-1','6-2','3+1'],
    5:['6-1','7-2','4+1','3+2'],
    6:['7-1','5+1','4+2'],
    7:['6+1','5+2'],
    8:['7+1','6+2'],
    9:['7+2'],
    "?":['?']
}

/**
 *
 * @param phase 阶段,氛围1和2
 * @param countPerTurn 每一局包含多少回合,如果不传则随机5~7
 * @returns {{initData: *[], data: Array}}
 */
function fillTurnData(phase, countPerTurn) {

    /**
     * 初始化最初的不重复的三个值
     * @returns {Array}
     */
    let defaultData = [1, 2, 3, 4, 5, 6, 7, 8, 9];//初始用的9个数字
    function initData() {
        let result = [];
        for (let i = 0; i < 3; i++) {
            result.push(defaultData.splice(Math.floor(Math.random() * defaultData.length), 1)[0]);

        }
        return result;
    }

    /**
     * 获取一个与上一次不同的位置
     * @param oldPosition
     * @returns {number}
     */
    function getPosition(oldPosition) {
        //取值0-2
        //生成一个新的位置
        let newPosition = Math.floor(Math.random() * 3);
        //如果新位置与旧位置不同
        while (newPosition == oldPosition) {
            //重新生成新位置
            newPosition = Math.floor(Math.random() * 3);
        }
        return newPosition;
    }

    /**
     * 第一阶段获取与上一次不同的更新内容
     * @param oldNumber
     */
    function getPhase1Item(oldNumber) {


        //位置0~9,从phase1Data中获取,同时需要根据
        let dataType = Math.floor(Math.random());
        //此时只有0,1两种情况,概率都是50%;
        let resultChar = "";
        if(dataType == 0){
            //是数字
            groupData.num--;
            resultChar = defaultData.splice(Math.floor(Math.random()*defaultData.length),1)[0]
        }else{
            //是问号
            groupData.notNum--;
            resultChar = "?";
        }

        return resultChar;

    }


    /**
     * 第二阶段获取与上一次不同的更新内容
     * @param oldNumber
     * @returns {{expression, value}|*}
     */
    function getPhase2Item(oldNumber) {


        function getExpresson(targetNum){
            let exprCollection = phase2Data[targetNum];
            if(exprCollection.length == 1){
                return exprCollection[0];
            }else{
                let tmpExpr = exprCollection[Math.floor(Math.random()* exprCollection.length)]
                while(tmpExpr.indexOf(prevNumber) > -1){
                    tmpExpr = exprCollection[Math.floor(Math.random()* exprCollection.length)]
                }
                return tmpExpr
            }
        }

        //位置0~9,从phase1Data中获取,同时需要根据
        let dataType = Math.round(Math.random());
        //此时只有0,1两种情况,概率都是50%;
        let resultData = {};
        //是数字的情况
        if(dataType == 0){

            //是数字
            if(groupData.num > 0){
                groupData.num--;
                resultData.value = defaultData.splice(Math.floor(Math.random()*defaultData.length),1)[0];
                resultData.expression = getExpresson(resultData.value);
            }else{
                groupData.notNum--;
                resultData.expression = "?"
                resultData.value = "?";
            }
        }

        if(dataType == 1 ){
            //是问号
            if(groupData.notNum > 0){
                groupData.notNum--;
                resultData.expression = "?"
                resultData.value = "?";
            }else{
                groupData.num--;
                resultData.value = defaultData.splice(Math.floor(Math.random()*defaultData.length),1)[0];
                resultData.expression = getExpresson(resultData.value);
            }
        }

        return resultData;

    }


    //上一轮的位置,取值范围0~2
    let prevPosition = -1
    //上一轮的变更数,从1~9
    let prevNumber = -1

    //每一轮中数字和问号的次数记录
    let groupData = {
        num: 3,//用数字
        notNum: 2//用问号
    }

    //1.生成默认的三个数字
    let tempInitData = initData();
    //这时候defaultData中还剩6个数字
    //初始化回合数据的数据结构
    let turnData = {
        initData: tempInitData.concat(),
        data: []
    }

    //每一轮的变换次数 随机5~7
    //2.确认当前替换内容的次数
    countPerTurn = countPerTurn ? countPerTurn : 5 + Math.floor(Math.random() * 3);
    //3.生成数字与问号的对应次数
    switch (countPerTurn) {
        case 5:
            groupData.num = 3;
            groupData.notNum = 2;
            break;
        case 6:
            groupData.num = 3;
            groupData.notNum = 3;
            break;
        case 7:
            groupData.num = 4;
            groupData.notNum = 3;
            break;
    }

    for (var i = 0; i < countPerTurn; i++) {
        //根据上一次的位置获取本次需要更新数据的位置
        let currentPosition = getPosition(prevPosition);
        //根据上一次的内容获取本次更新的内容
        let currentItem = null;
        if (phase == 1) {
            //第一阶段的处理
            currentItem = getPhase1Item(prevNumber);
            if (currentItem != "?") {
                tempInitData[currentPosition] = currentItem
            } else {
                //是问号什么都不用干
            }
        } else if (phase == 2) {
            //第二阶段的处理
            currentItem = getPhase2Item(prevNumber);
            if (currentItem.value != "?") {
                tempInitData[currentPosition] = currentItem.value;
                prevNumber = currentItem.value;
            } else {
                //表示上次数字为对应位置的数字
                prevNumber = tempInitData[currentPosition];
            }
        }

        //记录本次所需的数据
        turnData.data.push(
            {
                position: currentPosition,
                item: currentItem
            }
        );
        //一次数据处理完毕,更改上次的更改位置
        prevPosition = currentPosition;
    }
    return turnData
}
//
////下面是测试生成的数据
//var p1Data = [];
//for (var i = 0; i < 20; i++) {
//  //生成一回合的数据
//  p1Data.push(fillTurnData(1), 6);
//}
//console.log("------这是第一阶段的数据------");
//console.log(p1Data);
//
//

项目预览地址

技术无国界,仅可预览查看,不可他用。

窗口预览效果不佳,为得到最佳体验,请点击预览,并打开调试模式

声明:yopaopao|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 测评类游戏开发(一)记忆更新


正如我心中爱你美丽 又怎能嘴上装四大皆空