マイクロソフトのRPA(自動化ツール)である「Power Automate Desktop」を使って簡単なゲームを作ってみるサンプルです。
Power Automate Desktopは、パソコン作業を効率化するための便利なツールで、もともとプログラミングの知識を必要とせず幅広い自動化の動作を簡単な設定で行うことができるようになっています。
本来ゲーム開発を行うようなツールではないのですが、自動化ツールのいろいろな使い方のアイデアのひとつとして、今回は古典的な数当てゲームである「Hit&Blow(ヒットアンドブロ―)」を題材に、実際に遊べるフローをサンプルとして作ってみます。
「ヒットアンドブロ―」フローの概要
Power Automate Desktopを使って、ヒットアンドブロー(マスターマインド)という古典的なゲームを再現します。
ヒットアンドブロ―のルール
ヒットアンドブロ―とは、コンピュータがランダムに決めた4桁の数字を推理して当てるパズルゲームです。もとは数字だけではなく色のついたピンの種類などを推理するマスターマインドと呼ばれるボードゲームがモデルとなっています。
プレイヤーは予想した4桁の数字を入力することで、正解の数字に近づくためのヒントがもらえます。
ヒントには「ヒット」と「ブロー」があり、予想した4桁の数字のうち、数字の番号と桁の位置が一致している場合は「ヒット」、数字の番号は含まれているが桁の位置が異なる場合は「ブロー」として、いくつの「ヒット」「ブロー」があるかがヒントとなります。
いくつかの条件として、コンピュータが決める4桁の数字はすべて異なる数字で、「4444」や「1123」のように同じ数字が複数含まれることはありません。
また、ゲームは回数制限を設けるものやそうでないもの正解までの正解を競うものなどがありますが、今回は10回以内に正解にたどり着けば勝ち(ゲームクリア)、という条件とします。
使い方(遊び方)
フローを実行すると、コンピュータが正解の4桁の数字を自動的に作り、そのあと最初の入力ウィンドウが表示されます。
ここで、4桁の数字を入力して [OK] ボタンをクリックすると1回目の判定に進みますが、この際、入力した内容が4桁の数字以外であった場合はエラーが表示され再度入力画面に戻ります。(この時、回数制限のカウントは変化しません)
4桁の数字が判定されると、入力された4桁の数字とともに、「Hit(ヒット)」と「Blow(ブロー)」のヒントが表示され入力画面に戻ります。
表示されたヒントを基に繰り返し数字を入力していき、正解の数字を予想していきます。
予想した数字が「4ヒット」になると正解となり、クリアメッセージが表示されます。
また、10回繰り返し正解にたどり着けなかった場合、ユーザーの負けとなりゲーム終了メッセージが表示されます。
正解もしくは10回繰り返し不正解になって上記のいずれかのメッセージが表示されたらフローが終了します。
フロー内容
フロー一覧
作成したフローのスクリーンショットです。クリックすると拡大します。
コード
上記のスクリーンショットと同じフローをコピーして取り出したテキストのコードです。
以下のコードをコピーし、Power Automate Desktopの編集画面に張り付けることで上記のアクションをそのまま登録することができます。
Variables.CreateNewList List=> AnswerList
Text.Random UseUpperCaseLetters: False UseLowerCaseLetters: False UseDigits: True UseSymbols: False MinimumLength: 1 MaximumLength: 1 RandomText=> RandomText
Variables.AddItemToList Item: RandomText List: AnswerList NewList=> AnswerList
SET Position TO -1
LOOP WHILE (Position) = (-1)
Text.Random UseUpperCaseLetters: False UseLowerCaseLetters: False UseDigits: True UseSymbols: False MinimumLength: 1 MaximumLength: 1 RandomText=> RandomText
Variables.AddItemToList Item: RandomText List: AnswerList NewList=> AnswerList
Variables.RemoveDuplicateItemsFromList List: AnswerList IgnoreCase: False NewList=> AnswerList
Text.Join List: AnswerList Result=> JoinedText
Text.RegexParseForFirstOccurrence Text: JoinedText TextToFind: $'''^[0-9]{4}$''' StartingPosition: 0 IgnoreCase: False OccurrencePosition=> Position Match=> Match
END
Variables.CreateNewList List=> UserInputList
LOOP LoopIndex FROM 1 TO 10 STEP 1
LABEL start
Display.InputDialog Title: $'''Hot&Blow''' Message: $'''%UserInputList%4桁の数字を入力してください''' InputType: Display.InputType.SingleLine IsTopMost: False UserInput=> UserInput ButtonPressed=> ButtonPressed2
Text.RegexParseForFirstOccurrence Text: UserInput TextToFind: $'''^[0-9]{4}$''' StartingPosition: 0 IgnoreCase: False OccurrencePosition=> Position Match=> Match
IF Position < 0 THEN
Display.ShowMessage Title: $'''エラー''' Message: $'''4桁の数字じゃないよ''' Icon: Display.Icon.None Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: False ButtonPressed=> ButtonPressed3
GOTO start
END
SET Hit TO 0
SET Blow TO 0
SET Digit TO 0
LOOP FOREACH CurrentItem IN AnswerList
Text.ParseForFirstOccurrence Text: UserInput TextToFind: CurrentItem StartingPosition: 0 IgnoreCase: False OccurrencePosition=> Position
IF Position >= 0 THEN
IF Position = Digit THEN
Variables.IncreaseVariable Value: Hit IncrementValue: 1 IncreasedValue=> Hit
ELSE
Variables.IncreaseVariable Value: Blow IncrementValue: 1 IncreasedValue=> Blow
END
END
Variables.IncreaseVariable Value: Digit IncrementValue: 1 IncreasedValue=> Digit
END
Variables.AddItemToList Item: $'''%LoopIndex% : %UserInput% -> %Hit% Hit / %Blow% Blow''' List: UserInputList NewList=> UserInputList
IF Hit = 4 THEN
Display.ShowMessage Title: $'''%UserInput%:おめでとう!正解です''' Message: UserInputList Icon: Display.Icon.None Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: False ButtonPressed=> ButtonPressed4
EXIT Code: 0
END
END
Display.ShowMessage Title: $'''残念!正解は %JoinedText% でした''' Message: UserInputList Icon: Display.Icon.None Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: False ButtonPressed=> ButtonPressed4
フロー設定のポイントなど
ランダムな4桁の数字を準備する
1から11までのアクションがランダムな4桁の数字を作るフローになっています。
Power Automate Desktopには、「ランダムテキストの作成」というアクションがあり、これによりアルファベットや記号などを含めたランダムな文字列のほか、数字だけを組み合わせたランダムな文字列も作ることができます。
しかしながら、このアクションは本来パスワードなどの自動設定を行うために用意されたもので、今回のヒットアンドブロ―のルールで使用できない「4444」や「1123」のように同じ数字が被る文字列も出力されてしまうためそのまま使うことができません。
そのため、今回の例では数字を一桁ずつ作ってリストに格納し、作成済みの文字列と比べて数字がすでに含まれていない場合だけ新たにリストに格納し、数字が被らない4桁の数字が出来上がるまで繰り返す処理としています。
また、4桁の数字が出来上がったかどうかの判定には「正規表現」を使っています。
ここでは^[0-9]{4}$
という正規表現を使っていますが、これは4桁の数字(3桁でもなく5桁でもない)を判定するための正規表現です。
この正規表現では数字のダブりのチェックは行っていませんが、ダブった数字が重ならないように事前に処理されているため、ここでは4桁の桁数が揃ったかどうかを判定するためのアクションとしています。
なお、この「テキストの解析」アクションでは、指定したテキストの検索を行って該当するテキストが見つかると%Position%
という変数にテキストが見つかった位置(n文字目)が数値として格納されます。また、見つからなかった場合は「-1」が格納されるため、%Position%
の値が「-1」か「それ以外か」を見ることで文字が含まれているかどうかの判定が可能です。
今回はLoopアクションの繰り返し条件にこの判定を利用し、4桁の数字が揃うまで繰り返し処理が継続されるようにしています。
プレイヤーの入力の初期判定を行う
プレイヤー(ここではあえてゲームっぽくこう記述します)が4桁の数字を入力する処理は12行目から20行目のアクションで構成されています。
ここではまず、プレイヤーが入力した文字列が4桁の数字になっているかどうかを判定するのですが、この判定は前項と同じ「テキストの解析」アクションと正規表現を使っています。
前述の通り、4桁の数字が入力されている場合、%Position%
変数に「-1」以外の数字が格納されるため、ここでは「if」アクションで%Position%
が「0」より小さい場合(-1の場合)にエラーメッセージを表示するフローとしています。またこのエラーに到達した場合、「ラベル」と「移動先」アクションを使って再度入力のアクションの位置までプロセスを戻します。
「ヒット」と「ブロー」の数をカウントする
4桁の数字が入力されていることが確認できたら、コンピュータの正解と比較し、ヒットとブローの数をカウントします。
ここではカウントした数値を格納するために%Hit%
と%Blow%
のほか、判定中の桁数を格納する%Digit%
変数も準備しています。
そして、判定は「For each」アクションを使って行います。For eachはリストの要素の数だけ繰り返し処理ができるアクションですが、ここで4桁の数字の生成に使用した%AnswerList%
を指定することで、一文字ずつのチェックを行うことができます。
数字が存在するかどうかは「テキストの解析」アクションを使います。プレイヤーが入力した4桁の数字が%UserInput%
変数に格納されているので、その変数にFor eachで取り出した%CurrentItem%
の数字が含まれていれば「ヒット」もしくは「ブロー」であることがわかります。
また、その数字が見つかった場所は%Position%
に格納されるので、現在チェック中の桁数と%Position%
の値が一致していれば「ヒット」であることがわかります。
この「現在チェック中の桁数」はループアクションなどでは保持されたいないため、先ほど別途用意した%Digit%
変数を使い、ループのたびに増加させることで桁の位置を判断しています。
これらの「ヒットもしくはブローの判定」と「ヒットの判定」「それ以外の判定」という判断を組み合わせることで、最終的にFor eachのループが終了した段階でそれぞれの値が%Hit%
と%Blow%
変数に格納された状態となります。
正解もしくはゲーム終了の判定を行う
最後に35行目から41行目のアクションで正解やゲーム終了の判定を行います。
ここまでで%Hit%
と%Blow%
のカウントができているので、まずはプレイヤーの入力した数字%UserInput%
と、その数字に対する%Hit%
と%Blow%
の内容を%UserInputList%
リストに追加しておきます。
[項目の追加] ボックスは以下のように入力しています。
%LoopIndex% : %UserInput% -> %Hit% Hit / %Blow% Blow
このリストはゲームが継続する際のヒント表示に使われるほか、正解やゲーム終了時の結果表示にも使われます。
そして、この段階で%Hit%
の値が「4」になっていればすべての数字と桁の位置が一致しているため、正解となりゲーム終了です。「If」アクションを使い正解のメッセージを表示して「フローを停止する」アクションを使うことでフロー全体が停止されゲームも終了します。
%Hit%
が4以外の場合は処理が継続され、ループが設定された13行目のアクションへと戻ります。また、15行目の「入力ダイアログを表示」アクションには%UserInputList%
を入力ダイアログメッセージに指定しておくことで、ゲームが継続した際のヒントが表示され、過去の入力内容とヒントを参考に入力ボックスに入力ができるようになります。
最終的に全体のループが10回繰り返され、正解にたどり着かなかった場合、最後の41行目のアクションに指定された「メッセージ表示」が実行され、ゲームが終了します。
RPAはプログラミングの学習にもなる
冒頭の通り、Power Automate Desktopは本来ゲーム開発を行うようなツールではないのですが、ツールに用意されているアクションの使い方によっては、今回のような簡単なゲームやユーティリティのアプリのような使い方もできます。
Power Automate Desktopのようなツールは「ローコード」や「ノーコード」開発と呼ばれ、プログラムのコードこそ書かないものの、プロセス設計などの基礎的な知識を学ぶことができるため、プログラミングの入門としても活用することが可能です。
今回は古典的な数当てゲームである「Hit&Blow(ヒットアンドブロ―)」を題材に、プロセスをPower Automate Desktopのアクションに分解し、実際に遊べるフローをサンプルとして作ってみました。アイデア次第ではゲーム的な要素を取り入れたプロセス管理(ゲーミフィケーション)やパフォーマンスの管理などいろいろな応用にも使えるかもしれません。
ぜひいろいろなアイデアを基に自動化にチャレンジしてみてください。
お読みくださりありがとうございました。今回の内容が少しでもお役に立てば幸いです。
コメント