Slide 1

Slide 1 text

Power Virtual Agents で Wordle を作る JPPGB #2

Slide 2

Slide 2 text

今日の目標 Power Virtual Agents for Teams で ゲームを作る方法を 説明します

Slide 3

Slide 3 text

Miyake Mito 気ままに勉強会 https://kimamani.connpass.com/ @MiTo60448639 https://qiita.com/MiyakeMito 株式会社アイシーソフト Technical Manager www.icsoft.jp https://speakerdeck.com/ miyakemito

Slide 4

Slide 4 text

Power Automateと Power Virtual Agents でゲームを作りました ⚫ オセロ

Slide 5

Slide 5 text

⚫ 神経衰弱 ⚫ どうぶつ将棋

Slide 6

Slide 6 text

本日は Wordleについて 解説します ⚫ 神経衰弱

Slide 7

Slide 7 text

免責事項 当スライドは、 2022年8月現在のバージョンでの情報です 今後のアップデート等により、 仕様変更する可能性があります また、私の見解による内容が含まれます 間違いなどありましたらご指摘ください

Slide 8

Slide 8 text

Wordle とは

Slide 9

Slide 9 text

Wordleとは ◼ 5文字の言葉当てゲーム ◼ 場所が当たっていれば [緑色] ◼ 場所が異なるが、どこかに当てはまる 場合は [黄色] で表示 ◼ チャレンジは6回まで

Slide 10

Slide 10 text

つまりどういうことだってばよ? A B C D E A L B U M 文字と位置が 合ってるから [緑色] 文字のみ 合ってるから [黄色] 答えに存在しな い文字は [グレー] • 隠された 5文字の単語を 当てるゲーム • Hit (位置と文字)は 色でわかる 単純だけど おもしろい [答え] [回答]

Slide 11

Slide 11 text

ゲームはおもしろくないとね! でも、Wordle は1日に一回しかチャレンジできない もっとやりたい!練習したい! OK!マカセロ!

Slide 12

Slide 12 text

構成

Slide 13

Slide 13 text

全体構成 ①Initial 処理 ③Main 処理1 ⑤Main 処理2 Wordleの過去問を リスト化 ②Initial 処理 A B C D E Wordleやりたい A L B U M A L B A M ④,⑥Main 処理 A B C D E A L B U M ランダムに 1つ選択し 「答え」を決定 [答えリスト] A B C D E A D O B E A D O B E 「回答」と「答え]を比較 A D O B E トリガーフレーズ 「回答」と「答え]を比較 最大6回実行 最大6回実行

Slide 14

Slide 14 text

やくそく事 ゲーム中のユーザーの応答は「回答」と記載するよ とかだよ ゲームごとの正解を[答え]と記載するよ だよ A L B U M A D O B E A B C D E

Slide 15

Slide 15 text

構成 ■ 3つのトピック用意 ■ Initial(初期化)処理 ➢ 「答えリスト」から今回の答えをランダムで選択 ■ Main(主)処理1と、Main 処理2 ➢ Main処理1⇒ Main処理2⇒ Main処理1⇒ Main処理2… でセルフターン制の処理を構築 ➢ ユーザーからの「回答」と、「答え」を比較し結果を返答

Slide 16

Slide 16 text

ストレスフリー 入力してから、結果を待つまでの待ち時間はストレスだよ Power Virtual Agents の高速化は難しいよ。 だから、Power Automate フローの高速化するんだよ!

Slide 17

Slide 17 text

処理の高速化 Apply to each ちょっと遅い問題 Apply to eachの処理実行速度は 遅いです。 これを許容しなくてはならない局 面はありますが、回避できるシー ンもあります

Slide 18

Slide 18 text

初期処理

Slide 19

Slide 19 text

全体構成 ①Initial 処理 ③Main 処理1 ⑤Main 処理2 Wordleの過去問を リスト化 ②Initial 処理 A B C D E Wordleやりたい A L B U M A L B A M ④,⑥Main 処理 A B C D E A L B U M ランダムに 1つ選択し 「答え」を決定 [答えリスト] A B C D E A D O B E A D O B E 「回答」と「答え]を比較 A D O B E トリガーフレーズ 「回答」と「答え]を比較 最大6回実行 最大6回実行

Slide 20

Slide 20 text

Initial 処理 ◼ Power Virtual Agents 側 ① トリガーフレーズを受け取り処理開始 ◼ Power Automate 側 ① 「答えリスト」から、今回の「答え」をランダムで選択 ② 変数の初期化 ➢ 回答履歴 ⁃ ユーザーの6回までの「回答」を履歴として配列で保持

Slide 21

Slide 21 text

配列からランダムに要素を抽出 [配列]?[添え字] ➢ 配列の要素を添え字で指定可能 rand() ➢ 引数1から (引数2-1) の範囲でランダムな整数 を返す ➢ 0から (配列の要素数-1) のランダム添え字 POINT [ "APPLE", "POINT", "CIGAR", "REBUT", "SISSY", "HUMPH" ] 答えリスト outputs('target_text')?[rand(0,length(outputs('target_text')))]

Slide 22

Slide 22 text

[回答]履歴 はぁ、またハズレ。 そういえば、今までの回答の履歴ってどうしてるの? だから、Power Virtual Agents では、"ALUBM","ADOBE" のように、 カンマ区切りの文字列で保持してるよ。 Power Automate 側で、Split(回答履歴, ',') 関数で、 配列に変換して処理しているよ Power Virtual Agents では配列型の変数が定義できないよ

