MTGCounter: カードゲーム (MTG) 用ライフカウンターアプリ

初めてのAndroid用アプリケーションであるMTGCounterを開発し,Google Playで2020-05-23から公開したので紹介する。

概要

MTGCounterは趣味のトレーディングカードゲームのMagic: The Gathering (MTG) のライフ管理のためのAndroidのアプリケーションとなっている。

MTGの基本的なゲームのルールとして,対戦相手のライフを0にすることが勝利条件となっている。このライフの自分と相手の増減を管理するためのツールアプリがMTGCounterというわけだ。

基本的な特徴は以下のとおりだ (Google Playでの説明文を引用)。

MTGCounterの特徴
  • 多くの種類のカウント (ライフ,毒,経験,エネルギー,マナ,ストーム,ドロー)
  • ライフ履歴の追跡
  • ゲーム履歴の保存と閲覧
  • 統率者への対応
  • 古いAndroidへの対応 (Android 4.0.3 APIレベル15以上)
  • オープンソース (https://github.com/senooken/MTGCounter)
  • 無広告

MTGは基本的に自分と対戦相手の2名でプレイするのが基本ルールとなっている。しかし,昨今では4人でプレイする統率者戦というルールが人気である。しかし,統率者では管理する情報が通常の2人対戦よりも多い。

MTGのライフカウンターアプリは既にいくつも公開されている。ただ,統率者戦に対応しており,ライフ履歴の保存に対応しているものはない印象だった。

丁度Androidアプリ開発について2020-01から勉強しており,自分のAndroidアプリ開発の題材として,難しすぎず適切に感じたため開発に挑戦した。

実際の開発は,GitHubのコミット履歴で確認できる通り,2020-03-13から始めており,2020-05-19にコミットしたv1.0.0の状態で,Google Playに公開した。その後,ドキュメントやビルド環境を整備したv1.0.1を2020-06-13に公開してひとまず完成という状況だ。

動作要件

GitHubのREADME.mdに記載した通り,以下の条件を動作要件としている。

  • Target: Android 4.0.3+ (API Level 15+)
  • Language: Java SE 6+
  • IDE: Android Studio 3.5.3
  • OS: Ubuntu 18.04

特に複雑なことはしていないため,より多くのAndroidで動作するように対象バージョンを4.0.3以上とした。現在市場に出回っているほとんどのAndroid端末で動作可能だ。

実際の開発はUbuntu 18.04上のAndroid Studio 3.5.3で行った。対象Androidのバージョンを4.0.3 (API level 15+) としたため,使用言語はJava SE 6となっている。

ソースコードのライセンスはCC0であり,著作権をほぼ放棄している。リポジトリーをダウンロード後,Android Studioで該当ディレクトリーを開くと誰でもビルド・開発できる。

アプリのサイズは1.3 MB程度と軽いので,ストレージ容量を圧迫することはないだろう。

使い方

使い方もGitHubのREADME.mdに英語で記しているが,こちらでも簡単に説明する。

インストール

まず,MTGCounterをGoogle Playからダウンロードしてインストールする。その他,GitHub Releases上でAPKファイルを公開している (MTGCounter-x.x.x.apk) ので,これをダウンロードしてインストールする。

ホーム画面

インストール後,アプリランチャー (launcher) を選んで起動する。

以下のようにホーム画面が表示される。

home home.example
ホーム画面

画面上部のテキストボックスがゲームのタイトルとなっており,ここにゲームの情報やメモを記入する。

その下のスペースにライフの変更履歴がターン毎に表示される。

画面下部のラジオボタン群で変化させるプレイヤーと項目をチェックし,画面下端の [-]/[+] ボタンで増減させる。

増減結果はラジオボタンすぐ上の [Life/P/Ex/En] 欄または [Commander] 欄に反映される。こちらの2行は選ぶことで直接数字を編集することもできる。ターンを終了して中の増減が確定したら,[COMMIT] ボタンを選ぶと,データが確定され,上部のリストに追加される。

リストに追加されたデータは,左端の [Turn/Time] の列以外は,選ぶことでいつでも数字を編集できる。

ラジオボタンの下2行 ([Mana]/[Other]) はその場で一時的にカウントするためのものであり,こちらは [COMMIT] で保存されない。

管理対象は,画面に表示されている通り,以下の情報だ。

  • 4プレイヤー分のライフ,毒カウンター,経験カウンター,エネルギーカウンター
  • 4プレイヤー分の統率者ダメージ
  • 一時カウント用のマナ,ストーム,ドロー,その他

通常のゲームプレイでカウントが必要なものは一通り揃えたつもりだ。

メニュー画面

ホーム画面右上の [︙] を選択すると,オプションメニューを表示できる。

menu
オプションメニュー

それぞれ以下の役割となっている。

  • [About]: アプリの情報を表示。
  • [New Game]: 新しいゲームの開始。
  • [Save]: 現在のゲームを履歴に保存。
  • [History]: 保存した履歴を閲覧。
  • [Commander Life]: 統率者戦用に全プレイヤーの初期ライフを40に変更。

入力間違いなどで,ライフ履歴をリセットしたい場合には [New Game] を選ぶか,アプリを再起動する。

[Save] を選ぶと,入力中のライフ履歴が保存される。

履歴

オプションメニューから [History] を選ぶと,[Save] で過去に保存したライフ履歴のリスト画面が表示される。

history history.delete
[History] 画面

リストには,履歴ID,保存した日時,タイトルが表示されている。該当のリスト項目を選ぶと,保存したゲーム履歴を表示できる。

ロングタップすると,[Delete] のメニューが表示され,選択した履歴を削除できる。その他,下端の [DELETE ALL] ボタンを選ぶと,履歴データを全て削除できる。

ゲーム履歴

[History] 画面からリスト項目を選ぶと,個別のゲーム履歴の閲覧画面が表示される。

history.game
[Game History] 画面

ホーム画面と異なり,閲覧専用で編集できないことに注意する。

感想

今回生まれて初めて自分一人で一からAndroidアプリを作って,Google Playに公開するところまでやりきった。その感想としては,思っていた以上に面倒くさいというのが第一だった。

特に,今回はTitleなど入力データを変更できるようにEditTextを多用しているのだが,これが思っていた以上に癖があり,EditTextを思うように制御するのに時間がかかった。

その他に,データの保存機能を実装する都合,Javaのシリアライズ/デシリアライズ機能を試したり,Intent経由でのデータのやり取りなどをやったのだが,ここもデータ型のキャストに関する不整合などがあり,面倒くさかった。

また,今回のアプリの特徴の一つである統率者戦対応だが,プレイヤーごとに全統率者戦ダメージを管理する必要があり,画面上への表示スペースの調整に難儀した。

レイアウトをどうするかというのがアプリの使い勝手に影響する都合,初期のバージョンから何回もレイアウトを変更する羽目になった。

例えば,image/versionに過去の画面イメージを保存しているのだが,途中までプレイヤーごとにデータ入力欄を設けていた。

v0.5.0

その他,完成間近で見た目のデザインを決めるにあたって,フォントサイズなど画面構成やそれに付随する処理も見直すことになり,後半に大きく修正が入った。

また,当初は一般的なスマートフォンの画面サイズだけを考えていたのだが,リリース間際に他の画面サイズのデバイスを試すと,配置のずれが発生した。元々は,ターン毎にコメントを書き残せるようにしていたのだが,マルチデバイス対応する際に,配置調整が難しくなるため,なくなくこのコメント欄をまるごと削除することにした。

また,Google Playへの公開に関しても,画像を用意したり,鍵でアプリに署名したりなど,細かい所がいちいち面倒くさくて,正直あまりやりたくないなと思ってしまった。

結論

自分史上初のAndroidアプリであるMTGCounterについて紹介した。

自分一人で一から作ってGoogle Playに公開するところまで行った。2019年12月で仕事を辞めて,2020年からの約半年間の勉強期間で何か一つ他人に胸を張って見せられるアプリ開発を目標にしており,なんとか一つ目標を果たした。

ただ,この紹介文書含めて思っていた以上に一つ一つの工程が面倒くさくて,仕事をしながら片手間でやるのは無理だなと素直に痛感した。個人アプリ開発者の方は素直にすごいなと尊敬する。

一通り作って,流れがわかったので,この経験を他のアプリ開発や次の仕事獲得に役立てていきたい。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です