游戏概述 |
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); // //
项目预览地址
技术无国界,仅可预览查看,不可他用。
窗口预览效果不佳,为得到最佳体验,请点击预览,并打开调试模式
Comments | NOTHING