見出し画像

アレクサスキル サンプルコード 数当てゲーム100

What's 数当てゲーム100

「アレクサが思い浮かべた10~100の数字をヒントを頼りに当てるミニゲームです

工夫ポイント

ユーザーの回答した回数をカウントして、何回目で当てたかを教えてくれます

サンプルコード

200行ほどのコードです。
コードエディタにコピペした後、以下の値を変えた派生のスキルをつくってみてください。
let correctAnswer = Math.floor(Math.random() * 90 + 10) ;

/* *
 * This sample demonstrates handling intents from an Alexa skill using the Alexa Skills Kit SDK (v2).
 * Please visit https://alexa.design/cookbook for additional examples on implementing slots, dialog management,
 * session persistence, api calls, and more.
 数当てゲーム百を開いて
 * */
 
const Alexa = require('ask-sdk-core');

 //初期設定
 let CountAnswer = 1;
 let correctAnswer = Math.floor(Math.random() * 90 + 10) ;
 const soundCorrect ="<audio src='https://alexa-iizawa-acl.s3.ap-northeast-1.amazonaws.com/sound_effect/se-answer-correct.mp3' />";
 const soundWrong ="<audio src='https://alexa-iizawa-acl.s3.ap-northeast-1.amazonaws.com/sound_effect/se-answer-wrong.mp3' />";

const LaunchRequestHandler = {
    canHandle(handlerInput) {
        return Alexa.getRequestType(handlerInput.requestEnvelope) === 'LaunchRequest';
    },
    handle(handlerInput) {
        const speakOutput = ''+
        "<audio src='https://alexa-iizawa-acl.s3.ap-northeast-1.amazonaws.com/sound_effect/%E5%92%8C%E5%A4%AA%E9%BC%93%E3%81%A6%E3%82%99%E3%83%88%E3%82%99%E3%83%88%E3%82%99%E3%83%B3.mp3' />"
        + '一から百までの数を思い浮かべました。さて、いくつでしょうか。当ててみてください。'
        
        const reprompt ='一から百までの数を、答えてください。';
        
        return handlerInput.responseBuilder
            .speak(speakOutput)
            .reprompt(reprompt)
            .getResponse();
    }
};

const AnswerIntentHandler = {
    canHandle(handlerInput) {
        return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
            && Alexa.getIntentName(handlerInput.requestEnvelope) === 'AnswerIntent';
    },
    handle(handlerInput) {
        //get user's answer of number
        let receivedNumber = handlerInput.requestEnvelope.request.intent.slots.number.value;
        
        let speakOutput = '';
        
        if (receivedNumber == correctAnswer){
            speakOutput = soundCorrect + '<amazon:emotion name="excited" intensity="low">' +
            '正解。答えは' + correctAnswer + 'でした。' +
            CountAnswer + '回目で当てることができました。また、遊んでください。 </amazon:emotion>';
            return handlerInput.responseBuilder
            .speak(speakOutput)
            .getResponse();
        } 
        
        if (receivedNumber > correctAnswer){
            speakOutput = soundWrong + 
            '<amazon:emotion name="disappointed" intensity="low"> 残念。 </amazon:emotion>' +
            receivedNumber +
            'よりも、小さい数です。さて何でしょうか。'
        } 
        
        if (receivedNumber < correctAnswer){
            speakOutput = soundWrong + 
            '<amazon:emotion name="disappointed" intensity="low"> 残念。 </amazon:emotion>' +
            receivedNumber +
            'よりも、大きい数です。さて何でしょうか。'
        } 
        
        CountAnswer += 1;

        return handlerInput.responseBuilder
            .speak(speakOutput)
            .reprompt('一から百までの数を、答えてください。')
            .getResponse();
    }
};

const HelpIntentHandler = {
    canHandle(handlerInput) {
        return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
            && Alexa.getIntentName(handlerInput.requestEnvelope) === 'AMAZON.HelpIntent';
    },
    handle(handlerInput) {
        const speakOutput = '一から百までの数を思い浮かべました。さて、いくつでしょうか?当ててみてください。';

        return handlerInput.responseBuilder
            .speak(speakOutput)
            .reprompt(speakOutput)
            .getResponse();
    }
};

