我们需要对会话状态等数据进行配置以及各种参数赋值,例如:current_question,correct_answers,current_question_dat,session_data,questions_total,trade_num等,并根据参数值,判断next_action,来进一步的意图导向,当然这里的状态处理部分还可以嵌入题库知识库,用以动态随机读取(可自行扩展)。
```
/**
* 处理IQ测试状态和用户输入 - 扩展题库版本
* @param {Object} event - 输入项的集合
* @param {Object} context - 包含环境参数、应用ID等信息
* @return {Object} data - 返回的数据集合
*/
exports.main = async (event, context) => {
// 获取输入参数
const userInput = event.userInput || '';
const intent = event.intent || '';
// 从变量中获取会话状态,如果不存在则初始化
let sessionData = event.sessionData || {};
// 打印当前会话状态,用于调试
console.log('当前会话状态:', JSON.stringify(sessionData));
// 初始化或获取会话状态
let currentQuestion = sessionData.current_question !== undefined ? sessionData.current_question : 0;
let correctAnswers = sessionData.correct_answers !== undefined ? sessionData.correct_answers : 0;
let userAnswers = sessionData.user_answers || [];
let testCompleted = sessionData.test_completed || false;
let selectedQuestions = sessionData.selected_questions || [];
let selectedQuestionIds = sessionData.selected_question_ids || [];
// 生成新的交易编号,确保每次测试都不同
let tradeNum;
if (intent === '开始测试' || !sessionData.trade_num) {
tradeNum = 'IQ' + (Math.floor(Math.random() * 1000000) + 100000);
console.log(`生成新的交易编号: ${tradeNum}`);
} else {
tradeNum = sessionData.trade_num;
}
// IQ测试题目数据 - 扩展到30题
const allQuestions = [
{
id: 1,
question: '如果2+3=8,3+7=27,4+5=32,那么7+8=?',
options: ['A. 56', 'B. 60', 'C. 63', 'D. 98'],
answer: 'D',
explanation: '这是一个数学规律题。规律是:第一个数 × 第二个数 + 第一个数 × (第一个数-1)。所以7+8 = 7×8 + 7 × (7-1) = 56 + 42 = 98。'
},
{
id: 2,
question: '找出不属于该组的数字:1, 4, 9, 16, 25, 36, 49, 64, 81, 101',
options: ['A. 1', 'B. 36', 'C. 64', 'D. 101'],
answer: 'D',
explanation: '这组数字是完全平方数:1=1², 4=2², 9=3², 16=4², 25=5², 36=6², 49=7², 64=8², 81=9²。但101不是这个序列的下一个数,应该是100。'
},
{
id: 3,
question: '如果APPLE=50,BANANA=33,那么ORANGE=?',
options: ['A. 56', 'B. 60', 'C. 63', 'D. 69'],
answer: 'B',
explanation: '这是一个字母计算题。正确规律是:字母位置值之和:(15+18+1+14+7+5) = 60。'
},
{
id: 4,
question: '一个数列:3, 6, 18, 72, ?,下一个数是什么?',
options: ['A. 144', 'B. 288', 'C. 360', 'D. 432'],
answer: 'C',
explanation: '这个数列的规律是:×2, ×3, ×4, ×5...。所以下一个数是72×5=360。'
},
{
id: 5,
question: '如果所有的哺乳动物都有毛发,而鲸鱼是哺乳动物,那么:',
options: ['A. 鲸鱼有毛发', 'B. 鲸鱼没有毛发', 'C. 有些鲸鱼有毛发', 'D. 信息不足,无法判断'],
answer: 'A',
explanation: '这是一个逻辑推理题。根据前提"所有的哺乳动物都有毛发"和"鲸鱼是哺乳动物",可以推出"鲸鱼有毛发"。这是三段论的有效推理形式。'
},
{
id: 6,
question: '找出规律:1, 11, 21, 1211, 111221, ?',
options: ['A. 312211', 'B. 1221', 'C. 122221', 'D. 212211'],
answer: 'A',
explanation: '这是一个描述数列。每个数字描述前一个数字的组成:1(一个1)→11(两个1)→21(一个2一个1)→1211(一个1一个2两个1)→111221(三个1两个2一个1)→312211(一个3一个1两个2两个1)。'
},
{
id: 7,
question: '如果一个立方体的每条边长增加一倍,它的体积会增加多少倍?',
options: ['A. 2倍', 'B. 4倍', 'C. 7倍', 'D. 8倍'],
answer: 'C',
explanation: '立方体的体积公式是V=a³,其中a是边长。如果边长增加一倍变为2a,则新体积为V\'=(2a)³=8a³=8V。所以体积增加了7倍,变为了8倍。'
},
{
id: 8,
question: '一个家庭有两个孩子,已知其中一个是女孩,那么两个孩子都是女孩的概率是多少?',
options: ['A. 1/4', 'B. 1/3', 'C. 1/2', 'D. 2/3'],
answer: 'B',
explanation: '两个孩子的可能性有:(男,男)、(男,女)、(女,男)、(女,女),每种可能性概率相等为1/4。已知其中一个是女孩,排除(男,男),剩下(男,女)、(女,男)、(女,女)三种可能,概率分别为1/3。其中两个都是女孩的情况只有(女,女),概率为1/3。'
},
{
id: 9,
question: '如果6个人6分钟能刷6面墙,那么12个人12分钟能刷多少面墙?',
options: ['A. 12面', 'B. 24面', 'C. 36面', 'D. 48面'],
answer: 'B',
explanation: '设每个人每分钟能刷x面墙,则6个人6分钟能刷6面墙,即6×6×x=6,解得x=1/6。那么12个人12分钟能刷12×12×(1/6)=24面墙。'
},
{
id: 10,
question: '在一个标准的扑克牌中,抽出一张红桃的概率是多少?',
options: ['A. 1/4', 'B. 1/2', 'C. 1/13', 'D. 13/52'],
answer: 'A',
explanation: '标准扑克牌有4种花色(红桃、方块、黑桃、梅花),每种花色13张牌,共52张。抽出红桃的概率是13/52=1/4。'
},
{
id: 11,
question: '一列火车以每小时60公里的速度行驶,需要多少时间才能完全通过一个长度为500米的隧道?假设火车长度为500米。',
options: ['A. 30秒', 'B. 60秒', 'C. 90秒', 'D. 120秒'],
answer: 'B',
explanation: '火车要完全通过隧道,需要行驶的总距离是火车长度加隧道长度,即500+500=1000米。火车速度是60公里/小时=1000米/分钟=16.67米/秒。所以通过时间是1000÷16.67≈60秒。'
},
{
id: 12,
question: '如果所有的A都是B,所有的B都是C,那么:',
options: ['A. 所有的A都是C', 'B. 所有的C都是A', 'C. 没有A是C', 'D. 信息不足,无法判断'],
answer: 'A',
explanation: '这是一个三段论推理。如果所有的A都是B,所有的B都是C,那么根据三段论的传递性,可以推出所有的A都是C。'
},
{
id: 13,
question: '找出规律:2, 6, 12, 20, 30, ?',
options: ['A. 36', 'B. 40', 'C. 42', 'D. 56'],
answer: 'C',
explanation: '这个数列的规律是:每项比前一项增加的数依次为4, 6, 8, 10, 12...。所以下一项应该是30+12=42。'
},
{
id: 14,
question: '如果今天是星期二,那么100天后是星期几?',
options: ['A. 星期三', 'B. 星期四', 'C. 星期五', 'D. 星期六'],
answer: 'B',
explanation: '一周有7天,100÷7=14余2,所以100天后比今天多2天,星期二加2天是星期四。'
},
{
id: 15,
question: '一个正方形的面积是16平方厘米,它的对角线长度是多少厘米?',
options: ['A. 4', 'B. 4√2', 'C. 8', 'D. 8√2'],
answer: 'B',
explanation: '正方形面积是16平方厘米,所以边长是4厘米。根据勾股定理,对角线长度是4√2厘米。'
},
{
id: 16,
question: '计算:(3^4 - 2^5) ÷ 7',
options: ['A. 3', 'B. 4', 'C. 5', 'D. 7'],
answer: 'D',
explanation: '3^4 = 81, 2^5 = 32, (81 - 32) = 49, 49 ÷ 7 = 7。'
},
{
id: 17,
question: '一个数的平方是它的三倍,这个数是多少?',
options: ['A. 0', 'B. 1', 'C. 3', 'D. 0或3'],
answer: 'D',
explanation: '设这个数为x,则x² = 3x,整理得x² - 3x = 0,x(x - 3) = 0,所以x = 0或x = 3。当x = 0时,0² = 0 = 3×0,等式成立;当x = 3时,3² = 9 = 3×3,等式也成立。'
},
{
id: 18,
question: '如果 log₂(x) = 3,那么 x 等于多少?',
options: ['A. 6', 'B. 8', 'C. 9', 'D. 12'],
answer: 'B',
explanation: 'log₂(x) = 3 意味着 2³ = x,所以 x = 8。'
},
{
id: 19,
question: '一个圆的面积是36π,它的周长是多少?',
options: ['A. 6π', 'B. 12π', 'C. 18π', 'D. 24π'],
answer: 'B',
explanation: '圆的面积公式是A = πr²,所以36π = πr²,r² = 36,r = 6。圆的周长公式是C = 2πr,所以C = 2π×6 = 12π。'
},
{
id: 20,
question: '解方程:2x² - 5x - 3 = 0',
options: ['A. x = -1/2 或 x = 3', 'B. x = 1/2 或 x = 3', 'C. x = -1/2 或 x = -3', 'D. x = 1/2 或 x = -3'],
answer: 'A',
explanation: '使用求根公式:x = (-b ± √(b² - 4ac)) / (2a),其中a = 2, b = -5, c = -3。代入得:x = (5 ± √(25 + 24)) / 4 = (5 ± √49) / 4 = (5 ± 7) / 4。所以x = (5 + 7) / 4 = 3或x = (5 - 7) / 4 = -1/2。'
},
{
id: 21,
question: '如果 sin(θ) = 0.6,那么 cos(θ) 等于多少?',
options: ['A. 0.6', 'B. 0.8', 'C. 0.36', 'D. 0.64'],
answer: 'B',
explanation: '根据三角恒等式:sin²(θ) + cos²(θ) = 1,所以cos²(θ) = 1 - sin²(θ) = 1 - 0.6² = 1 - 0.36 = 0.64,cos(θ) = 0.8(因为通常我们考虑第一象限,cos(θ) > 0)。'
},
{
id: 22,
question: '一个等差数列的首项是3,公差是4,第10项是多少?',
options: ['A. 36', 'B. 39', 'C. 40', 'D. 43'],
answer: 'B',
explanation: '等差数列的通项公式是an = a1 + (n - 1)d,其中a1是首项,d是公差。代入a1 = 3, d = 4, n = 10,得a10 = 3 + (10 - 1)×4 = 3 + 36 = 39。'
},
{
id: 23,
question: '在一个袋子里有5个红球和3个蓝球,随机抽取2个球,抽到2个红球的概率是多少?',
options: ['A. 5/28', 'B. 10/28', 'C. 15/28', 'D. 20/28'],
answer: 'B',
explanation: '总共有C(8,2) = 28种不同的抽取方式。抽到2个红球的方式有C(5,2) = 10种。所以概率是10/28。'
},
{
id: 24,
question: '如果 f(x) = x² + 2x + 1,那么 f(3) 等于多少?',
options: ['A. 12', 'B. 14', 'C. 16', 'D. 18'],
answer: 'C',
explanation: 'f(3) = 3² + 2×3 + 1 = 9 + 6 + 1 = 16。'
},
{
id: 25,
question: '一个正方体的表面积是96平方厘米,它的体积是多少立方厘米?',
options: ['A. 16', 'B. 32', 'C. 64', 'D. 128'],
answer: 'C',
explanation: '正方体的表面积公式是S = 6a²,其中a是边长。所以96 = 6a²,a² = 16,a = 4。正方体的体积公式是V = a³,所以V = 4³ = 64。'
},
{
id: 26,
question: '如果所有的猫都有尾巴,而Fluffy有尾巴,那么:',
options: ['A. Fluffy一定是猫', 'B. Fluffy可能是猫', 'C. Fluffy不是猫', 'D. 信息不足,无法判断'],
answer: 'B',
explanation: '这是一个逻辑推理题。从"所有的猫都有尾巴"可以推出"如果是猫,那么有尾巴",但不能推出"如果有尾巴,那么是猫"(这是肯定后件谬误)。所以从"Fluffy有尾巴"不能确定Fluffy是猫,只能说Fluffy可能是猫。'
},
{
id: 27,
question: '以下哪个选项是演绎推理的例子?',
options: ['A. 我见过的所有乌鸦都是黑色的,所以所有乌鸦都是黑色的', 'B. 所有人都会死,苏格拉底是人,所以苏格拉底会死', 'C. 每次下雨时地面都会湿,地面是湿的,所以下雨了', 'D. 大多数鸟类会飞,企鹅是鸟类,所以企鹅会飞'],
answer: 'B',
explanation: '演绎推理是从一般到特殊的推理,如果前提为真,结论必然为真。A是归纳推理;B是有效的三段论演绎推理;C是肯定后件谬误;D是概率推理且结论错误。'
},
{
id: 28,
question: '如果"有些A是B"和"有些B是C"都为真,那么以下哪个陈述一定为真?',
options: ['A. 有些A是C', 'B. 所有A都是C', 'C. 没有A是C', 'D. 以上都不一定为真'],
answer: 'D',
explanation: '从"有些A是B"和"有些B是C",不能确定A和C之间的关系。可能有些A是C(如果这些A同时也是B和C),也可能没有A是C(如果是B的A和是C的B没有交集)。所以以上选项都不一定为真。'
},
{
id: 29,
question: '在一个岛上,居民要么总是说真话,要么总是说假话。一个居民说:"我有时说真话,有时说假话。"这个居民是:',
options: ['A. 总是说真话的人', 'B. 总是说假话的人', 'C. 有时说真话,有时说假话的人', 'D. 无法确定'],
answer: 'B',
explanation: '如果这个居民总是说真话,那么他的陈述"我有时说真话,有时说假话"应该为真,但这与"总是说真话"矛盾。如果这个居民总是说假话,那么他的陈述是假的,实际上他要么总是说真话,要么总是说假话,这与题设一致。所以他是总是说假话的人。'
},
{
id: 30,
question: '三个盒子,一个装苹果,一个装香蕉,一个装苹果和香蕉。盒子上的标签分别是"苹果"、"香蕉"和"苹果和香蕉",但所有标签都是错的。如果只允许从一个盒子中取出一个水果,最少需要看几个盒子才能确定所有盒子的内容?',
options: ['A. 1个', 'B. 2个', 'C. 3个', 'D. 无法确定'],
answer: 'A',
explanation: '因为所有标签都是错的,所以"苹果和香蕉"标签的盒子不可能装有苹果和香蕉,只能是单一水果。如果从这个盒子中取出一个水果,比如是苹果,那么这个盒子装的是苹果。标有"香蕉"的盒子不可能装香蕉,也不可能装苹果(因为装苹果的盒子已经确定),所以它装的是苹果和香蕉。标有"苹果"的盒子不可能装苹果,只能装香蕉。所以只需要看1个盒子就能确定所有盒子的内容。'
}
];
// 处理用户意图
let nextAction = 'default';
let currentQuestionData = null;
if (intent === '开始测试') {
// 重置测试状态
currentQuestion = 0;
correctAnswers = 0;
userAnswers = [];
testCompleted = false;
// 随机选择10道题目
selectedQuestions = [];
selectedQuestionIds = [];
// 创建一个包含0到29的数组(对应30道题的索引)
const indices = Array.from(Array(allQuestions.length).keys());
// 随机打乱数组
for (let i = indices.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[indices[i], indices[j]] = [indices[j], indices[i]];
}
// 选择前10个索引对应的题目
for (let i = 0; i < 10; i++) {
selectedQuestions.push(allQuestions[indices[i]]);
selectedQuestionIds.push(allQuestions[indices[i]].id);
}
nextAction = 'show_question';
currentQuestionData = selectedQuestions[0];
console.log('开始测试,随机选择了题目:', selectedQuestionIds);
}
else if (intent === '回答问题' && !testCompleted) {
// 从用户输入中提取选项(A/B/C/D)
let userAnswer = '';
if (userInput.includes('A') || userInput.includes('a')) {
userAnswer = 'A';
} else if (userInput.includes('B') || userInput.includes('b')) {
userAnswer = 'B';
} else if (userInput.includes('C') || userInput.includes('c')) {
userAnswer = 'C';
} else if (userInput.includes('D') || userInput.includes('d')) {
userAnswer = 'D';
}
// 更新用户答案数组
userAnswers.push(userAnswer);
// 检查答案是否正确
if (currentQuestion < selectedQuestions.length && userAnswer === selectedQuestions[currentQuestion].answer) {
correctAnswers += 1;
console.log(`答案正确! 当前正确数: ${correctAnswers}`);
} else {
console.log(`答案错误! 当前正确数: ${correctAnswers}`);
}
// 更新当前题目序号
currentQuestion += 1;
// 判断是否完成所有题目
if (currentQuestion >= selectedQuestions.length) {
testCompleted = true;
nextAction = 'test_completed';
console.log('测试完成');
} else {
nextAction = 'show_question';
currentQuestionData = selectedQuestions[currentQuestion];
console.log(`进入下一题: ${currentQuestion + 1}`);
}
}
else if (intent === '查看结果' && testCompleted) {
nextAction = 'show_result';
// 确保currentQuestionData不为null
currentQuestionData = {
question: '测试已完成',
options: []
};
}
else if (intent === '帮助说明') {
nextAction = 'show_help';
// 确保currentQuestionData不为null
currentQuestionData = {
question: '帮助信息',
options: []
};
}
else if (testCompleted) {
nextAction = 'show_result';
// 确保currentQuestionData不为null
currentQuestionData = {
question: '测试已完成',
options: []
};
}
else if (currentQuestion > 0 && !testCompleted) {
nextAction = 'show_question';
currentQuestionData = selectedQuestions[currentQuestion];
console.log(`继续当前题目: ${currentQuestion + 1}`);
}
else {
nextAction = 'default';
// 确保currentQuestionData不为null
currentQuestionData = {
question: '欢迎参加IQ测试',
options: []
};
}
// 更新会话数据
const updatedSessionData = {
current_question: currentQuestion,
correct_answers: correctAnswers,
user_answers: userAnswers,
test_completed: testCompleted,
trade_num: tradeNum,
selected_questions: selectedQuestions,
selected_question_ids: selectedQuestionIds,
all_questions: allQuestions // 保存所有题目,以便结果生成时使用
};
console.log('更新后状态:', JSON.stringify(updatedSessionData));
// 确保返回的数据不包含null值
return {
next_action: nextAction || 'default',
current_question: currentQuestion || 0,
correct_answers: correctAnswers || 0,
current_question_data: currentQuestionData || {
question: '欢迎参加IQ测试',
options: []
},
session_data: updatedSessionData || {},
questions_total: selectedQuestions.length || 10,
trade_num: tradeNum
};
};
```
1. 零代码组装复杂能力
2. 跨平台资源整合