알렉사에서 주사위를 던지기

16290 단어 달콤한알렉사

처음 알렉사 스킬



마침내 Amazon echo의 초대가 왔기 때문에 조속히 「Alexa 스킬을 만들어 보자」라고 생각했다. 주사위를 흔드는 기술은 쉽습니다. 어떨까요? …

"Alexa, 주사위 흔들어""네, 1이 나왔습니다!"
「Alexa, 주사위 2개 흔들어」 「네, 10이 나왔습니다!」

어? ! Echo, 할 수 있는 아이…

「Alexa, 주사위 3개 체고」 「미안해…

좋아, 주사위 몇 개라도 던져 주면!

대화 모델 만들기




첫 번째 교환에서 주사위의 개수가 지정되면 그 이후에는 주사위의 개수를 지정하지 않아도 되도록 세션을 유지해 보자.

발화



사용자는 주사위의 수를 지정하고 주사위를 던질 뿐이므로 모든 발화는 CastDiceIntent에 매핑됩니다.
CastDiceIntent さいころ振って
CastDiceIntent {Number} 個振って
CastDiceIntent 振って
CastDiceIntent さいころ投げて
CastDiceIntent {Number} 個投げて
CastDiceIntent 投げて

Intent Schema



CastDiceIntent에는 주사위의 개수를 나타내는 Number 슬롯을 설정한다.
{
  "intents": [
    {
      "slots": [
        {
          "name": "Number",
          "type": "AMAZON.NUMBER"
        }
      ],
      "intent": "CastDiceIntent"
    },
    {
      "intent": "AMAZON.HelpIntent"
    },
    {
      "intent": "AMAZON.StopIntent"
    },
    {
      "intent": "AMAZON.CancelIntent"
    }
  ]
}

람다



CastDiceIntent 중에서는 주사위의 개수를 나타내는 Slot을 참조한다. 둘 이상의 주사위가 지정되면 두 번째 투표 이후에는 다시 주사위의 수를 지정할 필요가 없도록 세션 속성을 사용하여 세션을 유지합니다.
        var number = this.event.request.intent.slots.Number.value; // サイコロの個数
        if (!number) {
            number = 1; // slotに値がなければ1個
        }
        this.attributes['number'] = number;

둘 이상의 주사위가 지정되면 상태를 REPEATMODE로 전환하고 주사위 던지기를 반복합니다.
주사위가 하나라면 세션을 유지할 필요가 없으므로 응답을 반환하여 세션을 종료합니다. 쓸데없이 주사위를 많이 지정했을 때도 세션을 종료한다.
        if (number == 1 || number > 10) {
            this.emit(':tell', message); // レスポンスの生成
        } else {
            this.handler.state = states.REPEATMODE;

Lambda의 전체 코드는 다음과 같습니다.

index.js
"use strict";
const Alexa = require('alexa-sdk');

const states = {
    REPEATMODE: '_REPEAT'
};

// Lambda関数のメイン処理
exports.handler = function(event, context, callback) {
    var alexa = Alexa.handler(event, context); // Alexa SDKのインスタンス生成
    //alexa.appId = process.env.APP_ID;
    alexa.registerHandlers(handlers, stateHandlers); // ハンドラの登録
    alexa.execute();                  // インスタンスの実行
};

var handlers = {
    // インテントに紐付かないリクエスト
    'LaunchRequest': function () {
    this.emit('AMAZON.HelpIntent'); // AMAZON.HelpIntentの呼び出し
    },

    // ヘルプインテント
    'AMAZON.HelpIntent': function () {
        this.emit(':tell', 'サイコロを振ります' +
            'たとえば、サイコロ振ってと言って下さい');
    },

    // さいころを投げるインテント
    'CastDiceIntent': function () {
        var number = this.event.request.intent.slots.Number.value; // サイコロの個数
        if (!number) {
            number = 1; // slotに値がなければ1個
        }
        this.attributes['number'] = number;

        var message;
        if (number > 10) {
            message = 'そんなにたくさんサイコロ持てないですよ';
        } else {
            message = rollDice(number);
        }

        if (number == 1 || number > 10) {
            this.emit(':tell', message); // レスポンスの生成
        } else {
            this.handler.state = states.REPEATMODE;
            this.emit(':ask', message); // レスポンスの生成
        }
        console.log(message);
    }
};

var stateHandlers = Alexa.CreateStateHandler(states.REPEATMODE, {
  'CastDiceIntent': function() {
    var number = this.attributes['number']; // セッションアトリビュート参照
    var message = rollDice(number);
    this.emit(':ask', message);
    console.log(message);
  },
  'Unhandled': function() {
    this.handler.state = '';
    this.attributes['STATE'] = '';
    var message = '終了します';
    this.emit(':tell', message);
    console.log(message);
  }
});

function rollDice(number) {
    var message = '目は';
    for (var i = 0; i < number; i++) {
        var dice = Math.floor(Math.random()*6) + 1;
        if (i > 0) {
            message = message + '';
        }
        message = message + dice;
    }
    message = message + 'です';
    return message;
}

주사위 던졌다



이제 원하는 수만큼 주사위를 던질 수 있습니다! Alexa 표준 기능의 주사위와 달리 조로 눈인지 알 수 있어요.

좋은 웹페이지 즐겨찾기