const CancelAndStopIntentHandler = {
    canHandle(handlerInput) {
        return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
            && (Alexa.getIntentName(handlerInput.requestEnvelope) === 'AMAZON.CancelIntent'
                || Alexa.getIntentName(handlerInput.requestEnvelope) === 'AMAZON.StopIntent');
    },
    handle(handlerInput) {
        const speakOutput = 'また、数当てゲームで遊んでください。';

        return handlerInput.responseBuilder
            .speak(speakOutput)
            .getResponse();
    }
};
/* *
 * FallbackIntent triggers when a customer says something that doesn’t map to any intents in your skill
 * It must also be defined in the language model (if the locale supports it)
 * This handler can be safely added but will be ingnored in locales that do not support it yet 
 * */
const FallbackIntentHandler = {
    canHandle(handlerInput) {
        return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
            && Alexa.getIntentName(handlerInput.requestEnvelope) === 'AMAZON.FallbackIntent';
    },
    handle(handlerInput) {
        const speakOutput = 'Sorry, I don\'t know about that. Please try again.';

        return handlerInput.responseBuilder
            .speak(speakOutput)
            .reprompt(speakOutput)
            .getResponse();
    }
};
/* *
 * SessionEndedRequest notifies that a session was ended. This handler will be triggered when a currently open 
 * session is closed for one of the following reasons: 1) The user says "exit" or "quit". 2) The user does not 
 * respond or says something that does not match an intent defined in your voice model. 3) An error occurs 
 * */
const SessionEndedRequestHandler = {
    canHandle(handlerInput) {
        return Alexa.getRequestType(handlerInput.requestEnvelope) === 'SessionEndedRequest';
    },
    handle(handlerInput) {
        console.log(`~~~~ Session ended: ${JSON.stringify(handlerInput.requestEnvelope)}`);
        // Any cleanup logic goes here.
        return handlerInput.responseBuilder.getResponse(); // notice we send an empty response
    }
};
/* *
 * The intent reflector is used for interaction model testing and debugging.
 * It will simply repeat the intent the user said. You can create custom handlers for your intents 
 * by defining them above, then also adding them to the request handler chain below 
 * */
const IntentReflectorHandler = {
    canHandle(handlerInput) {
        return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest';
    },
    handle(handlerInput) {
        const intentName = Alexa.getIntentName(handlerInput.requestEnvelope);
        const speakOutput = `You just triggered ${intentName}`;

        return handlerInput.responseBuilder
            .speak(speakOutput)
            //.reprompt('add a reprompt if you want to keep the session open for the user to respond')
            .getResponse();
    }
};
/**
 * Generic error handling to capture any syntax or routing errors. If you receive an error
 * stating the request handler chain is not found, you have not implemented a handler for
 * the intent being invoked or included it in the skill builder below 
 * */
const ErrorHandler = {
    canHandle() {
        return true;
    },
    handle(handlerInput, error) {
        const speakOutput = 'Sorry, I had trouble doing what you asked. Please try again.';
        console.log(`~~~~ Error handled: ${JSON.stringify(error)}`);

        return handlerInput.responseBuilder
            .speak(speakOutput)
            .reprompt(speakOutput)
            .getResponse();
    }
};

/**
 * This handler acts as the entry point for your skill, routing all request and response
 * payloads to the handlers above. Make sure any new handlers or interceptors you've
 * defined are included below. The order matters - they're processed top to bottom 
 * */
exports.handler = Alexa.SkillBuilders.custom()
    .addRequestHandlers(
        LaunchRequestHandler,
        AnswerIntentHandler,
        HelpIntentHandler,
        CancelAndStopIntentHandler,
        FallbackIntentHandler,
        SessionEndedRequestHandler,
        IntentReflectorHandler)
    .addErrorHandlers(
        ErrorHandler)
    .withCustomUserAgent('sample/hello-world/v1.2')
    .lambda();

AnswerIntent

ユーザーの回答した数字を取得するインテントです。
slotにはビルトインスロッAMAZON.NUMBERを使用しました。

この記事が参加している募集

つくってみた

この記事が気に入ったらサポートをしてみませんか?