LoginSignup
1
0

More than 1 year has passed since last update.

【IBM Watson Assistant】で素因数分解ゲームを作る

Last updated at Posted at 2021-08-13

チャットボットに簡単なゲーム機能を実装します。

IBM Watson Assistantは、APIを呼び出すことができます。
今回はこの機能を使って、IBM Cloud FunctionsからAPIを呼び出す形で実装します。

できあがるもの
無題.png

参考

IBM Watson AssistantでIBM Cloud Functionsを実行する方法については、
こちらの記事でとても丁寧に解説してくれているので、参考にしてください。
Watson AssistantからIBM Cloud Functionsを呼び出す

Skillデータ

GitHubにSkillデータを置いておきます。

1.Functionを作る

今回、IBM Cloud Functionで作るAPIは2つです。

1-1.合成数を生成するAPI
1-2.約数を受け取り、合成数を割った数を返すAPI

今回はPythonでそれぞれ作成します。

1-1.合成数を生成するAPI

InitializeCompositeNumber.py
import sys
import random

def main(dict):
    #約数の数
    divisor = 4
    #素数リスト
    Prime = [2,3,5,7,11,13,17]

    #合成数
    CompositeNumber = 1
    for i in range(divisor):
        CompositeNumber *= Prime[random.randint(0,len(Prime)-1)]

    return { 'CompositeNumber': CompositeNumber }

1-2.約数を受け取り、合成数を割った数を返すAPI

DivideCompositeNumber.py
import sys

def main(dict):
    """
    返り値
    CompositeNumber:CompositeNumber/=InputNumber 通常
    error:0 通常時
    error:1 終了時
    error:2 割り切れないとき(失敗)
    エラー時
    CompositeNumber:CompositeNumber そのまま返す
    error:3 入力が数字以外の時
    error:4 入力値が合成数よりも大きいとき
    error:5 入力値が素数でないとき
    """

    #素数かどうか判定する関数
    def isPrime(input):
        Prime = False

        if input == 1:
            Prime = False
            return Prime
        elif input == 2:
            Prime = True
            return Prime
        elif input%2 == 0:
            Prime = False
            return Prime
        else:
            i = 3
            while True:
                if input == i:
                    Prime = True
                    break
                elif input%i == 0:
                    break
                i+=2
            return Prime

    #エラー変数
    error = 0

    #合成数の読み込み
    CompositeNumber = dict['CompositeNumber']
    InputNumber = dict['InputNumber']

    #入力が数字以外の文字の時はエラー3を返す
    if InputNumber.isdigit() == False:
        error = 3
        return {'CompositeNumber': CompositeNumber, 'InputNumber': InputNumber, 'Error': error}

    #整数への変換
    CompositeNumber = int(CompositeNumber)
    InputNumber = int(InputNumber)

    #error:4 入力値が合成数よりも大きいとき
    if InputNumber > CompositeNumber:
        error = 4
        return {'CompositeNumber': CompositeNumber, 'InputNumber': InputNumber, 'Error': error}

    #error:5 入力値が素数でないとき
    if isPrime(InputNumber) == False:
        error = 5
        return {'CompositeNumber': CompositeNumber, 'InputNumber': InputNumber, 'Error': error}

    #割れるときは割った後の数を返す
    if CompositeNumber%InputNumber == 0:
        CompositeNumber /= InputNumber
        #error:1 終了時
        if isPrime(CompositeNumber) == True:
            error = 1
        return {'CompositeNumber': CompositeNumber, 'InputNumber': InputNumber, 'Error': error}
    #error:2 割り切れないとき(失敗)
    else:
        error = 2
        return {'CompositeNumber': CompositeNumber, 'InputNumber': InputNumber, 'Error': error}

    return {'CompositeNumber': CompositeNumber, 'InputNumber': InputNumber, 'Error': error}

image.png
Webアクションとして有効化に忘れずにチェックを付けておきましょう。

2.Dialogを作る

IBM Watson Assistantで作るDialogです。全貌です。
image.png

2-1.ようこそノード

Open JSON editorを開いてcontext変数を追加します。
image.png

welcome.js
"context": {
    "number": {
      "Error": "",
      "InputNumber": "",
      "CompositeNumber": ""
    },
    "private": {
      "my_credentials": {
        "user": "",
        "password": ""
      }
    }
  }

userとpasswordはこちらを参考にして書き換えてください。
Watson AssistantからIBM Cloud Functionsを呼び出す

2-2.request_CompositeNumberノード

前のノードで、ユーザ入力をスキップしているのでこのノードがそのまま実行されるように
If assistant recognizeをtrueにします。同様にOpen JSON editorを開いて書き換えます。
image.png

request_CompositeNumber.js
{
  "output": {},
  "actions": [
    {
      "name": "/<namespace>/InitializeCompositeNumber",
      "type": "server",
      "parameters": {},
      "credentials": "$private.my_credentials",
      "result_variable": "context.number"
    }
  ]
}

"namespace"は書き換えてください。

2-3.display_nodeノード

image.png
$number.CompositeNumberで変数にアクセスできます。

2-4.request_DivideCompositeNumberノード

request_DivideCompositeNumber.js
{
  "output": {},
  "actions": [
    {
      "name": "/<namespace>/DivideCompositeNumber",
      "type": "server",
      "parameters": {
        "InputNumber": "<? input.text ?>",
        "CompositeNumber": "$number.CompositeNumber"
      },
      "credentials": "$private.my_credentials",
      "result_variable": "context.number"
    }
  ]
}

"namespace"は書き換えてください。
<? input.text ?>とすると、入力されたテキストにアクセスできます。

2-5.$number.Errorノード

image.png
条件をそれぞれのErrorに対応させます。
"number.Error==0","number.Error==3"は、display_nodeへJump
それ以外は、ようこそノードへJumpさせます。

image.png

以上です。
IBM Cloud Functionを用いると、IBM Watson Assistantにゲームを組み込むことができます。
他にも色々応用が利くので、作ってみてください。

関連リンク

Watson Assistantを使ってゲームを作る

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0