20230520JPPGB_マンカラ作ってみた(登壇後修正版)

843 Views

May 20, 23

スライド概要

profile-image

2022年3月頃~ PowerApps、PowerAutomate 等を中心に勉強中。2024年9月よりPower Apps開発・保守・支援をする会社に転職。趣味でアマチュアオーケストラに所属していたが、勉強に集中するためお休み中。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

アフリカ発、世界最古のボードゲーム 「マンカラ」を Power Appsで作ってみた 2023年5月20日(土)

2.

自己紹介 • ハンドルネーム:yukio • Twitter:@yukio_365 • ブログ:yukioのアウトプット (hatenablog.com) ・山口県出身・在住、1990年生まれ ・事務用品販売店のPCサポート職 / 営業 / 雑用 / 電気工事士 / etc・・・ ・2022年3月頃からPower Platformの勉強と、会社の業務改善に挑戦中 ・趣味は楽器演奏(コントラバス)。アマチュアオーケストラと吹奏楽団に 所属していたが、勉強に集中するためお休み中

3.

イベントやってます • ”Power”な朝活 – connpass • 6:30~7:00 不定期で朝活やってます。一緒に勉強/作業しましょう。 • Twitterハッシュタグ「 #Powerな朝活 」での拡散も是非

4.

「マンカラ」とは? • アフリカで紀元前4000年頃に生まれた、世界最古と言われているボード ゲーム • アフリカだけでなく、東南アジア等でも古くから遊ばれており、遊び方(ルー ル)が100種類以上もあると言われている。 引用:https://recreation.or.jp/activities/genki_up/mancala/

5.

基本ルール • 自分の陣地6か所、相手の陣地6か所に、それぞれ4個ずつ石を置く • 自分の番になったら、6か所のうちいずれか1か所の石を総取りし、反時計回 りに1個ずつ配っていく • 最後の石が「ポケット」と呼ばれるエリア(下図の7と14)で止まったら再度自 分の番、そうでなければ相手の番になる • 自分の陣地の石を早くなくした方の勝ち 先になくなった Bさんの勝ち 引用:https://recreation.or.jp/activities/genki_up/mancala/

6.

これなら Power Appsで 作れるかも?

7.

今回の特別ルール(簡易版) • 「QuizKnock」がYouTube企画用に作成したルール • 1人当たりの陣地の数:6か所→3か所 • 陣地1個あたりの石の数(初期値):4個→3個 • 「1個ずつ反時計回りに配る」「ポケットで終わったら再度自分の番」等の基 本ルールは変更なし 引用:https://www.youtube.com/watch?v=OL3m2ZbKb1o

8.

データ構成(コレクション) • エリアに番号をつけ、このようなコレクション「ABScore」を考えた 2 3 4 6 5 8 1 7 ID Score (石の数 初期値) 備考 1 3 A陣地 2 3 A陣地 3 3 A陣地 4 0 ポケット 5 3 B陣地 6 3 B陣地 7 3 B陣地 8 0 ポケット

9.

データ構成(コレクション) • 「Game Start」ボタンのOnSelectにこんな関数を仕込めばいいよね? ID Score (石の数 初期値) 備考 {ID:2,Score:3},//PlayerAの2番目 1 3 A陣地 {ID:3,Score:3},//PlayerAの3番目 2 3 A陣地 {ID:4,Score:0},//ポケット 3 3 A陣地 4 0 ポケット 5 3 B陣地 6 3 B陣地 7 3 B陣地 8 0 ポケット ClearCollect(ABScore, {ID:1,Score:3},//PlayerAの1番目 {ID:5,Score:3},//PlayerBの1番目 {ID:6,Score:3},//PlayerBの2番目 {ID:7,Score:3},//PlayerBの3番目 {ID:8,Score:0}//ポケット )

10.

ボタン押したら石配ればいいんでしょ?(ぼんやり) • IDに対応したボタンを押したら、まずそのIDの石を空(0個)にして、その次以 降のIDに対して1個ずつ石増やしたらいいんよね・・・ ID Score 備考 (石の数) ID Score 備考 (石の数) 1 3 A陣地 1 0 A陣地 2 3 A陣地 2 4 A陣地 3 3 A陣地 3 4 A陣地 4 0 ポケット 4 1 ポケット 5 3 B陣地 5 3 B陣地 6 3 B陣地 6 3 B陣地 7 3 B陣地 7 3 B陣地 8 0 ポケット 8 0 ポケット [先攻] 1を選ぶ

11.

