Flutter で マインスイーパーを実装
はじめに
raywenderlich に書いてあるFlutter のマインスイーパー実装(https://www.raywenderlich.com/26763909-creating-a-game-like-minesweeper-in-flutter) を自分で動かしてみましたので、記事にしてみました。考察はちょっと浅いです。
gif
codepen
github
Google Play Store
一応、申し訳程度に日本語ローカライズは自分でやっています。
また、実際のFlutterアプリでは利用されていないと思われる StatefulWidget
での実装です(もともとそうなっていて、riverpod に書き換えるまではいけなかった)。
riverpodについては下記に書きました。
マインスイーパーとは
自分がよく分かってなかったので調べてみました。
簡単に言うと、地雷が置かれていない全てのマスを開けるゲームです。
実装見てみる
MyHomePage関連
マインスイーパーのメイン画面。
-
State<MyHomePage>
から派生した _MyHomePageStateで各マスの地雷や数字の状態(size
,cells
など)を持っています。 -
_MyHomePageState#generateGrid()
で状態についての初期化を行なっている。 - 右上のNEWボタンをタップするとゲームが最初からになります。setState()で
_MyHomePageState#generateGrid()
をしています。
CellWidget関連
マス。
下記赤枠の各マスのWidget。
-
GestureDetectorのchildに指定されており、各マスのonTapやonLongPressは_MyHomePageState側で処理しています。
-
マスのonTapでマスを開く処理している。地雷があったらアラート表示したり、CellModelを更新してMyHomePage#setState()してます。setStateすると_MyHomePageState#build()が呼ばれて画面更新されます。
-
https://github.com/HikaruSato/flutter_minesweeper/blob/main/lib/my_app.dart#L228-L292
*上記のコードだとsetStateのブロック({}
部分)内に書かずに直前で状態変数を設定してからsetStateコールしていますが、{}
内に書くのと処理的には変わらならそうです。慣例的には{}
内に状態を設定するコードを書くのが良いのだと思います。
-
https://github.com/HikaruSato/flutter_minesweeper/blob/main/lib/my_app.dart#L228-L292
-
マスのonLongPressで旗をセットする処理をしていて、フラグ設定後にMyHomePage#setState()してます。
ローカライズ
下記を参考にやりました。
flutterのデバッグしてみて思うこと
AndroidとiOS両方でデバッグしてみて思うのが、ビルドがAndroidの方が基本的にだいぶ速いので、両方OSでデバッグできるようなアプリならAndroidでデバッグした方が開発効率はいいと思ってきています。
さいごに
zenn 初投稿でしたが、markdownでかけるところはいいなと思いました(noteに比べて)。
Discussion