我想创建一个从用户那里获取6个号码的彩票技能。 我目前正在通过样本和开发人员指南学习,我可以浏览指南并获得一项工作技能,这将需要一个输入,然后结束会话。但我相信我需要以某种方式创建一个对话框,这就是我被困住的地方。
设计明智,我喜欢这样的对话: Alexa:请提供第一个号码 用户:1 Alexa:现在第二个...... 用户:2 等等
但我认为如果它是这样的话会好的: Alexa:请拨打6个号码 用户:1,2,3,4,5,6。
这甚至可能吗?我是否必须创建一个名为" Numbers"然后输入数字,例如1-50或任何限制?
充其量,我现在可以让它要求一个号码,所以它真的是我坚持的对话互动。有没有人做过这样的事情?
感谢。
答案 0 :(得分:1)
对这两个问题都是肯定的。您可以将响应与6个不同的自定义插槽串在一起。 "用户:我的号码是{num1},{num2},{num3},{num4},{num5},{num6}"并使用技能测试开发人员完成所有这些操作。但是,如果用户没有恰当地说出他们的答案而且Alexa必须提出后续问题来获取每个号码,那将是一个相当糟糕的用户体验。您遇到的最后一个问题是,虽然自定义插槽可以定义为包含数字1-50,但alexa通常会识别与自定义插槽中提供的值类似的值,例如50-99之间的数字。然后由您来检查您收到的值是否在1到50之间。如果不是,您想要求用户在适当的范围内提供不同的数字。
结论:您希望在用户一次提供单个号码时进行单独的互动。
Alexa:"you will be prompted for 6 numbers between 1 and 50 please state them one at a time. Choose your first number."
User:"50"
Alexa:"Your First number is 50, Next number."...
您可以使用单一意图实现此目的。让我们说出意图GetNumberIntent
的名字。 GetNumberIntent将具有
{number}
pick {number}
choose {number}
其中{number}是自定义广告位类型,或者只是AMAZON.NUMBER。然后由您来检查该数字是否在1到50之间。
我使用SDK在Node.js中编程。您的实施可能会因您的语言选择而异。
我要做的是定义6个不同的状态处理程序。每个处理程序都应该有GetNumberIntent。如果插槽值是适当的,则返回GetNumberIntent,将值存储到会话数据和/或dynamodb,然后前进到下一个状态。如果槽值无效,则保持例如状态" NumberInputFiveStateHandlers"直到收到一个好的值,然后将状态更改为下一个" NumberInputSixStateHandlers"
var NumberInputFiveStateHandlers = Alexa.CreateStateHandler(states.NUMFIVEMODE, {
'NewSession': function () {
this.emit('NewSession'); // Uses the handler in newSessionHandlers
},
//Primary Intents
'GetNumberIntent': function () {
let message = ` `;
let reprompt = ` `;
let slotValue = this.event.request.intent.slots.number.value;
if(parseInt(slotValue) >= 1 && parseInt(slotValue) <= 50){
this.handler.state = states.NUMSIXMODE;
this.attributes['NUMBERFIVE'] = this.event.request.intent.slots.number.value;
message = ` Your fifth number is `+slotValue+`. please select your sixth value. `;
reprompt = ` please select your sixth value. `;
}else{
message = ` The number `+slotValue)+` is not in the desired range between 1 and 50. please select a valid fifth number. `;
reprompt = ` please select your fifth value. `;
}
this.emit(':ask',message,reprompt);
},
//Help Intents
"InformationIntent": function() {
console.log("INFORMATION");
var message = ` You've been asked to choose a lottery number between 1 and 50. Please say your selection.`;
this.emit(':ask', message, message);
},
"AMAZON.StopIntent": function() {
console.log("STOPINTENT");
this.emit(':tell', "Goodbye!");
},
"AMAZON.CancelIntent": function() {
console.log("CANCELINTENT");
this.emit(':tell', "Goodbye!");
},
'AMAZON.HelpIntent': function() {
var message = `You're playing lottery. you'll be picking six numbers to play the game. For help with your current situation say Information. otherwise you may exit the game by saying quit.`;
this.emit(':ask', message, message);
},
//Unhandled
'Unhandled': function() {
console.log("UNHANDLED");
var reprompt = ' That was not an appropriate response. Please say a number between 1 and 50.';
this.emit(':ask', reprompt, reprompt);
}
});
这是第五个请求的示例。你将有6个相同的状态,就像这个状态背靠背一样。最终,您将获得6个会话值。
this.attributes['NUMBERONE']
this.attributes['NUMBERTWO']
this.attributes['NUMBERTHREE']
this.attributes['NUMBERFOUR']
this.attributes['NUMBERFIVE']
this.attributes['NUMBERSIX']
然后,您可以将这些值用于游戏。
如果您还没有使用alexa-sdk,则必须记住注册状态处理程序并将模式添加到states
变量。
alexa.registerHandlers(newSessionHandlers, NumberInputOneStateHandlers, ... NumberInputSixStateHandlers);
var states = {
NUMONEMODE: '_NUMONEMODE',
...
...
NUMSIXMODE: '_NUMSIXMODE',
}
此答案并非旨在涵盖使用Alexas-SDK进行编码的基础知识。还有其他资源可以针对该主题提出更具体的问题。
或者,因为你的意图是相同的[GetNumberIntent],你可以使用一个StateHandler来将新的有效数字推送到数组上,直到数组达到所需的长度。这只需要Intent Handler中的更多逻辑,并且一旦数组的长度为6,就会有条件断开状态。 首先尝试上面的代码,因为它更容易看到不同的状态。
答案 1 :(得分:0)
我喜欢Caleb的回答。此外,如果您提供有关错误的反馈(例如输入不是数字),并尝试考虑用户的其他响应,例如“我不知道”或“给我一个”,它可以提供更好的用户体验例如“或”我能说什么“。