8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Power Virtual Agetns と Power Automate で Wordle を作る②

Last updated at Posted at 2022-03-09

はじめに

Teams版のPower Virtual AgetnsとPower Automateを利用して、最近話題の Wordle を作ってみました。全2回の2回目です。

メイン処理の作成

全体象は下図になります。今回は、赤枠で囲ったメイン処理部分を記載します。

image.png

③トピック「ループ1」

利用者から回答を受け、フローで答え合わせした結果を表示するトピックを作成します。

image.png

③-1 トピック間の変数の受け渡し

トピックの先頭で、呼び出し元のトピックから値を受け取ります。
[質問する]を2つ用意し、[特定]に[ユーザーの応答全体]を選択します。
[応答に名前を付けて保存]で設定された変数を選び、[変数のプロパティ]で[他のトピックから値を受け取ります]にチェックを付けます。

[他のトピックから値を受け取ります]をONすると、チャットボット実行時には問い合わせとして動作しません。
トピックの引数の定義となります。

■ 「答え」の定義
image.png

■ 「回答履歴」の定義
image.png

③-2 回答の質問

回答を質問します。
[条件]アクションを追加し、"リセット"と入力された場合、前回作成したトピック「初期化」に戻り、ゲームをリセットします。

image.png

③-3 フロー「メイン処理」の呼び出し

ここで一旦、フローを保存し[アクションを呼び出す]でフローの作成を選択します。

④フロー「メイン処理」

ユーザーの入力した回答に対し、答え合わせをするフローを作成します。

image.png

④-1 引数の設定

image.png

引数に、

  • 「答え」:ゲームの答え
  • 「回答履歴」:今回のゲームで今までユーザーが入力した回答の履歴
  • 「回答」:入力された回答

を設定します。

「回答履歴」は、 " APPLE,POINT,CIGAR,MAJOR " のように、カンマ区切りの文字列として定義します

④-2 答えの配列を作成

[作成]アクションで、トリガーにある引数の「答え」を設定します。

image.png

さらに[選択]アクションで、「答え」の文字を、1文字ずつの配列に分解します。

image.png

range(0,length(outputs('答え')))

image.png

substring(outputs('答え'),item(),1)

「答え」が"HUMPH"であれば、以下の配列が返ります
image.png

④-3 回答履歴+回答の配列を作成

「回答履歴」に今回の回答を追加します。
上記で記載したように、「回答履歴」は過去の「回答」を順にカンマで区切った文字列として定義しています。

「回答履歴」が存在する場合はconcat()関数で文字連結をします。

image.png

if(empty(triggerBody()['text_1']),triggerBody()['text_2'],concat(triggerBody()['text_1'],',',triggerBody()['text_2']))

さらに、","(カンマ)を区切り文字として、split()関数で配列に変換します。

image.png

split(outputs('回答履歴+回答'),',')

④-4 色の設定

答え合わせの「結果」を表示する際の色を10進数で設定します。

念のため、各色の説明をします。

  • 緑:「答え」の中にあり、位置も正しいです
  • 黄:「答え」の中に含まれますが、位置は違います
  • 灰:「答え」に含まれません

image.png

image.png

④-5 回答履歴の答え合わせ処理

Wordle で、「回答」できるチャンスは6回です。
よって「回答履歴」の要素数は最大で6になります。

6個の「回答履歴」に対し、答え合わせ処理を実施します。

処理を単純化するため、「回答」の度に過去の履歴も答え合わせしています
また、このような繰り返し処理はApply to eachを利用すると処理が簡略化できますが、レスポンスを考慮し除外しています

image.png

1つ目の回答履歴の答え合わせ処理

1つ目の「回答履歴」の答え合わせでは、以下の処理を行います。

image.png

[選択]アクションで「回答履歴」の1番目の要素(添え字=0)に対し、

  1. 1文字ずつ分解し、「答え」の同じ位置の文字と比較 ⇒ 同値の場合は緑(当たり)で文字を出力
  2. 1.でHitしなかったら、contains()関数で「答え」に存在するかチェック ⇒ 存在する場合は黄(位置が異なる)で文字を出力
  3. 上記以外 ⇒ 灰(ハズレ)で文字を出力

image.png

range(0,length(outputs('回答履歴+回答_array')?[variables('intCount')]))

image.png

