親クラス子クラス

C#のclassの中にclassを書くことができるらしいです。

親クラスの定数は黙っていても子クラスの定数として使えますが親クラスの変数は子クラスの変数として使うには子クラスに親クラスの参照を渡してあげないといけないみたい。

 

    //親クラス
    class parent {
        private const int HOGE = 3;
        public int fuga = 4;
        private int sono = 5;

        //子クラス
        class child {
            private readonly parent parent;

            public child(parent parent) {
                this.parent = parent;
            }

            //親クラスの定数は読める
            public int constresult => HOGE;

            //親クラスの変数は読めない(ビルド通らない)
            public int valueresult => fuga;

            //親クラスの参照を子クラスに渡しておけば親クラスのprivateな変数も読める
            public int valueresult2 => this.parent.sono; 
        }
    }

 

子クラス、である。告らせる、ではありません。

 

PowerAutomateでゲーム操作の自動化

某女子高生が戦車に乗って撃ち合うハートフルストーリーアニメ(ガールズ&パンツァー(GIRLS und PANZER)|公式サイト (girls-und-panzer.jp))がベースとなったスマホゲーム(以下「戦車道大作戦」)に参加してまうす。

(※スマホゲームといいつつわたくしはAndApp経由でWindowsPCにてプレイしています)

 

この戦車道大作戦にはスマホゲームにありがちな毎日やるべきお作業がございます。それが下記動画。部隊を一つ用意して試合を十回こなすというもので、ひたすらマウスをポチポチするだけの作業です。

 

youtu.be

 

で、これを毎日手作業でするのはめんどくさいなーと思っていたのでPowerAutomateDesktopで自動化しちゃいました(先の動画は自動化した状態で作成しています)。

 

下準備(武芸連戦に臨む部隊の設定)は初日に手作業でやっておかなければなりませんが以後はフローを実行するだけなので楽ちん。

 

で、その便利なフローを公開!・・・しよかと思いましたが、サブフロー多い(12個)し画像が含まれているのでコードコピペではどうにもならないので当該フローを作成してて感じたことをメモ。

 

 

①フローでやってることは

クリックしたい「画像を待機」して「マウスを画像に移動します(&マウスの移動後にクリックを送信します)」

の繰り返しなので気合いと根性でつくりましょー。

 

②若干めんどくさいなーと思ったのは待機する画像を変数で指定できないことかな。

下記コード例の下線部分を変数KaisenIndexから生成して画像を指定することができればSWITCHが消えてすっきりするのだけどなあ。このあたりはGUI限定の開発環境ではしかたないか。

f:id:turkey_pc:20211208111208p:plain

(コード例)

