843 Views
May 20, 23
スライド概要
アフリカ発、世界最古のボードゲーム 「マンカラ」を Power Appsで作ってみた 2023年5月20日(土)
自己紹介 • ハンドルネーム:yukio • Twitter:@yukio_365 • ブログ:yukioのアウトプット (hatenablog.com) ・山口県出身・在住、1990年生まれ ・事務用品販売店のPCサポート職 / 営業 / 雑用 / 電気工事士 / etc・・・ ・2022年3月頃からPower Platformの勉強と、会社の業務改善に挑戦中 ・趣味は楽器演奏(コントラバス)。アマチュアオーケストラと吹奏楽団に 所属していたが、勉強に集中するためお休み中
イベントやってます • ”Power”な朝活 – connpass • 6:30~7:00 不定期で朝活やってます。一緒に勉強/作業しましょう。 • Twitterハッシュタグ「 #Powerな朝活 」での拡散も是非
「マンカラ」とは? • アフリカで紀元前4000年頃に生まれた、世界最古と言われているボード ゲーム • アフリカだけでなく、東南アジア等でも古くから遊ばれており、遊び方(ルー ル)が100種類以上もあると言われている。 引用:https://recreation.or.jp/activities/genki_up/mancala/
基本ルール • 自分の陣地6か所、相手の陣地6か所に、それぞれ4個ずつ石を置く • 自分の番になったら、6か所のうちいずれか1か所の石を総取りし、反時計回 りに1個ずつ配っていく • 最後の石が「ポケット」と呼ばれるエリア(下図の7と14)で止まったら再度自 分の番、そうでなければ相手の番になる • 自分の陣地の石を早くなくした方の勝ち 先になくなった Bさんの勝ち 引用:https://recreation.or.jp/activities/genki_up/mancala/
これなら Power Appsで 作れるかも?
今回の特別ルール(簡易版) • 「QuizKnock」がYouTube企画用に作成したルール • 1人当たりの陣地の数:6か所→3か所 • 陣地1個あたりの石の数(初期値):4個→3個 • 「1個ずつ反時計回りに配る」「ポケットで終わったら再度自分の番」等の基 本ルールは変更なし 引用:https://www.youtube.com/watch?v=OL3m2ZbKb1o
データ構成(コレクション) • エリアに番号をつけ、このようなコレクション「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 ポケット
データ構成(コレクション) • 「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}//ポケット )
ボタン押したら石配ればいいんでしょ?(ぼんやり) • 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を選ぶ
ボタンのOnSelectをどう書くか • 当初は、ForAll関数+Patch関数あたりでどうにかなるやろ!と思って作り 始めてみたが、なかなかうまくいかず(その後の改善策は後述) • そこで、一旦泥臭くつくってみることにした。 • そうしてできたVer1がこちら
アプリ画面(Ver1) 石の数を 初期値に戻す ボタン
ちょっとしたこだわり ホントはこれが 良かったけど 向きが逆 「反時計回り」を 分かりやすく伝える ちょうどいいアイコン 見つけたwww
ラベルの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 ポケット
ボタンのVisibleとDisplayModeを変数で場合分け • 変数を2種類用意 • 「誰のターンか」を保管するgblTurn、「勝敗状態」を保管するgblVictory 型は「A」「B」などの文字列型(→のちに数値型に変えた。) • DisplayModeプロパティ • Visibleプロパティ (後でデモで見せます。)
勝敗確定時の処理 • 「gblVictory」の値が”A”もしくは”B”になったら、四角形、ラベル、ボタンをグ ループ化したものを上からかぶせるようにした • コンポーネント使ってもいいかも
ポケットフラグ • 石を配ったときに、ポケットで終了したかどうかを保存する変数「PocketFlag」 を用意した。 • 型はBoolean型(true / false) • どこで書き換えるかは後述
ボタンのOnSelect こんな感じの関数を 合計9回書いたwww ・・・まだまだ続く・・・
ここでポケットフラグを書き換え 例えば石が2個なら、(3)以降のIfは スルーされるので、PocketFlagはfalse 石が3個なら、(4)以降のIfは スルーされるので、PocketFlagがtrueのままで 最後の処理に行くことになる。
【最後の処理】 自分のエリアの石が 全部0だったら試合終了 (自分の勝ち) そうでない時、 ポケットで終了かどうか を見て、ターン切換 する/しないを判断する
長い そして、泥臭い (実際の画面デモで見せます)
なぜこんな泥臭くなったか • やりたかったのはこんな感じの処理
JPPGB主催者 コルネさんに聞いてみた レコード更新の関数の中でn=n+1みたいなことってPower Appsで できませんかね?Patchだとできそうにないです。 UpdateIfで出来ませんかね? ほうほう!UpdateIfってありましたね!調べて試してみます! そうしてUpdateIfを使い、そのほかも追加でなんやかんやした結果がこちら・・・
完成版(Ver2)
完成版(Ver2) ギャラリーを使って 石の数が見やすい ようにしてみた
エリアをギャラリーにした • 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
ボタンのOnSelect、ここまでコンパクトに If+Patchを 泥臭く9回ぐらい 繰り返していたのが ここまでスッキリ
(登壇後追記)UpdateIf1周目
(登壇後追記)UpdateIf2周目
(登壇後追記)最後の処理 ボタン(1)を押した場合は、 石が3個or7個or11個…なら ポケット終了と分かっているので 値を決め打ちで入力 →変数「PocketFlag」が不要に
UpdateIf関数 • 構文: UpdateIf( [データソース],[条件式], { [列名1]:[変更する値1], [列名2]:[変更する値2], ・・・ } ) • [データソース]の中の、[条件式]に合致するレコードを全て 抽出し、列の 内容を変更していく関数 公式ドキュメント:https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-update-updateif
だいぶスッキリした (実際の画面デモで見せます)
作ってみて感じたこと • はじめから頭の中で効率的な関数を書こうと思って行き詰った →考え方を変えて、とりあえず泥臭く書いてみたら分かることも多かった • Patchにこだわりすぎていた。UpdateIfの便利さを知った • コレクションに関する知識も深まった (Sequence関数を初めて使った。実際の業務アプリ作成にも活きた)
今後の課題 • 基本ルール(エリアが4か所×2、1エリア当たりの初期値4個)で作る • QuizKnockが出している別の動画 https://www.youtube.com/watch?v=GPRm65IePhw を参考に、最善手を研究するようなアプリが作れるか?
ご清聴 ありがとうございました