ボタンのOnSelectをどう書くか • 当初は、ForAll関数+Patch関数あたりでどうにかなるやろ!と思って作り 始めてみたが、なかなかうまくいかず(その後の改善策は後述) • そこで、一旦泥臭くつくってみることにした。 • そうしてできたVer1がこちら

12.

アプリ画面(Ver1) 石の数を 初期値に戻す ボタン

13.

ちょっとしたこだわり ホントはこれが 良かったけど 向きが逆 「反時計回り」を 分かりやすく伝える ちょうどいいアイコン 見つけたwww

14.

ラベルのTextプロパティ ID Score 備考 (石の数) 1 3 A陣地 2 3 A陣地 3 3 A陣地 4 0 ポケット 5 3 B陣地 6 3 B陣地 7 3 B陣地 8 0 ポケット

15.

ボタンのVisibleとDisplayModeを変数で場合分け • 変数を2種類用意 • 「誰のターンか」を保管するgblTurn、「勝敗状態」を保管するgblVictory 型は「A」「B」などの文字列型(→のちに数値型に変えた。) • DisplayModeプロパティ • Visibleプロパティ (後でデモで見せます。)

16.

勝敗確定時の処理 • 「gblVictory」の値が”A”もしくは”B”になったら、四角形、ラベル、ボタンをグ ループ化したものを上からかぶせるようにした • コンポーネント使ってもいいかも

17.

ポケットフラグ • 石を配ったときに、ポケットで終了したかどうかを保存する変数「PocketFlag」 を用意した。 • 型はBoolean型(true / false) • どこで書き換えるかは後述

18.

ボタンのOnSelect こんな感じの関数を 合計9回書いたwww ・・・まだまだ続く・・・

19.

ここでポケットフラグを書き換え 例えば石が2個なら、(3)以降のIfは スルーされるので、PocketFlagはfalse 石が3個なら、(4)以降のIfは スルーされるので、PocketFlagがtrueのままで 最後の処理に行くことになる。

20.

【最後の処理】 自分のエリアの石が 全部0だったら試合終了 (自分の勝ち) そうでない時、 ポケットで終了かどうか を見て、ターン切換 する/しないを判断する

21.

長い そして、泥臭い (実際の画面デモで見せます)

22.

なぜこんな泥臭くなったか • やりたかったのはこんな感じの処理

23.

JPPGB主催者 コルネさんに聞いてみた レコード更新の関数の中でn=n+1みたいなことってPower Appsで できませんかね?Patchだとできそうにないです。 UpdateIfで出来ませんかね? ほうほう!UpdateIfってありましたね!調べて試してみます! そうしてUpdateIfを使い、そのほかも追加でなんやかんやした結果がこちら・・・

24.

完成版(Ver2)

25.

完成版(Ver2) ギャラリーを使って 石の数が見やすい ようにしてみた

26.

エリアをギャラリーにした • Itemsプロパティをこのようにした ID=1にある石の数 Value →石が3個であれば「Sequence(3)」なので こんなテーブルがItemsに定義される 1 2 3 • そしてテンプレート内には単純に「円」を1個だけ置くことで、 そのエリアにある石の数だけ円が表示される Sequence関数公式ドキュメント:https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-sequence

27.

ボタンのOnSelect、ここまでコンパクトに If+Patchを 泥臭く9回ぐらい 繰り返していたのが ここまでスッキリ

28.

(登壇後追記)UpdateIf1周目

29.

(登壇後追記)UpdateIf2周目

30.

(登壇後追記)最後の処理 ボタン(1)を押した場合は、 石が3個or7個or11個…なら ポケット終了と分かっているので 値を決め打ちで入力 →変数「PocketFlag」が不要に

31.

UpdateIf関数 • 構文: UpdateIf( [データソース],[条件式], { [列名1]:[変更する値1], [列名2]:[変更する値2], ・・・ } ) • [データソース]の中の、[条件式]に合致するレコードを全て 抽出し、列の 内容を変更していく関数 公式ドキュメント:https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-update-updateif

32.

だいぶスッキリした (実際の画面デモで見せます)

33.

作ってみて感じたこと • はじめから頭の中で効率的な関数を書こうと思って行き詰った →考え方を変えて、とりあえず泥臭く書いてみたら分かることも多かった • Patchにこだわりすぎていた。UpdateIfの便利さを知った • コレクションに関する知識も深まった (Sequence関数を初めて使った。実際の業務アプリ作成にも活きた)

34.

今後の課題 • 基本ルール(エリアが4か所×2、1エリア当たりの初期値4個)で作る • QuizKnockが出している別の動画 https://www.youtube.com/watch?v=GPRm65IePhw を参考に、最善手を研究するようなアプリが作れるか?

35.

ご清聴 ありがとうございました