SWITCH KaisenIndex
    CASE = 1
        WAIT (UIAutomation.WaitForImage.ToAppearOnForegroundWindow Images: [imgrepo['第1回戦']] (以下略
    CASE = 2
        WAIT (UIAutomation.WaitForImage.ToAppearOnForegroundWindow Images: [imgrepo['第2回戦']](以下略

 

③「画像を待機」や「マウスを画像に移動します」はデフォルトだとユニークな変数を生成して座標(X,Y)を設定してくれるのですが、不要であることがわかっているなら生成しないほうがいいでせう。使いまわしてもかまわないと判断できるなら使いまわしましょう。フロー変数欄がすっきりします。

f:id:turkey_pc:20211208111403p:plain

 

④理屈では正しいはずなのになぜがエラーがでる。そんなときはWaitをいれると解消されるかも。VB6でいうDoEventsみたいな兵器です。

 

⑤残念なことにローカル変数ありません。サブフロー(サブルーチンみたいな)に引数を渡すということもできません。すべてがグローバルです。MSX-BASIC時代を思い出しました。開発環境が変数を管理してくれる(フロー変数欄がある。変数名の変更が安全に行える)だけましかな。

 

⑥ClassやStructはありませんが「JSONをカスタムオブジェクトに変換」でStructぽいものは作れるかな。ただしIntelliSenseが効くわけありませんので値がひとまとまりになるという効能しかありません。

Variables.ConvertJsonToCustomObject Json: $'''{\"X\":%ImageX%,\"Y\":%ImageY%}''' CustomObject=> KaisenPosition

 

以上。

 

 

 

 

 

 

PowerAutomateDesktopのお勉強なう

詳細は略するが、開発中WinFormなアプリ(以下弊アプリ)のあるボタン(以下処理起動ボタン)を押してから別のボタンが有効になる(以下処理終了)までの時間を測るにあたりPowerAutomateDesktop(以下PAD)で楽させてもらうことにした。

 

ざっくりこんな手順

<手作業>

 弊アプリを起動して処理起動ボタンを押せる状態にする

<PAD>

 処理起動ボタンを押す

 現在時刻を変数Time1に保存

 処理終了を待つ

 現在時刻を変数Time2に保存

 Time2とTime1の差分を秒単位で計算

 

で、Time1なりTime2の値を見ると秒単位までしか保持していないように見えるが差分とったら秒未満の単位も保持していた。よかった。

 

f:id:turkey_pc:20210507151240p:plain

変数s

 

これでストップウォッチ片手に処理終了まで画面をにらみ続ける必要がなくなった。感謝。

PowerAutomateDesktopで遊んでみた、の続き

turkey-pc.hatenablog.com

 

 

PowerAutomateDesktopのフローを入力する画面はグラフィカルなのですが全文コピーしてメモ帳にペーストすれば文字情報として落とせます。

 

前回の数当てゲームのMainは文字情報にすると↓のようになります。

 

Variables.RandomNumber MinimumValue: 1 MaximumValue: 100 RandomNumber=> Answer
Variables.CreateNewList List=> Expecteds
LOOP WHILE (1) = (1)
Display.InputDialog Title: $'''予想入力''' Message: $'''1から100の整数を入力してくれ''' InputType: Display.InputType.SingleLine IsTopMost: True UserInput=> Inputed ButtonPressed=> ButtonPressed
IF ButtonPressed = $'''Cancel''' THEN
EXIT LOOP
END
CALL Validate
IF Expected = 0 THEN
NEXT LOOP
END
Variables.AddItemToList Item: Expected List: Expecteds NewList=> Expecteds
IF Expected = Answer THEN
Display.ShowMessage Title: $'''おめでとう。''' Message: $'''正解です!
%Expecteds.Count%回で正解しました!''' Icon: Display.Icon.Information Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: True ButtonPressed=> ButtonPressed2
EXIT LOOP
END
IF Expected > Answer THEN
SET Hint TO $'''大きすぎる'''
ELSE
SET Hint TO $'''小さすぎる'''
END
Display.ShowMessage Title: $'''ヒント''' Message: Hint Icon: Display.Icon.Information Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: True ButtonPressed=> ButtonPressed3
END

 

ついでにValidateのほうも

Text.ToNumber Text: Inputed Number=> TextAsNumber
ON ERROR
SET NewVar2 TO 1
END
SET Expected TO 0
IF NewVar2 = 1 THEN
EXIT FUNCTION
END
IF TextAsNumber < 1 THEN
EXIT FUNCTION
END
IF TextAsNumber > 100 THEN
EXIT FUNCTION
END
SET Expected TO TextAsNumber

 

これをコピペすればあなたもPowerAutomateDesktopで数当てゲームができる!(やりたいか?)

 

PowerAutomateDesktopで遊んでみた

PowerAutomateDesktopについてはこちら

マイクロソフトがワークフローを自動化するPower Automate DesktopをWindows 10ユーザーに無料で公開 | TechCrunch Japan

 

RPAとかそういうのに使用するものらしい。

だがRPAなんてめんどくさいことは偉い人に任せておっさんは数当てゲームを作ってみた。

f:id:turkey_pc:20210316182835p:plain

Main

※無限ループはWhile(1)=(1)で実現

※入力ダイアログのキャンセル判定はボタンの文字列で行う。日本語環境でも'Cancel'である。

※入力判定はValidateにまかせてある。Validateに失敗したらExpectedに0を代入。予想の履歴をExpectedsに積んで最後に回数表示させている。

 

f:id:turkey_pc:20210316182951p:plain

Validate

※単純にテキストを数値に変換して、失敗or1未満or100超なら抜け出すだけ

 

今日の敵

f:id:turkey_pc:20210219081032p:plain

今日の敵

今日戦う相手は↑のメソッドである。

製造仕様を見る限りメソッドの中の数行コメントアウトしてちょこちょこっと動作確認したらおしまいな気がするがそれではつまんないんで今時流行りのテストで保護してなんとやらというのをちょっとだけやってみようかと。

まずは敵をMethodObjectにするところからかな。