if(equals(substring(outputs('回答履歴+回答_array')?[variables('intCount')],item(),1),substring(outputs('答え'),item(),1)),outputs('背景色1'),if(contains(outputs('答え'),substring(outputs('回答履歴+回答_array')?[variables('intCount')],item(),1)),outputs('背景色2'),outputs('背景色3')))

上記で取得した色と、「回答履歴」の各文字を下記のHTMLに挿入します。

image.png


<span style="color: WHITE; background-color:rgb(@{body('答え合わせ_1')?[0]}); font-family:'游ゴシック体'; font-size: 25px;">&nbsp;@{substring(outputs('回答履歴+回答_array')?[variables('intCount')],0,1)}&nbsp;</span>
<span style="color: WHITE; background-color:rgb(@{body('答え合わせ_1')?[1]}); font-family:'游ゴシック体'; font-size: 25px;">&nbsp;@{substring(outputs('回答履歴+回答_array')?[variables('intCount')],1,1)}&nbsp;</span>
<span style="color: WHITE; background-color:rgb(@{body('答え合わせ_1')?[2]}); font-family:'游ゴシック体'; font-size: 25px;">&nbsp;@{substring(outputs('回答履歴+回答_array')?[variables('intCount')],2,1)}&nbsp;</span>
<span style="color: WHITE; background-color:rgb(@{body('答え合わせ_1')?[3]}); font-family:'游ゴシック体'; font-size: 25px;">&nbsp;@{substring(outputs('回答履歴+回答_array')?[variables('intCount')],3,1)}&nbsp;</span>
<span style="color: WHITE; background-color:rgb(@{body('答え合わせ_1')?[4]}); font-family:'游ゴシック体'; font-size: 25px;">&nbsp;@{substring(outputs('回答履歴+回答_array')?[variables('intCount')],4,1)}&nbsp;</span>

2つ目以降の回答履歴の答え合わせ処理

2回目以降の処理は、1回目の処理をベースに、条件を追加します。

image.png

該当する「回答履歴」が存在する時のみ、答え合わせ処理を実施します。

image.png

outputs('回答履歴+回答_array')?[variables('intCount')]

条件が合致する場合の処理は、上記の回答履歴1の処理をコピーしてください。

複数アクションをまとめてコピーする場合は、コピー対象を[スコープ]に格納すると一括で複製できます。
image.png

コピー後、HTMLの先頭に2行分の改行コードを追加し(=Teamsチャットでの1行分の改行)、色情報の挿入内容をコピーしたアクション名に変更してください。

image.png

同様に、回答履歴2の処理をコピーし、回答履歴3~6を作成します。

image.png

④-6 トピックへの戻り値設定

image.png

「結果」に、1から6の回答履歴の答え合わせ結果をconcat()関数で結合した文字列を設定します。

concat(outputs('結果_1'),outputs('結果_2'),outputs('結果_3'),outputs('結果_4'),outputs('結果_5'),outputs('結果_6'))

回答履歴には「④-3 回答履歴+回答の配列を作成」で作成した、回答履歴と回答を","で結合したものを設定します。

outputs('回答履歴+回答')

トピック「ループ1」に戻り、[アクションを呼び出す]で、作成したフローを呼び出します。

image.png

⑤トピック「ループ2」

トピック「ループ2」は、トピック「ループ1」を複製してください。

image.png

複製後、[状態]をオンにしてください。

image.png

また、トピック先頭にて、「答え」と「回答履歴」に対し「他のトピックから値を受け取ります」をONにしてください。

image.png

トピックのリダイレクト設定

前回作成した①トピック「初期化」の末尾に、③トピック「ループ1」へのリダイレクトを追加してください。

image.png

③トピック「ループ1」の末尾に、⑤トピック「ループ2」へのリダイレクトを追加してください。

image.png

⑤トピック「ループ2」の末尾に、③トピック「ループ1」へのリダイレクトを追加してください。

image.png

以上で完成です。

注意

Teamsの Power Virtual Agents ポータルで、作成したWordleゲームを実行すると、HTMLが解釈されず下図のように表示されてしまします。
image.png

ゲームをプレイする際は、チャットボットを[公開]し、Teamsチャットから実行してください。
image.png

まとめ

Power Virtual Agents と Power Automate を利用した Wordle の作り方を紹介しました。
Power Virtual Agents のチャットの構成や、Power Automate での配列操作を工夫することで、快適に遊べるゲームを作成することが可能です。

是非作って、Playしてみてください!

8
4
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
8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?