Slide 23

Slide 23 text

主処理

Slide 24

Slide 24 text

全体構成 ①Initial 処理 ③Main 処理1 ⑤Main 処理2 Wordleの過去問を リスト化 ②Initial 処理 A B C D E Wordleやりたい A L B U M A L B A M ④,⑥Main 処理 A B C D E A L B U M ランダムに 1つ選択し 「答え」を決定 [答えリスト] A B C D E A D O B E A D O B E 「回答」と「答え]を比較 A D O B E トリガーフレーズ 「回答」と「答え]を比較 最大6回実行 最大6回実行

Slide 25

Slide 25 text

Power Virtual Agents 側 ① ユーザーに「回答」を質問する ② Power Autoamte フローを呼び出し、 「回答」と「答え」を比較 ③ 正解の場合、次のゲームを呼び出す ④ 不正解の場合、次の入力(ターン)を 呼び出す 回答を質問 フロー呼出 初期処理 Main2 処理呼出 正解 不正解 答え合わせするよ!

Slide 26

Slide 26 text

1回目「回答」の答え合わせ Power Automate 側 ① 「答え」を1文字ずつの配列に分解 ② 「回答」履歴+今回の「回答」を、配 列に変換 ③ 1回目の「回答」と「答え」を比較し、 表示設定 : ④ 6回目の・・・ ⑤ 「回答」と「答え」が一致する場合、 正解フラグをONにする 「答え」を分解 配列は受け渡し できないよ! 2回目「回答」の答え合わせ 6回目「回答」の答え合わせ 正解の判定 : 配列は受け渡し できないよ!

Slide 27

Slide 27 text

答え合わせ結果は保持しない どうして、[回答]履歴の答え合わせ結果を保持しないの? 毎ターン事に、すべての[回答]履歴を答え合わせを、いちいちするの? ゲームは6ターンまでなので、答え合わせ処理は最大で21回 答え合わせ結果を保持した複雑な構造の変数を次ターンへ引き継ぐよりも 毎回答え合わせする方が、処理が簡単だよね (Power Automate と配列の引き渡しがきないしね)

Slide 28

Slide 28 text

文字列を1文字ずつの配列に分割 substring(outputs('target_text'),item(),1) range(0,length(outputs('target_text'))) ABCDE [ "A", "B", "C", "D", "E" ] Range() ➢ 引数1 から始まり 引数2 の範囲で整数の配列を返す substring() ➢ 引数1 から、引数2 の位置から始まる 引数3 の長さの文 字を返す [ 0, 1, 2, 3, 4 ]

Slide 29

Slide 29 text

選択 Action ➢ [開始] に指定した配列内のオブジェクトの形状を変換する 配列内の要素の数は変えられないよ [ { "make": "Abarth", "model": "595 Competizione", "hp": 180, "cc": 1400 }, { "make": "Alfa Romeo", "model": "Giulia", "hp": 320, "cc": 2000 } ] [ { "Abarth" : "595 Competizione" }, { "Alfa Romeo" : "Giulia" } ]

Slide 30

Slide 30 text

選択 Action ■ 配列からApply to eachを使わずに複数の要素を取り出す ➢ [選択](Select) item()?[‘切り身‘] item()?[‘骨尾頭付き‘] concat(item()?[‘切り身‘], ‘シャリ‘)

Slide 31

Slide 31 text

選択 Action ➢ マップ がJSONフォーマットであれば、任意のOutputの形 式で出力可能。(ネストした配列も) ➢ 関数を挿入可能 関数との組み合わせで、 できる事が無限大!!

Slide 32

Slide 32 text

答え合わせ処理 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'))) range(0,length(outputs('回答'))) [ "A", "B", "C", "D", "E" ] [ "A", "D", "O", "B", "E" ] 答え 回答 A L B A M A D O B E 回答履歴 equals contains 答えは色情報として保持するよ

Slide 33

Slide 33 text

表示処理  @{substring(outputs('回答履歴+回答 _array')?[variables('intCount')],0,1)}  Power Virtual Agents のチャットボットは 一部の HTML タグによる表現が可能です。 A L B U M A D O B E

Slide 34

Slide 34 text

答え合わせと表示処理 繰り返し処理だけど、 ループ回数は最大6回なので、 ここでも Apply to each は使わないよ concat( outputs('結果_1'), outputs('結果_2'), outputs('結果_3'), outputs('結果_4'), outputs('結果_5'), outputs('結果_6') )

Slide 35

Slide 35 text

まとめ

Slide 36

Slide 36 text

まとめ ゲームを作ることで、 知れる仕様や 学べるテクニックが あると思います。 ゲーム作りおすすめです!

Slide 37

Slide 37 text

最後に Power Virtual Agetns と Power Automate で Wordle を作る① https://qiita.com/MiyakeMito/items/f71a2541a5d2c284af9c Power Virtual Agetns と Power Automate で Wordle を作る② https://qiita.com/MiyakeMito/items/f41bba6a388b13ee9643 https://github.com/MiyakeMito/Repository インポート方法 https://qiita.com/MiyakeMito/items/b2df9ca9832fbce26a0d

Slide 38

Slide 38 text

ありがとうございました