日曜プログラマーのための「Clovaスキルつくり隊!」 第2回
普通の1日を特別な1日に!「世界が変わるおみくじ」
1日が楽しくなる「おみくじ」スキルをスマートスピーカー用につくってみよう
2019年05月08日 11時00分更新
乱数取得プログラムで「おみくじ」スキルを作ってみよう
子供にも人気のLINEのスマートスピーカー「Clova」シリーズ向けに、子供も喜びそうなスキルをつくろう!という日曜プログラマーなお父さんのための連載「Clovaスキルつくり隊!」。今回も、大人でも子供でも楽しめる、Clova向けスキルの作成に挑戦していきましょう。
今回挑戦するのは「おみくじ」スキル。テーマとしてはよくある占いのスキルですが、これも工夫次第でこれまでにない、面白いスキルがつくれます。
おみくじを引くだけで世界が変わる!?
第2回のテーマ「おみくじ」は、神社などで吉凶を占うためのくじ引きですが、要は占いの一種です。最高にラッキーな大吉から、最低の大凶まで、ランダムに選ばれるくじを引くことで運勢を占うわけですね。
運、不運を教えてくれるだけでは占いの真価は発揮されません。ツイているならどんないいことがあるのか、不運に見舞われそうならどう回避するべきか、それを示してこその占いです。
今回は、子供向けに、引くだけで世界が変わってしまう、というおみくじのスキルをつくってみることにしました。そんなことができるのかって? それはアイデア次第です。
今回つくる「世界が変わるおみくじ」は、どんなことが起こったら子供にとって吉報で、どんなことが起こったら凶報なのか、という視点から考える、ちょっと不思議なおみくじです。
作品ナンバー02
今日どんな不思議なことが起こるのかを占う『世界が変わるおみくじ』
というわけで、さっそく見て行きましょう。できあがったのがこちらのスキルです。
今回もスキルのアイコンには、「かわいいフリー素材いらすとや」さんのイラストを使わせていただきました。今回は、「おみくじ」のイラストと「ヒーロー」のイラストの2つを合成して利用させていただきました。
ソースコードはこちら(リスト1)。Node.js(サーバー側でJavaScriptを使う言語)で書かれています。
//Clova Extensions Kit SDKモジュールを読み込む
const clova = require('@line/clova-cek-sdk-nodejs');
// Node.js のフレームワークexpressを読み込む
const express = require('express');
//①おみくじ結果 fortune=結果、word=一言
const fortuneList = [
{
fortune:'大吉',
word:[
'今日はあなたのことを好きな子が1人増えます。',
'今日は道にとてつもないパワーを秘めた石が落ちています。見つけられるかな?',
'今日、会う友達の中に、将来海賊王になる人がいます。仲間になりましょう。',
'今日はあなたの親友が1日だけスーパーパワーを授かっています。',
'今日は世界のどこかで正義の味方が誕生します。'
]
},
{
fortune:'ちゅうきち',
word:[
'今日、会う友達の中に超能力を使える人がいます。',
'今日、この町のどこかにとんでもない財宝が埋められます。',
'今日の夕飯にはスーパーパワーを発動する物質が入っています。',
'今日は将来世界を救う技術が発見されます。',
'今日は学校の先生が全員地球防衛軍のメンバーです。応援しましょう。'
]
},
{
fortune:'小吉',
word:[
'今日、会う友達の中に将来億万長者になる人がいます。仲良くしておきましょう。',
'今日は太陽の光を浴びるとパワーが1.5倍になる日です。',
'今日、見かける猫の中に、人間の言葉がわかる猫がいます。',
'今日、先生に聞く話の中に、世界の秘密を解くカギがあります。',
'今日、会う友達の中に将来漫画家になる人がいます。似顔絵を描いてもらいましょう。'
]
},
{
fortune:'吉',
word:[
'今日、会う友達の中にプロゲーマーがいます。仲良くしておきましょう。',
'今日、会う友達の中に芸能界デビューする人がいます。仲良くしておきましょう。',
'今日、会う友達の中に自分そっくりのロボットに学校に行かせている人がいます。',
'今日、見かけるお年寄りの中に、かつて忍者だった人がいます。',
'今日、見かける車のなかに、ロボットに変形できるものがあります。'
]
},
{
fortune:'末きち',
word:[
'今日はUFOが飛んできます。発見できるかな?',
'今日、会う友達の中にあなたの永遠のライバルがいます。',
'今日は平和な1日です。',
'今日あなたは世界で3億5672番目にラッキーな人です。',
'今日の給食には足が速くなる物質が入っています。'
]
},
{
fortune:'凶',
word:[
'今日はお母さんが催眠術にかけられています。気をつけましょう。',
'今日は道で会う人の中に人狼がいます。気をつけましょう。',
'今日はこの町のどこかに異次元の扉が開きます。',
'今日は帰り道で透明人間が付いてきます。気をつけましょう。',
'今日は世界のどこかであくの組織が誕生します。'
]
},
{
fortune:'大凶',
word:[
'今日は周りの人がすべてゾンビです。気をつけましょう。',
'今日は周りの人がすべて宇宙人に入れ替わっています。気をつけましょう。',
'今日は学校の先生が全員、あくの組織の人です。気をつけましょう。',
'今日はお父さんに悪霊が憑いています。気をつけましょう。',
'今日は周りの人がすべてあくの改造人間です。気をつけましょう。'
]
}
];
//ClientクラスのconfigureSkillメソッドでSkillConfiguratorクラスのインスタンスを生成
const clovaSkillHandler = clova.Client
.configureSkill()
//スキル起動時の処理
.onLaunchRequest(responseHelper => {
responseHelper.setSpeechList([
{
lang: 'ja',
type: 'PlainText',
value: '世界が変わるおみくじを、起動しました。'
},
{
lang: 'ja',
type: 'PlainText',
value: '引いて、といってみてください。'
}
]);
})
//ユーザーからの発話が来たら反応する箇所
.onIntentRequest(async responseHelper => {
const intent = responseHelper.getIntentName();
switch (intent) {
//「引く」か「はい」の発話が来たら行う処理
case 'DrawIntent':
case 'Clova.YesIntent':
//②おみくじ結果をランダムで番号を取得する。
const fortuneRandom = Math.floor(Math.random() * Object.keys(fortuneList).length);
//③一言もランダムで番号を取得する。
const wordRandom = Math.floor(Math.random() * Object.keys(fortuneList[fortuneRandom]['word']).length);
responseHelper.setSpeechList([
{
lang: 'ja',
type: 'PlainText',
value: fortuneList[fortuneRandom]['fortune'] + 'です。' //④おみくじ結果を返す
},
{
lang: 'ja',
type: 'PlainText',
value: fortuneList[fortuneRandom]['word'][wordRandom] //⑤一言を返す
},
{
lang: 'ja',
type: 'PlainText',
value: 'もう一度、世界が変わるおみくじを、引きますか?'
}
]);
break;
//引かない
case 'NoDrawIntent':
//いいえ
case 'Clova.NoIntent':
//キャンセル
case 'Clova.CancelIntent':
//セッション終了
responseHelper.endSession();
responseHelper.setSimpleSpeech({
lang: 'ja',
type: 'PlainText',
value: '世界が変わるおみくじを、終了します。'
});
break;
//使い方を教えて
case 'Clova.GuideIntent':
default:
responseHelper.setSimpleSpeech({
lang: 'ja',
type: 'PlainText',
value: '引く、または引かない、といってみてください。'
});
break;
}
console.log('Intent:' + intent);
})
//終了時
.onSessionEndedRequest(responseHelper => {
})
.handle();
//ポート3000番で起動しリクエスト待受
const app = new express();
const port = process.env.PORT || 3000;
//applicationIdの検証、基本情報のExtension IDを入力
const clovaMiddleware = clova.Middleware({applicationId: 'YOUR_APPLICATION_ID'});
//ルートディレクトリ配下の本ディレクトリを指定
app.post('/PATH/TO/DEV', clovaMiddleware, clovaSkillHandler);
app.listen(port, () => console.log(`Server running on `));
どんな命令が実行されているかは、「//」で始まる行に書いてあるコメントを参照してください。
今回のアイデアの注目ポイントは、fortune:に設定されている吉凶に付随する、word:に設定されている文言です。今回は、1つの吉凶結果につき5つの文言を用意してあります。
例えば、「大吉」にある「今日は道にとてつもないパワーを秘めた石が落ちています。見つけられるかな?」という結果を聞いた子は、その石を探そうと道を観察しながら歩く1日になるかもしれません。「そんな石なんて本当はないよ!」と分かっている子でも、ごっこ遊びのひとつとして、そんな雰囲気の石を探す遊びができるかもしれません。
中吉の「今日の夕飯にはスーパーパワーを発動する物質が入っています。」というセリフを聞けば、夕飯の献立が少しだけ楽しみになったり、食べている最中も「この中に?」と食材に興味をもってくれるかもしれません。
このアイデアで注意したポイントは、自分に結果を反映させていないことです。友達や周囲の物を対象にすることで、自覚はないけど〇〇な世界、を想像しやすくしています。また、友達のうちの誰か、とか、この町のどこか、といった具体的でない対象を示すことで、そんなことは起きなかったけど、自分が発見できなかっただけかも……という空想の持続をうながしています。
もうひとつのポイントは、凶や大凶という悪い結果でも、その日を楽しく過ごせるようにする設定を用意してあげている点です。凶の「今日はお母さんが催眠術にかけられています。気をつけましょう。」というセリフを聞いて、いつもと同じように見えるけど、どこかが違うのかも?と想像しながらお母さんと接したり、大凶の「今日は周りの人がすべてゾンビです。気をつけましょう。」というセリフなら、周囲の人に注意を払いながら1日を送るというごっこ遊びをして過ごせます。
いつもの1日を、違った視点で見られるようになるおみくじ。それが、「世界が変わるおみくじ」なんです。
この連載の記事
-
第6回
デジタル
鳴った音の音階を当てる「絶対音感ゲーム」スキルをつくってみよう -
第5回
デジタル
読み手をClovaにやってもらう「江戸いろはかるた」スキルをつくってみよう -
第4回
デジタル
子供も一緒に楽しめるゲーム「椅子取りゲーム」スキルをスマートスピーカー用につくってみよう -
第3回
デジタル
パーティーゲームの定番「ビンゴ」スキルをスマートスピーカー用につくってみよう -
第1回
デジタル
むかしの時刻を返す、スマートスピーカー用スキルをつくってみよう - この連載の一覧へ