Power Virtual Agetns と Power Automate で神経衰弱ゲームを作る①

#はじめに

Teams版のPower Virtual AgetnsとPower Automateを利用して、神経衰弱ゲームを作ってみましたので、内容を説明します。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Power Platform 2022 release wave1 で Power Automate と Power Virtual Agetns がより便利で面白くなりそうで嬉しい！<br>嬉しさ余って、娘にも遊んで欲しくて神経衰弱を可愛くしてみました。<a href="https://twitter.com/hashtag/PowerApps?src=hash&amp;ref_src=twsrc%5Etfw">#PowerApps</a> <a href="https://twitter.com/hashtag/PowerAutomate?src=hash&amp;ref_src=twsrc%5Etfw">#PowerAutomate</a> <a href="https://twitter.com/hashtag/PowerVirtualAgents?src=hash&amp;ref_src=twsrc%5Etfw">#PowerVirtualAgents</a> <a href="https://t.co/a80RnwfaCa">pic.twitter.com/a80RnwfaCa</a></p>&mdash; Miyake Mito (@MiTo60448639) <a href="https://twitter.com/MiTo60448639/status/1486277992095485953?ref_src=twsrc%5Etfw">January 26, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#全体の仕組み

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/b4018d6b-4b33-5ca8-d8c6-babfeeaeb520.png)

① Power Virtual Agetns で「初期化トピック」を呼び出すためにトリガーフレーズを設定します。
② 「初期化トピック」から、「初期化フロー」を呼び出します。「初期化フロー」では、カードの初期配置を作成します。
③ 「初期化トピック」から、「トピックA」を呼び出します。
④ 「トピックA」で、1枚目と2枚目のカードを質問します。それぞれのカードの回答を受けるたびに「神経衰弱処理フロー」を呼び出し、カードをめくる処理を実行します。
⑤ 「トピックA」から、「トピックB」を呼び出します。
⑥ 「トピックB」でも④の「トピックA」と同様の処理を行い、「トピックA」を呼び出します。
⑦ ④~⑥を繰り返します。

#初期化処理

今回は、初期処理の部分を説明します。

##トピック「初期化処理」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/b1d3ac2c-cb16-3f9e-b39d-dcac160e2ce5.png)

トピックの全体図です。
最後に呼び出しているトピック「ループA」は次回作成していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/1bb6fb8c-832e-50c0-7640-a084be0e46e8.png)


##トピック「初期化処理」

呼び出すフロー「初期化処理」の全体図です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/b3f3b882-ac10-082a-d28d-71c11c183058.png)

###ランダム配列の作成

ランダム配列の作成は、[Hiroさんの「Power Automate で配列をシャッフルする方法」]
(https://mofumofupower.hatenablog.com/entry/2020/10/06/160200)を参照ください。すごいテクニックです。

range()関数で、1~54の数字の配列を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/5afe35d5-30fd-c738-b3e4-30986f5f8862.png)

```
range(1,54)
```

1~54のランダムな数字で、要素数が54000の配列を作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/4311b59b-b297-b502-7714-5214811ec845.png)

```
range(0, mul(length(outputs('1to54array')), 1000))
```

[MSのDocs](https://docs.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#outputs)にある通り、
rand()は、maxValue（第2引数）-1の数字まででランダムな値を作成するため注意してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/8ef17210-b483-b4a5-c054-77b4d9a77329.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/fefb301c-3aa5-5c96-859e-7d3e267a4eba.png)

```
int(string(rand(1,add(length(outputs('1to54array')),1))))
```

union()関数を利用し、作成したランダムな数字の配列と1~54の配列で重複を除くと、重複しないランダムな並び順の1からの54個の整数が取得できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/6757d6df-da15-d33e-a0f3-d6349e976bf1.png)

```
union(body('54000array'), range(1, length(outputs('1to54array'))))
```

ランダム配列をカンマ区切りで繋げます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/60c2be93-36e1-7a47-b4d4-58bf534c780a.png)

###場のカードの作成

ランダムな数字配列とは別に、場のカードを文字列で作成しておきます。
今後、絵が合って捲られたカードは、この文字列で保持していきます。
Teamsチャットでの改行は、LF（ラインフィード）二つで1行の改行となるため、ここでは改行コードが倍入っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/0480cd5c-4d31-a190-9d45-2a4d545b8362.png)

```

🔲 ❶ ❷ ❸ ❹ ❺ ❻ ❼ ❽ ❾

❶ 🔳 🔳 🔳 🔳 🔳 🔳 🔳 🔳 🔳

❷ 🔳 🔳 🔳 🔳 🔳 🔳 🔳 🔳 🔳

❸ 🔳 🔳 🔳 🔳 🔳 🔳 🔳 🔳 🔳

❹ 🔳 🔳 🔳 🔳 🔳 🔳 🔳 🔳 🔳

❺ 🔳 🔳 🔳 🔳 🔳 🔳 🔳 🔳 🔳

❻ 🔳 🔳 🔳 🔳 🔳 🔳 🔳 🔳 🔳
```

最後に、ランダム数字配列と
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/58508de0-dd4e-8552-37d4-20e0fdf46e57.png)

場のカード文字列をトピックに返します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/b5d4ba01-d31b-0a92-44da-342b9fade251.png)


#おわり

今回は、神経衰弱ゲームで各カードに割り当てるランダムな数字の配列と、場のカードの並びとなる文字列を作成しました。
次回はいよいよ、カードをめくったときの処理を記載する予定です。