このエントリーは、[学生さん・初心者さん大歓迎!]Xamarin Advent Calendar 2016の19日目です。
はじめに
タイトルの通り、Xamarinの超初心者です。
未だにPCLとSharedの違いがイマイチ理解できていません。。。
鋭意勉強中です!
そんな私がXamarinを勉強し始めた時に作ったアプリ(と言っていいものかはさておき)に題材とした「ライフゲーム」を紹介します。
ライフゲームとは
Wikipedia先生によると生命の誕生、進化、淘汰などのプロセスを簡易的なモデルで再現したシミュレーションゲームとのことです。
詳しくは、ライフゲームを見てもらえるとわかると思います。
なぜライフゲームなのか?
一番の理由は、私の大学の時の卒論の専攻が複雑系工学と言うものだったからです。
複雑系とは、個々がそれぞれの役割を担い関係しあうことで全体的に本来の機能を実現するもので、川の流れや交通渋滞などがそれに当てはまります。
その入り口の勉強としてライフゲームを扱っていて、そのシミュレータをJavaのSwing(10年以上も前なので許して)で作って、JavaやSwingについて学ぶことができたので、Xamarinを勉強する時にも同様に用いました。
コード
ちょっと前に作ったきりメンテしないものをGithubに上げています。
Xamarin.Formsを使っているものの、XAMLは使っていなく、またnuits.jpさんやかずきさんが紹介されているXamarinいいぞ!を実感できるネタは一切使っていなくて、Xamarin超初心者な感じ満載です。
あと、画面切れていたりでレイアウトもダメダメです。
今後、PrismやXAMLを勉強しながら改良していこうと思っています。
ライフゲームを用いてよかったこと
グリッドレイアウトを使うことができる
初心者からするとグリッドレイアウトはあまり馴染みがないけど、一定数のパネルを碁盤状に配置する必要があるので、グリッドレイアウトは必須です。
最初からレイアウトを意識することでレイアウトに対する知識を自然と身に付けることができるので良いなと思っています。
ボタン以外のクリックイベントを制御する方法を知ることができる
ライフゲームの中心である生と死をLabelを用いて表現しています。ライフゲームは最初のパターンによって終わりが異なるため、アプリを起動しながらパターンを変更できることが必要で、そのためにはLabelを直接クリックすることにより白と黒を入れ替えることができなければなりません。
そのために、否が応でもでもボタン以外のクリックイベントのやり方を学ぶことができます。
スレッド(非同期)について学ぶことができる
ライフゲームに限った話ではなく、画面からのイベントで裏の処理を制御する時は基本的に(というか絶対)非同期処理を用います。なぜなら、処理を行なっているスレッドがそのスレッドを止めるという処理を実行することができないからです。SwingだとWorker Threadを使ったりします。
処理の制御だけではなく、裏で動いてる処理が画面の更新を行うときも処理とは別スレッド(Xamarinはメインスレッドじゃないとダメみたい)で行う必要があるため、このようなアプリを作成する時はスレッドによる非同期処理は必須です。
必須なので、こちらも否が応でも学ぶことができます。
今後オセロを作れる
完全に見た目トリガーな選択肢です。。。
「碁盤状に何かが配置されていてクリックイベントで色が変わり、裏の処理で画面の更新をする」というほとんど共通していて「同じじゃね?」って言われても反論できません。。。
しかも、ライフゲームのロジックの中にある「周りのセルである状態のものを計算する」というロジックまでほぼ一緒。。。
ですが、オセロは世間一般的に名の知れたゲームで、ほとんどの人がルールを知っているので、アプリを作ってしまえば誰かと遊ぶことができます。
Azure使ってサーバ用意すれば、ネットワーク対戦も夢じゃないし、今流行りのAIとの対戦もできる!
とか、ちょっと無理矢理な感じ醸し出していますが、プログラミングやその他関連ツールは、使い倒した時間に比例してスキルはアップしていくものだと思いますので、
その一つとして、ライフゲームからのオセロはアリなのかなと思います。
最後に
色んな方々が「Xamarinはいいぞ!!」って言うのを聞いて、「自分もやりたいな。でも何作ろう?」って感じている人は少なくないと思っています。(私自身そうでした。。。)
このエントリーが、そう言う人たちの役に少しでも立つことができたら幸いです。
あと、記述内容に間違いなどありましたら適宜ご指摘いただけると幸いです。
追記(2017/03/16)
Prism.Fomrs
や XAML
を使ってリメイクしてみました。
あと、前回は Java
っぽい書き方でしたが、C#
に近づいた気がします。
まだまだ勉強中なので、PRとまではいかなくても「こうした方がいいよ」なことがありましたら、コメント頂けると幸いです。