まず初めに
この内容は、個人利用目的であり
商用利用や権利侵害を目的としたものではありません。
1ファンの長年の夢をたまたまPowerAppsを使って具現化したものだという点にご理解をお願いいたします。
このアプリ作成を決意したキッカケ(無茶?)
JPPGB#6にて、しょぼいビンゴカードゲームで登壇させていただき
その後、【JPPGB】ゲーム作成コンテスト #0の凄まじい内容に驚愕
大賞を受賞したヨウセイさんの「青春を溶かしたパチスロ」
という言葉に感銘を受ける。
そう、私にとっての「青春を溶かした」ものとは?
そう、それはプロレス
何を隠そう、プロレスファン歴40年超(笑)
所持しているプロレス動画は2,800ファイル、4TB、全て動画化
(ちなみにビデオ300本、DVD1500枚あった)
生まれも育ちも北海道だが、プロレス見たさに関東の大学へ進学
結果、4年間で54回観戦
今から30年前の1993年、新日本プロレスG1両国7連戦は完全制覇した
そして、夏といえばG1クライマックスの季節
プロレスの魅力って何?
力道山に始まり、馬場、猪木と受け継がれた日本のプロレス
そこには選手の離合集散が幾度も繰り広げられた。
なぜレスラー達は団体を旗揚げし、そしてまた離散するのか?
それは誰もがトップに立ちたいという野望があるからである
デビューしながらに将来のエースを確約された者
長年に渡って負け役(ジョバー)を任されてきた者
誰しもが日の当たる世界を目指して闘う
そしてそこにはジェラシーと裏切りが、人間そのものな世界
それがプロレス
7月15日夜(ゲームコンテスト終了後)
大いに盛り上がったゲームコンテストの夜
【JPPGB】ゲーム作成コンテスト #0 - connpass
みんなすごいなあ~、自分も何か作ってみたいなあ~
作るならプロレスのゲームだよなあ~
と思い立つ
まずはG1クライマックスの季節も近いし、リーグ戦出来ねえかな
と思いながらパワスロを回す
リーグ戦って対戦表必要だよね
対戦表ってどうやって作るんだよ~
ギャラリー使うよなあ、きっと・・・・
と途方に暮れていた私の脳裏に、JPPGB#6の光景が
ふらりさん、Gallery in Galleryで座標マップとか作ってたなあ・・・
https://www.docswell.com/s/fworlddocs/5YWMW9-2023-06-24-155843#p7
よし、まずはやってみますか!!
レスラー選んで、ボタン押したらリーグ戦のカード決定!!
ForAll(
Sequence(CountRows(colleague)) As PositionY,
ForAll(
Sequence(CountRows(colleague)) As PositionX,
Collect(
colCard,
{
cell: Text(PositionY.Value) & "-" & Text(PositionX.Value),
card: Index(
colleague,
PositionY.Value
).name & " - " & Index(
colleague,
PositionX.Value
).name,
card2: Index(
colleague,
PositionY.Value
).subname & " - " & Index(
colleague,
PositionX.Value
).subname,
redcorner:Index(colleague,PositionY.Value).name,
bluecorner:Index(colleague,PositionX.Value).name,
result: "",
detail: "",
PositionY:Text(PositionY.Value),
PositionX:Text(PositionX.Value),
id:LookUp(colindex,cell=Text(PositionY.Value) & "-" & Text(PositionX.Value),id),
location:LookUp(colindex,cell=Text(PositionY.Value) & "-" & Text(PositionX.Value),location)
}
)
)
);
あれだけ苦手にしていた配列のはずなのに・・・・・
やはりプロレスゲームを作りたい力が何かを生んでいるのか??
まず、基本形が完成
レスラー選択⇒レスラーマスターから10人選ぶ、ボタン押す
ギャラリーにリーグ戦の試合が表示される
10人だと10×9/2=45試合
*座標でやったのでフィルターで余計な試合を省ける
Filter(colCard,Value(PositionY)<Value(PositionX))
がこれはのちにこれでは物足りなくなる・・・
さあ、対戦だ!!
まあ、試合はGallery〇〇.Selectedでいけちゃうよね
さてはて、勝敗どうやって決めよう・・・・・
パラメーターもいいけど、絶対偏るよなあ・・・・
たぶん、天龍とか最強にしちゃう気しかしない(笑)
ここで思い出したのが
私の特技というか趣味は、大人の工作という名の写経(笑)
このころもyoutubeでギークフジワラさんのチャンネルで作成していたプライベートChatGPTがあった
https://www.youtube.com/watch?v=jERrUWTm7nA
それに春先にOpenAIのAPI叩いて遊んでたしなあ
このときはQiitaで益森さんの記事参考にしたよなあ
https://qiita.com/Takashi_Masumori/items/96b9e0f1590762fd6fad
でもなあプロンプトとかよくわかんねえしなあ・・・
まずは普通にChatGPTに投げてみた
Few-shot Learningっていうのかふむふむ・・・
俺はプロレスマニア、例文ならいくらでも作れるぞ(笑)
まあ、結果帰ってきますよね、普通に
接続も春先に作ったお遊びコネクタとフローもあるし、いけるだろ
みなさんのおかげです。ホント
こんな50のオジサンがこんなことできるの、Youtubeや皆様のおかげです
何気に苦労した気がするのが星取表
先ほども言ったようにこのリーグ戦は座標でやってます。
つまり1-2の対角は2-1
1-2が〇なら2-1は✕、これを格納しないと点数出せない
UpdateIf(colCard,cell=Text(GalleryMatch.Selected.PositionY & "-" & GalleryMatch.Selected.PositionX),{result:winner,detail:detail2},cell=Text(GalleryMatch.Selected.PositionX & "-" & GalleryMatch.Selected.PositionY),{result:winner,detail:detail2})
とコレクションに結果と試合詳細を戻してあげて
*最初Patchでやったけど挙動が安定しなかったのでUpdateIfに変更した。
CountRows(Filter(colCard,result=ThisItem.name))これを数えれば勝ち点2
いや、だからGPTなんだから結果は返ってくるって
ここでハタと気づきます。
勝敗判定どうやってやんのよ?・・・と
リーグ戦だよ、星取表作りたいよね?得点もわかるようにしたいよね?
と悩んだ結果
UpdateContext({winner:Right(Label8.Text,Len(Label8.Text)-Find("★",Substitute(Label8.Text,":","★",Len(Label8.Text)-Len(Substitute(Label8.Text,":","")))))}
勝者:〇〇と最後にGPTに出力させて、そこを抜き出して変数に格納
なんというエクセル風味な解決方法
たまーにおかしな挙動するときあるけど、まあ愛嬌(笑)
ふう、できたできた
正直、これだけでもプロレスファンにとっては十分に遊べます
実際、完成した夜、思い切り時間溶かしました(笑)
いや、ここまでできたんだからさ・・・
出戻りガツオさんがText to Speechとかやってたなあ、あれやってみたいなあ・・・
https://qiita.com/DEmodoriGatsuO/items/37ee57af6fa62e4a7831
でもなあ、出来るかなあ、やれるかなあ・・・ということでチャレンジ!!
フロー自体は難なく完成
がしかし、応答が音声??
どうやんのこれ
思わず出戻りガツオさんにDM
ありがとうございました!!
Set(audio,Text_to_Speech.Run(LabelDetailLeague.Text))
この格納が難敵でした(笑)
試合結果も出来た、さあ次は
うーん、もっと雰囲気出したいなあ、やっぱさプロレスはテーマ曲だよ!!
どうせ個人利用しかしないし、ということで
プロレスファンは季節ごとに身体が反応する曲があります
またイントロを聞くだけで血がたぎる曲があります
これ搭載してから、余計に時間溶けるようになりましたね(笑)
聞いちゃうんですよ、ずっと
ちなみに登場するレスラーはというと
初期段階では歴代IWGP、三冠、GHCのメジャー3大タイトルの歴代王者としていた。(60人ちょい)
がしかし、そんなものでは飽き足らずに、すぐに180人に拡大(笑)
これにより力道山以降の主要レスラーはほぼ網羅
たぶん、現役選手よりも物故者のほうが多い
プロレスファンはそれを「あの世プロレス」と呼び、夢のカードを夢想する
いや、これシングルリーグだけじゃもったいない
最初はシングルのリーグ戦しか作ってなかったんですね
でもこれ全部終わらせるのに45試合やるんですね(セーブ機能作れよ、おい)
通勤時間にやると、マジ時間溶けます(笑)、優勝決まるまでやっちゃうやつです
もっとライトに楽しみたいときってありますよね
ということでシングル戦とタッグ戦追加!!
とここで初めてメニュー必要じゃね?となる
実装してみたかったんですよ、このメニュー
ハイ、またまた大人の工作です
とある土曜日のことです。何気にYoutube見てたら、Akiraさんがライブやってるじゃないですかあ
見ちゃいましたよ、ずっと
https://www.youtube.com/watch?v=5vEkFcDWZRE&t=2186s
と同時に即座に写経開始(笑)
やってみたかったんですよねえ、ギャラリーで作るメニュー
Akiraさん、続きよろしくお願いします!
今現在のメニューはコチラ
増え続けるやりたいこと
シングルリーグ戦に始まり、シングル、タッグと実装
ここまできたらタッグリーグ戦でしょお!!
これがねえ、配列苦手おじさんはしばし考えましたよ(笑)
Clear(coltagleague);
Collect(coltagselect,FirstN(Shuffle(Filter(WreslerMST,IsBlank(team))),20));
ForAll(Sequence(10,1,1),Collect(coltagleague,{name:First(coltagselect).name & "・" & Index(coltagselect,2).name,subname:First(coltagselect).subname & "・" & Index(coltagselect,2).subname,name1:First(coltagselect).name,name2:Index(coltagselect,2).name});Remove(coltagselect,First(coltagselect));Remove(coltagselect,First(coltagselect)));Clear(coltagselect)
20人選んで、タッグ組ませて、2人消して、またタッグ組ませるを10回
最初Sequence(10,1,1)が書けずに10回書いたことはナイショ(笑)
プロレスにはさ、こういうのもある
シングルリーグ戦に始まり、シングル、タッグ、タッグリーグ戦も実装
次何にしようかなあ~
あ!!試練の10番勝負作ろ(軽っ)
というノリで試練の10番勝負も完成
相手だけ変えたい場合にも対応(笑)
時は1988年8月8日、横浜文化体育館
猪木は背水の陣で弟子である藤波に挑む
実況はすでにプロレス実況を離れていた古舘伊知郎
真夏の酷暑の中、試合はなんと60分フルタイム引き分けに
試合後、猪木を長州が肩車、猪木の目には涙が光っていた・・・
このテレビ中継のラストに流れたのが、この名曲
そうサザンオールスターズ「旅姿6人衆」
35年前のあの日、藤波は猪木を60分独り占めにした・・・
プロレスとはつくづく記憶のスポーツ
ということでMemorialコーナー設置
やりたいことがそこにはあった・・・
7月26日、私はとあるコミュニティに初参加します。
そうです。おうじゃさんといっしょです!!
https://oujasan-to-issho.connpass.com/event/290808/
ここでVoiceVoxというものの存在を知ってしまいます(笑)
https://voicevox.hiroshiba.jp/
18番を指定(指名?)すると、そこには・・・・
いやあ、頑張りましたよ、このときは
なんせ声がね〇〇りボイスなんですよ
https://koruneko.hatenablog.com/entry/2023/04/17/022837
コルネさんの記事も参考にしつつ
機能拡張というか、マニアックな方向に・・・
かつてプロレスの興業があると、電柱にポスターが貼られていました。
ハイ、昭和の時代の光景です。
ですが、あのポスターを見ると、わくわくしたものでした。
特に好きだったのが、世界最強タッグ決定リーグ戦のポスターでした。
うーん、こういう機能がプロレスゲームには欲しいよなあとか思いながら作成(笑)
基本的にギャラリー使うんですが
表示したい場合と、そうじゃない場合がある
要はテーブルにそれを指定してあげればいいんですね
[
{
id: 1,
name1:Index(coltagleague,1).name1,
name2:Index(coltagleague,1).name2,
image1:LookUp(MST,name=Index(coltagleague,1).name1).image,
image2:LookUp(MST,name=Index(coltagleague,1).name2).image
},
{
id: 2,
name1:Index(coltagleague,2).name1,
name2:Index(coltagleague,2).name2,
image1:LookUp(MST,name=Index(coltagleague,2).name1).image,
image2:LookUp(MST,name=Index(coltagleague,2).name2).image
},
{
id: 3,
name1:Index(coltagleague,3).name1,
name2:Index(coltagleague,3).name2,
image1:LookUp(MST,name=Index(coltagleague,3).name1).image,
image2:LookUp(MST,name=Index(coltagleague,3).name2).image
},
{
id: 4,
name1:Index(coltagleague,4).name1,
image1:LookUp(MST,name=Index(coltagleague,4).name1).image
},
{
id: 5
},
{
id: 6,
name2:Index(coltagleague,5).name1,
image2:LookUp(MST,name=Index(coltagleague,5).name1).image
},
{
id: 7,
name1:Index(coltagleague,4).name2,
image1:LookUp(MST,name=Index(coltagleague,4).name2).image
},
{
id: 8
},
{
id: 9,
name2:Index(coltagleague,5).name2,
image2:LookUp(MST,name=Index(coltagleague,5).name2).image
},
{
id: 10,
name1:Index(coltagleague,6).name1,
name2:Index(coltagleague,6).name2,
image1:LookUp(MST,name=Index(coltagleague,6).name1).image,
image2:LookUp(MST,name=Index(coltagleague,6).name2).image
},
{
id: 11
},
{
id: 12,
name1:Index(coltagleague,7).name1,
name2:Index(coltagleague,7).name2,
image1:LookUp(MST,name=Index(coltagleague,7).name1).image,
image2:LookUp(MST,name=Index(coltagleague,7).name2).image
},
{
id: 13,
name1:Index(coltagleague,8).name1,
name2:Index(coltagleague,8).name2,
image1:LookUp(MST,name=Index(coltagleague,8).name1).image,
image2:LookUp(MST,name=Index(coltagleague,8).name2).image
},
{
id: 14,
name1:Index(coltagleague,9).name1,
name2:Index(coltagleague,9).name2,
image1:LookUp(MST,name=Index(coltagleague,9).name1).image,
image2:LookUp(MST,name=Index(coltagleague,9).name2).image
},
{
id: 15,
name1:Index(coltagleague,10).name1,
name2:Index(coltagleague,10).name2,
image1:LookUp(MST,name=Index(coltagleague,10).name1).image,
image2:LookUp(MST,name=Index(coltagleague,10).name2).image
}
]
こんな感じですね
試合終わった後って、取材するよなあ・・・
既に満載なんですが、寝る前になると次から次へと妄想が湧いてきます
今回はやはりAI搭載がウリなので、もう一ひねりしたいところです。(いやもう十分だろ)
試合が終わったら、控室でプロレス専門誌記者が取材しますよね。
ハイ、インタビュー機能を実装してみました(笑)
意外と簡単にそれっぽくできました。
勝者と試合概要は対戦画面ですでにあるので、それを使ってロールプレイ風にプロンプトを投げる
"あなたは" & winner & "です。" & detail2 & "を踏まえてインタビューに答えてください" & TextInput3.Text &"【制限事項】選手の発言だけで返信してください。プロレスラーらしく発言してください。"
インタビューして、テキスト返して、text to speech
プロレスといえば東スポ!!
さらに、寝る前になると次から次へと妄想が湧いてきます
今回はやはりAI搭載がウリなので、もう一ひねりしたいところです。(いやもうホントにいいだろ)
プロレスといえば東スポです。
あの衝撃的な見出しにワクワクしたものです。
東スポ作るには、見出しと記事が必要です。
私の今回のやり方だと、プロンプトに対する回答は常にコレクションのFirstにあります。
ということはコレクションを表示させたままだと、プロンプトを複数投げると、変わってしまいます。
ということはどこかに格納してそれを表示させる必要があります。
上が見出しを作成して、格納。下が記事を作成して、格納。
新聞出来たら、表示するって算段です。
Set(varResponse,ChatGPT.SendUserMessage(Collect(_messages,{role:"user",content:NewsPrompt.Text}),{model:"gpt-3.5-turbo"}));
Collect(_messages,First(varResponse.choices).message);
UpdateContext({midasi:Last(_messages).content});
Set(varResponse,ChatGPT.SendUserMessage(Collect(_messages,{role:"user",content:NewsPrompt2.Text}),{model:"gpt-3.5-turbo"}));
Collect(_messages,First(varResponse.choices).message);
UpdateContext({kiji:Last(_messages).content});
UpdateContext({fight:true});
当然のことですが、マスター管理も必要
すでにレスラーの数ふくれあがってるんですが・・・マスター管理メニューも作りましょう
ということで再び益森さんの記事にお世話になりました。
https://qiita.com/Takashi_Masumori/items/a1c0f6f557605b91a596
まあ、サクっとできたんですが、アレ?これ新規登録ないのかあ
じゃあ作るか、と思ったときにまた思い出してしまうんですね・・・余計なことを
灯台下暗し
8月5日のことです。土曜日と言えば「気ままに勉強会」です。
この日は、いつもお世話になっていて、また今回のきっかけともなったヨウセイさんの登壇。
内容はさすがの内容。
ところが、私が驚いたのは最後に実演したcsv取り込みフロー
界隈の方々が驚愕したことにも驚きましたが
それよりなにより、「あ、このアプリ買ったじゃん、会社で。持ってるし(笑)」
半年前に部下が欲しいと言ったので言われるままに買わせていただいたんですね。
当時は読解など無理でしたが、今見てみると・・・ふむふむ、こういうことね
ちなみにヨウセイさんとは
昨年の春ごろ、FacebookのJapan Power Apps User groupにて
当時、初学者の私はしょーもない質問を何度も書き込む
それに懇切丁寧に答えてくれたのがヨウセイさん
昨年の秋ごろ、何か恩返しがしたいと思い、所属されている会社にメール(仕事として)
そこから仕事でもお付き合いが始まり、技術指導を受けること数回
そのたびに、ワンランク上のアプリ開発を教えていただいております。
本当にいつもお世話になりっぱなしです。
まあ最小限アップできればいいかな
まあ、もういいでしょう、このへんで(笑)
BGM、めっちゃこだわりました(笑)
*あくまで個人利用しかしておりません。
お盆明け、なんかやり始めたぞ、また(笑)
いや、だってさ登壇9月9日(土)でしょ、まだ3週間あるじゃん(笑)
もう一ひねりしないと、皆さん納得してくれませんよ・・・
やるなら徹底的にでしょ、という心の声が聞こえてきた
ということでMemorialコーナー拡充!!!
なんといっても私には2800ファイルの過去動画がある!!
なんか切り出し始めちゃったよ、時間溶ける溶ける
プロレスラーって活舌悪いんですよね
動画切り出したらmp3化は楽勝なので、じゃやってみましょうか
今度はSpeech to Textの実装です。(もはやバカ)
しかも春先にRezaさんのyoutubeみながらコネクタ作ってあったし
(いや、ちゃんとAzure使えよ、とツッコミたくなる)
うーん新キャラ作りたいときもあるよなあ
今回のテーマは生成AI搭載がウリです。(いやもういいってホント)
マスターにNewって作ったよな、あれGenerateにすっか
ということでGPT画面も追加
生成AIって文字だけじゃないよなあ
せっかくゲーム作ったんだからロゴ欲しいよなあ
いや、俺デザインセンスないし(笑)
ということでLeonard.AI使ってみました
なんとなく週刊ゴング創刊号に見えるのは、気のせい?
リーグ戦の闘う順番、巡業風にしたいよなあ
10人参加ですと公式戦は45試合
ただ並べるだけじゃ面白くない
やっぱ、興行巡業風に並べてみたい!!
ということで、組み合わせ順を追加
ClearCollect(colindex,{id:1,cell:"1-2",location:1},{id:2,cell:"3-4",location:1},{id:3,cell:"5-6",location:1},{id:4,cell:"7-8",location:1},{id:5,cell:"9-10",location:1},{id:6,cell:"1-3",location:2},{id:7,cell:"2-4",location:2},{id:8,cell:"5-7",location:2},{id:9,cell:"6-10",location:2},{id:10,cell:"8-9",location:2},{id:11,cell:"1-4",location:3},{id:12,cell:"2-5",location:3},{id:13,cell:"3-8",location:3},{id:14,cell:"6-9",location:3},{id:15,cell:"7-10",location:3},{id:16,cell:"1-5",location:4},{id:17,cell:"2-6",location:4},{id:18,cell:"3-10",location:4},{id:19,cell:"4-8",location:4},{id:20,cell:"7-9",location:4},{id:21,cell:"1-6",location:5},{id:22,cell:"2-7",location:5},{id:23,cell:"3-9",location:5},{id:24,cell:"4-5",location:5},{id:25,cell:"8-10",location:5},{id:26,cell:"1-7",location:6},{id:27,cell:"2-9",location:6},{id:28,cell:"3-5",location:6},{id:29,cell:"4-10",location:6},{id:30,cell:"6-8",location:6},{id:31,cell:"1-8",location:7},{id:32,cell:"2-3",location:7},{id:33,cell:"4-9",location:7},{id:34,cell:"5-10",location:7},{id:35,cell:"6-7",location:7},{id:36,cell:"1-9",location:8},{id:37,cell:"2-10",location:8},{id:38,cell:"3-6",location:8},{id:39,cell:"4-7",location:8},{id:40,cell:"5-8",location:8},{id:41,cell:"1-10",location:9},{id:42,cell:"2-8",location:9},{id:43,cell:"3-7",location:9},{id:44,cell:"4-6",location:9},{id:45,cell:"5-9",location:9});
ベタにやりました(笑)、いい方法あったら教えてください
うーん、リーグ戦消化したら必ず課金かぁ
リーグ戦には正直消化試合というものがある。
スキップモードもしくは自動モード欲しいよなあ(いやだからこれは遊びだよね(笑))
ということでしばし思案
Select( Parent );Set(win,RandBetween(1,2));UpdateIf(colCard,cell=Text(ThisItem.PositionY&"-"&ThisItem.PositionX),{result:If(win=1,ThisItem.bluecorner,ThisItem.redcorner),detail:"SKIP"},cell=Text(ThisItem.PositionX&"-"&ThisItem.PositionY),{result:If(win=1,ThisItem.bluecorner,ThisItem.redcorner),detail:"SKIP"})
単純にランダムに勝敗ってやつですね、まあ時短にはなります。
なんですが、これだけで進行すると、マジつまらない
改めてAIの付加価値を思い知る。
いや、つまらんって言ったよね、あんた
消化試合をポチポチするのにすら飽きてきて(おい!!)
うーん、一括消化してえよなあとかすぐに思う怠惰な私
じゃあ作るよ、作ればいいんでしょ、と半日
意外とこれ試行錯誤しましたねえ・・・数学苦手なんですよ、マジで
UpdateIf(colCard,Value(ThisRecord.PositionY)<Value(ThisRecord.PositionX),{result:If(First(Shuffle(["1","2"])).Value="1",ThisRecord.bluecorner,ThisRecord.redcorner),detail:"SKIP"});
UpdateIf(colCard As C,Value(C.PositionY)>Value(C.PositionX),{result:LookUp(colCard,cell=Text(C.PositionX&"-"&C.PositionY),result),detail:"SKIP"})
気に入らない結果は即座に塗り替えるwww
ここまでの話でおわかりのように、このゲーム権利関係は一切考慮しておりません。
なので、永遠に私の個人遊戯となります。(笑)
このゲーム、プロレスファンはどう楽しい?
夢のカードが死ぬほど実現するので、時間が溶けまくる
特にリーグ戦のランダムボタンは大会の妄想をものすごく膨らませる。
たまに超豪華メンバーになったリーグ戦は思わず開催してしまう
優勝が気になるので、優勝者確定するまでやってしまう(セーブ作れよ、おい)
*なのでスキップボタン実装した(笑)
メモリアルメニューで延々と想い出にふけりながら旅姿6人衆を聞いてしまう
類似事例で、ずっとオリンピア、ずっとUWFメインテーマとかもある(笑)
動画無限ループはさらにヤバい。
検証と通勤時間に遊んでいたらOpenAIの請求が
やればできるけど、時間溶けるからやらない機能
すでに機能的には満腹気味なので9月の時点でははやっていませんでしたが
また気が向いたら追加搭載する(かも)しれない機能
・対戦方式の拡充 ⇒柔道方式の勝ち抜き戦
⇒9月の登壇後に実装
・タイトル戦機能 ⇒シングル、タッグめんどそう
⇒9月の登壇後に実装
・試合概要の精度向上 ⇒週プロやゴングをadd your dataにぶち込んで・・・(もはやバカ)
・選手セレクトでテーマ曲⇒だから~権利関係がさあ
・対戦履歴を考慮した回答⇒一応履歴は残してあるけど、どうでもいいんじゃね
おわりに
まさか7月15日に作り始めたときにここまでのゲームが完成するとは思わなかった。
毎週末というか毎晩(笑)、大人の工作をしてものすごく楽しかった。
人生50歳を迎えて、こんなものを作れるようになるとは・・・PowerAppsすげー
そして改めて、界隈の方々に感謝申し上げます。
様々な知見を日ごろから発信していただいて本当にありがとうございます。
私は、この程度のスキルですので、真似しかできませんが、組み合わせればこんなことが出来た!!ということで閉めさせていただきます。
Special Thanks
ふらりさん
ギークフジワラさん
益森貴士さん
出戻りガツオさん
Akiraさん
おうじゃさん
コルネさん
ヨウセイさん
RezaDorraniさん
本当にありがとうございます。