30代SEの個人開発ログ

30代SEが、個人開発・ゲーム制作・技術学習の試行錯誤を記録するブログです。

AIに教えてもらいながら『Slay the Spire』を遊んだら、6年前に気付かなかったこのゲームの本当の面白さが見えてきた

『Slay the Spire』を最近、かなり遊んでいます。

実はこのゲーム、最近買ったわけではありません。

購入したのは2020年です。

それなのに、これまでの総プレイ時間は約8時間でした。

面白くないと思っていたわけではありません。ただ、何を考えて遊べばいいのかがよく分からず、何度かプレイしてはやめる、ということを繰り返していました。

カードを選ぶ。

敵と戦う。

マップを進む。

レリックを拾う。

それぞれの仕組みは何となく分かるのですが、

「結局、何を考えるゲームなんだろう?」

という部分が自分の中でつながっていなかったのだと思います。

そんな状態だったのですが、今回ChatGPTに横でアドバイスをもらいながらプレイしてみることにしました。

すると、少しずつゲームの仕組みがつながり始めました。

そして気付けば、システムを理解し始めてからわずか3日で約10時間プレイしていました。

2020年に買ってから約6年間で8時間しか遊んでいなかったゲームを、3日でそれ以上遊んでしまったことになります。

今回は、AIを使いながら『Slay the Spire』を遊ぶことで、このゲームの本当の面白さにようやく気付けた、という話を書いてみたいと思います。


最初は「どのカードが強いのか」すら分からなかった

今回プレイを始めたとき、私はほぼ初心者の状態でした。

キャラクターはアイアンクラッド。

ゲーム開始時に提示される選択肢からして、

「これ、どれを選べばいいんだ?」

という状態です。

そこで画面を写真に撮ってChatGPTに送ってみました。

すると、

  • なぜ最大HPアップが安定なのか
  • なぜ初期レリックを交換するのは初心者にはリスクがあるのか
  • それぞれの選択肢にはどんなメリット・デメリットがあるのか

というところから説明してくれました。

単に、

「これを選べ」

ではなく、

「なぜそれを選ぶのか」

を教えてもらえたのが大きかったです。

その後も、

「このルートはどれがいい?」

「この3枚ならどのカードを取る?」

「このイベントはどっち?」

「休憩と鍛冶、どっち?」

と、その都度画面を送りながら進めていきました。

かなり贅沢な攻略本です。

しかも、自分が今プレイしている状況に合わせて答えてくれます。


カードは「強いものを全部取ればいい」わけではなかった

最初に大きく考え方が変わったのが、カード報酬でした。

敵を倒すと3枚の中から1枚選べます。

初心者の私は当然、

「カードが増える=強くなる」

と思っていました。

そのため、強そうなカードがあれば毎回取った方がいいと思っていました。

ところが、ChatGPTから、

「カードは毎回取る必要がない」

と教えてもらいました。

最初はかなり意外でした。

カードゲームなのに、カードを取らない方がいいことがあるのです。

理由は単純で、デッキの枚数が増えすぎると、本当に使いたいカードを引けなくなるからです。

例えば今回、

「大暴れ」

というカードを取りました。

使うたびに、その戦闘中のダメージが増えていくカードです。

さらに、

「頭突き」

という、捨て札のカードを山札の一番上に戻せるカードを取りました。

すると、

大暴れを使う

頭突きで大暴れを戻す

次のターンにまた大暴れを引く

さらに大暴れが強くなる

という流れが作れます。

ここで初めて、

「カード単体の強さを見るゲームじゃないんだ」

ということが分かりました。

カードとカードの組み合わせによって、デッキ全体に役割を持たせるゲームなのです。


「同じカードを何枚も取れば強い」とも限らない

これも面白かったところです。

例えば大暴れが強かったので、

「大暴れを2枚、3枚と増やした方が強いのでは?」

と思いました。

しかし、大暴れは少し特殊です。

1枚の大暴れを何度も使うことで、そのカード自身が戦闘中に成長していきます。

つまり、

大暴れを3枚入れる

よりも、

大暴れ1枚を何度も引けるようにする

方が強い場合があります。

そこで、

  • 頭突きで戻す
  • ポンメルストライクでカードを引く
  • 不要なカードを削除する

といったことの価値が見えてきました。

こうなると、カードを見る目が少しずつ変わってきます。

「このカードは強いか?」

ではなく、

「このカードは今のデッキに必要か?」

と考えるようになります。

これは『Slay the Spire』の面白さを理解するうえで、かなり大きな変化でした。


ショップの「カード削除」の意味も初めて分かった

以前の自分なら、ショップに入ったら新しいカードやレリックばかり見ていたと思います。

ところがChatGPTから、

「ストライクを削除しよう」

と何度か言われました。

最初は、

「せっかくカードがあるのに、わざわざお金を払って減らすの?」

という感覚でした。

ですが、これも考え方は同じです。

弱いカードを減らせば、

大暴れ
頭突き
ポンメルストライク
ゴーストアーマー

といった、使いたいカードを引ける確率が上がります。

つまり、カード削除はデッキを弱くしているのではなく、

強いカードを引きやすくすることで、デッキ全体を強くしている

ということです。

ここまで理解すると、

「デッキ構築」

という言葉の意味がようやく実感できてきました。


マップも「一番安全な道」を選べばいいわけではない

カード以外にも、マップの見方が変わりました。

最初は、

「できるだけ敵と戦わず、HPを減らさずにボスへ行けばいい」

くらいに思っていました。

ところが、エリートを倒せばレリックが手に入ります。

レリックは、その後の戦闘を大きく有利にしてくれます。

つまり、HPには、

「減らしてはいけない体力」

という意味だけではなく、

強くなるために使える資源

という側面があります。

HPに余裕があるならエリートへ行く。

減ってきたら休憩所へ向かう。

すでに十分HPがあるなら、休憩ではなく鍛冶でカードをアップグレードする。

こうした判断が全部つながっていることが分かってきました。

カードゲームだと思っていたのですが、実際には、

カード、HP、ゴールド、レリック、ルートのすべてを使って、少しずつ強い状態を作っていくゲーム

なんですね。


「大暴れ+頭突き」ができたとき、急に楽しくなった

今回、一番「なるほど」と思ったのは、大暴れを中心にデッキが形になっていったときでした。

大暴れは使うたびに強くなります。

そこに頭突きを組み合わせる。

さらにポンメルストライクでドローする。

防御面ではゴーストアーマーや武装を入れる。

そして、不要になってきたストライクをショップで削除する。

一つひとつは単純な効果です。

でも、それらが組み合わさると、

「自分のデッキはこうやって戦う」

という方針が生まれます。

この瞬間、

『Slay the Spire』が単なる、

「出てきたカードを使って敵を倒すゲーム」

ではなくなりました。

自分で小さな仕組みを作り、その仕組みを完成させていくゲーム

に見えるようになりました。

たぶん、これが私が6年間気付いていなかった『Slay the Spire』の面白さでした。


それでも2層のボスには勝てない

ゲームの仕組みが分かってきたからといって、急に上手くなったわけではありません。

むしろ、

「なぜ負けたんだ?」

という疑問が増えてきました。

1層は以前より安定して突破できるようになりました。

しかし、2層になると苦しくなります。

そして、2層のボスで何度も負けます。

ここまで来て、今度は、

「自分のプレイを振り返ってみたい」

と思うようになりました。

幸い、『Slay the Spire』にはプレイ履歴があります。

最終的なデッキやレリック、どこで倒されたのかなどを確認できます。

これを見れば、

「カードを取りすぎたのか」

「デッキの方向性が途中でバラバラになったのか」

「防御が足りなかったのか」

「2層のボスを倒すための火力が不足していたのか」

といったことを振り返れそうです。

ここまで来ると、ただクリアするだけでなく、

自分がなぜ負けたのかを考えること自体が面白くなってきました。


AIは「正解を教える」より「考え方を教える」のが面白い

今回ChatGPTを使っていて感じたのは、

AIに全部決めてもらうだけでは、ここまで面白くならなかっただろうな

ということです。

「このカードを取れ」

だけだったら、私は言われた通りにボタンを押して終わっていたと思います。

でも、

「今のデッキにはこのカードが足りない」

「これは単体では強いけど、今の構成とは噛み合わない」

「エリートを倒すとレリックが手に入るので、HPに余裕がある今なら挑戦する価値がある」

「カードを取らないという選択もある」

と理由を聞いていくことで、自分でも少しずつ判断できるようになりました。

AIを、

ゲームを代わりにプレイしてくれる存在

として使うのではなく、

横でゲームの考え方を説明してくれるコーチ

として使う。

これが今回かなり面白かったです。


2020年に買って8時間。理解し始めてから3日で10時間

改めてプレイ時間を見ると、自分でも少し笑ってしまいます。

『Slay the Spire』を購入したのは2020年。

そこから約6年間で遊んだ時間は、わずか約8時間でした。

それが今回、ChatGPTを使ってシステムを理解し始めてからは、

3日で約10時間

プレイしています。

単純にゲームの内容が変わったわけではありません。

変わったのは、

自分がゲームを見る解像度

でした。

「カードを出して敵を倒すゲーム」

だったものが、

「限られた選択肢から、自分なりの勝ち筋を作るゲーム」

に見えるようになった。

同じゲームなのに、理解できるようになっただけで、こんなにも面白さが変わるものなのかと驚いています。


ゲームで分からないことをAIに聞くのは、かなり面白い

攻略情報を検索すれば、強いカードやデッキの情報はいくらでも出てきます。

もちろん、それも便利です。

ただ今回のように、

「今この3枚が出たけど、どれがいい?」

「今のデッキならどう考える?」

とAIに聞く方法は、攻略サイトとは少し違った体験でした。

自分の状況に合わせて説明してもらい、その理由を聞きながら進める。

すると、

「そういう考え方をするゲームなのか」

という部分が少しずつ分かってきます。

ゲームの攻略にAIを使うというより、

ゲームのルールの奥にある考え方を理解するためにAIを使う

という感覚に近いかもしれません。

そして今は、プレイするたびに、

「今回のデッキは何がダメだったんだろう?」

と考えるのが楽しくなっています。

6年前に買ったゲームを、今になってこんなに楽しむとは思っていませんでした。

まだ2層のボスを安定して倒すことすらできません。

でも、以前とは違って、

「次はどう改善しよう?」

と思えるようになっています。

たぶん『Slay the Spire』は、勝つことだけではなく、

自分の判断を振り返り、次の1プレイで少しだけ良い判断ができるようになること

まで含めて面白いゲームなのだと思います。

しばらく、このゲームから抜け出せそうにありません。

ChatGPTとCodexを使って、自分が本当に使いたいAndroidアプリを作りました

前回、Androidアプリとして「シンプル日付計算機」をリリースしました。

そのときの一番の目的は、まずは 「Androidアプリを作って、Google Playに公開する」 ことでした。

KotlinもAndroid開発もほとんど分からない状態から、ChatGPTを使いながら開発を進め、最終的にGoogle Playへ公開するところまでたどり着きました。

そして今回、2本目のAndroidアプリとして作ったのが、

「ボクシングラウンドタイマー」

です。

今回は前回とは少し目的が違います。

単にもう1本アプリを作るのではなく、自分が普段本当に使いたいアプリを作りたいと思いました。

自分がボクシングジムに通っているからこそ作りたかったアプリ

私は普段、ボクシングジムに通っています。

ボクシングでは、

  • 準備
  • ワーク
  • 休憩
  • 次のラウンド

というように、一定時間ごとに区切ってトレーニングすることが多いです。

もちろん、ラウンドタイマーのアプリ自体はすでにたくさんあります。

そのため今回は、最初から「こういう機能を全部入れよう」と考えたわけではありません。

まずは実際にいくつかの類似アプリを使ってみて、

自分にはどんな機能が必要なのか

どういう操作感なら使いやすいのか

を確認しました。

その結果、自分に必要なのはそこまで多機能なアプリではないと分かりました。

欲しかったのは、

  • 準備時間を設定できる
  • ワーク時間を設定できる
  • 休憩時間を設定できる
  • セット数を設定できる
  • よく使う設定をプリセットとして保存できる
  • フェーズが切り替わるときに音や振動で分かる
  • トレーニング中に画面が消えない
  • 今どのフェーズなのかがひと目で分かる

といった機能です。

そのため今回は、機能を増やすことよりも、自分が実際にボクシングジムで使いやすいことを優先しました。

必要な機能だけに絞りました

個人開発をしていると、

「この機能もあった方がいいのでは」

「せっかくだからこれも追加しよう」

と、つい機能を増やしたくなります。

ただ、今回はあえてシンプルにしました。

履歴管理はありません。

統計機能もありません。

クラウド同期もありません。

アカウント機能もありません。

広告も入れていません。

自分がトレーニング中に使うことを考えると、そういった機能は必須ではありませんでした。

アプリを開いて、

設定して、

スタートする。

それくらいシンプルな方が、自分にとっては使いやすいと感じました。

今回からCodexを使いました

今回の開発で大きく変わった点のひとつが、Codexを使い始めたことです。

前回は主にChatGPTに、

「こういう機能を作りたい」

「このエラーは何ですか」

「このUIをどう直せばいいですか」

と相談しながら開発を進めていました。

今回はそれに加えて、実際のコード修正をCodexにかなり任せました。

Android Studioは、Visual Studio CodeのようにCodexをIDE内の画面として使う形ではなかったため、Codexは別のターミナルで起動して使いました。

開発中は、

  • Android Studioでコードや実機の動作を確認する
  • 別で立ち上げたCodexに修正内容を指示する
  • Codexがプロジェクト内のコードを変更する
  • Android Studioに戻ってビルドや動作確認を行う

という流れで進めました。

最初は、Android StudioとCodexを別々に立ち上げるのは少し面倒かもしれないと思っていました。

ただ、実際に使ってみるとかなり快適でした。

Codexに、

「この機能を追加してください」

「今のUIは崩さないでください」

「この部分だけ最小限修正してください」

と伝えると、プロジェクト全体を見ながら修正してくれます。

体感としては、実装作業が圧倒的に楽になりました。

AIの提案をそのまま採用しないことも大切でした

一方で、今回の開発を通して改めて感じたのが、

AIの提案をそのまま受け入れればいいわけではない

ということです。

分かりやすい例が、時間設定画面です。

準備時間やワーク時間などを設定するUIについて、最初にChatGPTから提案されたのは、

「+」「−」ボタンを押して値を増減する方式

でした。

確かに実装は分かりやすいです。

ただ、実際に触ってみると使いづらく感じました。

例えば、3分から10分に変更したい場合、何度もボタンを押す必要があります。

秒数の変更も同じです。

トレーニング前にサッと設定したいアプリとしては、少し面倒でした。

そこで、ホイール形式で値を選択するUIに変更しました。

指で回して値を選べるため、こちらの方が明らかに操作しやすくなりました。

この変更は、実際に自分で触ってみたからこそ気づけたことだと思います。

AIは案を出してくれます。

コードも書いてくれます。

ただし、

そのUIが本当に使いやすいのか

その機能が本当に必要なのか

を判断するのは、人間側です。

AIを使うほど「何を作りたいか」が重要になります

今回の開発では、ChatGPTとCodexをかなり活用しました。

アイデア整理から、

画面構成、

実装、

エラー対応、

Google Play公開準備まで、

多くの場面でAIに助けてもらいました。

ただ、AIを使う量が増えるほど、

自分の中に「どういうアプリにしたいか」という軸が必要になる

とも感じました。

AIに、

「もっと機能を増やしてください」

と頼めば、いくらでも増やせます。

「UIをもっと豪華にしてください」

と頼めば、いくらでも変えられます。

しかし、それを続けていると、自分が本当に欲しかったアプリから離れていく可能性があります。

今回のアプリでは、

自分がボクシングジムで実際に使う

という明確な基準がありました。

そのため、

「これはいらない」

「これは使いにくい」

「これは残したい」

という判断がしやすかったです。

AIを活用するうえでは、こうした取捨選択がとても重要だと感じました。

2本目をリリースして感じたこと

前回は、

「Kotlinが分からなくても、AIを使えばAndroidアプリを公開できる」

という経験が大きかったです。

今回はそこからさらに一歩進んで、

「自分の生活の中で実際に使うアプリを作れる」

という感覚を持つことができました。

これは自分の中ではかなり大きな変化でした。

個人開発というと、

「何を作れば売れるか」

「何が流行っているか」

を考えがちです。

もちろん、それも大切だと思います。

ただ、まずは

自分が困っていること

自分が普段使いたいもの

から作ってみるのも、とても良いと思いました。

少なくとも自分自身がユーザーなので、使いやすさについては妥協しにくくなります。

今回作った「ボクシングラウンドタイマー」も、これから実際にジムで使いながら、必要であれば少しずつ改善していく予定です。

AIのおかげで、実装そのもののハードルはかなり下がりました。

だからこそこれからは、

何を作るか

どういう使い心地にするか

という部分が、より重要になっていくのだと思います。

ボクシングラウンドタイマー プライバシーポリシー

制定日:2026年8月31日

「ボクシングラウンドタイマー」(以下「本アプリ」といいます)は、ユーザーのプライバシーを尊重し、個人情報の保護に配慮して運営しています。

1. 取得する情報について

本アプリでは、氏名、メールアドレス、位置情報、端末識別情報などの個人情報を取得しません。

また、ユーザー登録やログイン機能もありません。

2. アプリ内に保存される情報について

本アプリでは、ユーザーが作成したタイマープリセットの情報を端末内に保存します。

保存される主な情報は以下です。

  • プリセット名
  • 準備時間
  • ワーク時間
  • 休憩時間
  • セット数

これらの情報は、本アプリの機能を提供するために使用されます。

本アプリ独自のサーバーや外部サービスへ送信することはありません。

3. インターネット通信について

本アプリは、現在の仕様ではインターネット通信を必要としません。

ユーザーの情報を外部サーバーへ送信する機能はありません。

4. 広告・アクセス解析について

本アプリでは、広告配信サービスおよびアクセス解析サービスを使用していません。

そのため、広告目的や分析目的でユーザー情報を第三者へ提供することはありません。

5. 端末の機能・権限について

本アプリでは、タイマーのフェーズ切り替えを通知するため、端末の振動機能を使用します。

そのため、以下の権限を使用します。

  • 振動機能(VIBRATE)

この権限は、タイマーの通知にのみ使用します。

カメラ、マイク、位置情報、連絡先、ストレージなどの権限は使用しません。

6. 効果音について

本アプリでは、準備・ワーク・休憩・終了などのタイミングを分かりやすくするため、効果音を再生する場合があります。

効果音の再生は端末の音量設定等に従います。

7. データのバックアップについて

本アプリ内に保存された設定やプリセット情報は、Android OSのバックアップ機能の対象となる場合があります。

バックアップの実施や復元については、Android端末およびGoogleアカウントの設定に依存します。

8. 第三者への情報提供について

本アプリは、ユーザーの個人情報を取得しないため、個人情報を第三者へ販売・提供することはありません。

ただし、法令に基づく開示要請がある場合など、法令上必要となる場合を除きます。

9. 未成年者の利用について

本アプリは、特定の年齢層を対象とした個人情報収集機能を持っていません。

未成年のユーザーについても、個人情報を収集する機能はありません。

10. プライバシーポリシーの変更について

本アプリの機能追加や仕様変更などに伴い、本プライバシーポリシーを変更する場合があります。

重要な変更がある場合は、本ページの内容を更新します。

11. お問い合わせ

本アプリおよび本プライバシーポリシーに関するお問い合わせは、Google Play ストアに掲載されている開発者連絡先までお願いいたします。

Kotlinを知らない自分が、ChatGPTをフル活用してAndroidアプリをGoogle Playに公開した話

先日、Androidアプリ「シンプル日付計算機」をGoogle Playに公開しました。

https://play.google.com/store/apps/details?id=com.uuc1h.datecalculator

今回のアプリ開発では、ChatGPTをかなり積極的に使いました。

「AIにコードを書いてもらってアプリを作った」というだけではありません。

アプリのアイデア出しから、仕様検討、UI設計、Android Studioの使い方、エラー対応、Google Play Consoleへの登録、プライバシーポリシー、ストア掲載用画像の作成、そしてリリース作業まで。

アプリを公開するまでのほぼすべての工程でChatGPTを使いました。

ちなみに、自分は今回の開発を始めた時点で、Kotlinについてはほぼ何も分からない状態でした。

それでも最終的には、自分で作ったAndroidアプリをGoogle Playに公開するところまでたどり着くことができました。

今回は、その過程で感じた「AIを使ったアプリ開発」について書いてみます。

最初は「何を作るか」からChatGPTに相談した

今回、最初から「日付計算機を作ろう」と決めていたわけではありません。

まずChatGPTに、

「できるだけ短期間で作れるAndroidのツールアプリには、どんなものがあるか」

というところから相談しました。

いくつかアイデアを出してもらい、その中から自分で

「日付計算機ならシンプルだし、最初のAndroidアプリとして良さそう」

と判断しました。

ここで感じたのが、AIの使い方として重要なのは、

AIに決めてもらうのではなく、AIに選択肢を増やしてもらう

ということです。

ChatGPTはいろいろな案を出してくれます。

ただし、その中のどれを採用するかは人間が決めます。

今回も、ChatGPTが出した案をそのまま受け入れたわけではなく、

「これはいらない」
「これは自分でも作れそう」
「この機能なら使う人がいるかもしれない」

と、自分で取捨選択しました。

Kotlinが分からなくてもAndroidアプリは作れた

開発環境はAndroid Studioを使いました。

最初はAndroid Studioすらインストールされていなかったので、

  • Android Studioのインストール

  • プロジェクト作成

  • エミュレータの起動

  • 「Hello Android」の表示

という、本当に最初の最初からChatGPTに聞きながら進めました。

そして今回使用した言語はKotlinです。

ただ、自分はKotlinの経験がありません。

Jetpack Composeについても知識はありませんでした。

それでも、

「この画面を作りたい」
「開始日をカレンダーから選べるようにしたい」
「開始日を含めるチェックボックスを追加したい」
「結果をカード形式で表示したい」

といった形で、実現したい内容をChatGPTに伝えることでコードを作ってもらいました。

エラーが出たときも、Android Studioの画面をスクリーンショットでChatGPTに見せます。

すると、

「このimportが足りない」
「ここはMaterial3ではなく別の依存関係が必要」
「この警告は無視してよい」

など、原因と修正方法を教えてくれます。

昔だったらエラーメッセージをGoogle検索して、Stack Overflowや技術ブログを何記事も読んでいたと思います。

今は、画面そのものをAIに見せて質問できます。

この違いはかなり大きいと感じました。

ただし、AIの言いなりでは良いアプリにならない

今回の開発で一番感じたのはこれです。

AIがコードを書いてくれるからといって、人間側が何も考えなくてよいわけではありません。

むしろ逆でした。

人間側で、

「このアプリをどうしたいのか」

というイメージが明確であるほど、AIをうまく使えます。

例えば、今回の日付計算機では、

  • 開始日

  • 終了日

  • 開始日を含めるか

  • 日数

  • 週数+日数

  • 月数+日数

  • 年数+日数

を表示する「期間計算モード」を作りました。

さらに、

「開始日から100日後は何月何日なのか」

といった計算をするために、

  • 開始日

  • ○日後

  • 開始日を含めるか

を指定する別のモードも追加しました。

これはAIが勝手に考えた仕様ではありません。

自分の中で、

「こういうアプリだったら使いやすい」

というイメージを作り、それをChatGPTに伝えて実装してもらっています。

AIの提案を見て、

「これは必要」
「これは不要」
「ここはこう変えたい」

と判断するのは人間です。

もし何も考えずに、

「日付計算アプリを作って」

とだけAIにお願いしていたら、たぶん自分が本当に作りたいアプリにはならなかったと思います。

UIは紙と鉛筆で考えた方が早いこともある

UIについても面白い経験がありました。

最初はChatGPTにUIを提案してもらっていました。

ただ、

「もう少しこうしたい」

という感覚を文章だけで伝えるのが難しいことがあります。

そんなときは、紙に鉛筆で画面を書きました。

ボタンはここ。

日付はここ。

計算結果はここ。

という感じで、雑なスケッチを書きます。

そして、その紙をスマートフォンで撮影してChatGPTに見せます。

すると、

「このレイアウトならComposeではこう作れます」

と、こちらの意図に近いUIへ修正してくれます。

アプリアイコンも同じでした。

自分で紙に、

  • カレンダー

  • 「31」

というアイコン案を鉛筆で書き、それを撮影してAIに渡しました。

そこからAIにデザインを整えてもらい、Google PlayやAndroid Studioで使える画像へ仕上げました。

AI時代になって、逆に

紙と鉛筆でイメージを書く

という昔ながらの方法がかなり強いと感じました。

人間はイメージを描く。

AIはそれを実際のUIや画像に変換する。

この役割分担はかなり相性がいいです。

プログラムの知識以上に「何を作りたいか」が重要になった

今回の経験だけを見ると、

「プログラミングの知識はもういらないのでは?」

と思う部分もあります。

少なくとも、小規模なAndroidアプリを作り始めるハードルはかなり下がったと感じています。

Kotlinを知らなくても、ChatGPTに説明してもらいながら開発を進められました。

一方で、

「じゃあ人間は何をすればいいのか」

というと、

実現したいものを明確にイメージすること

だと思います。

例えば、

「使いやすい画面にして」

では曖昧です。

それよりも、

「ラベルは左揃え」
「結果の値は右揃え」
「結果はカードで囲う」
「計算結果は文字を大きくする」
「プライバシーポリシーは画面の一番下」

というように具体的に伝えた方が、当然AIも良いものを作ります。

AIにとって重要なのは、プログラムを書く技術よりも、

こちらが何を作りたいのかを正確に伝えること

なのかもしれません。

開発よりGoogle Playへの公開の方が大変だった

実際にやってみて意外だったのが、

アプリそのものを作るより、Google Playで公開するまでの作業の方が大変だった

ことです。

Google Play Consoleでは、

  • デベロッパー情報

  • 本人確認

  • プライバシーポリシー

  • データセーフティ

  • 広告の申告

  • コンテンツレーティング

  • 対象年齢

  • 健康アプリの申告

  • 広告ID

  • ストア掲載情報

  • アプリアイコン

  • フィーチャーグラフィック

  • スクリーンショット

  • 内部テスト

  • AABの作成

  • 電子署名

  • 配信国

など、かなり多くの設定が必要でした。

正直、アプリのコードを書く作業よりこちらの方が疲れました。

ただ、この部分でもChatGPTが非常に役立ちました。

Google Play Consoleの画面をスクリーンショットで送り、

「ここは何を選べばいい?」
「この警告は対応が必要?」
「このメールアドレスは公開される?」
「対象年齢はどこにチェックする?」

と聞くだけで、一つずつ進めることができました。

凍結されていたGoogle Play開発者アカウントも復旧できた

さらに今回は、昔作ったGoogle Playのデベロッパーアカウントが使えると思ってログインしたところ、アカウントが制限された状態になっていました。

本人確認が期限内に完了していなかったことなどが原因で、開発者プロフィールとアプリが削除された状態でした。

ここが今回一番大変だったかもしれません。

Google Paymentsのプロフィールを確認したり、住所を確認したり、再審査を申請したり、本人確認書類を提出したりしました。

もしChatGPTがなかったら、

「これはどこから復旧すればいいんだ?」

という段階で諦めていた可能性があります。

画面をChatGPTに見せながら、

「これは何を意味しているのか」
「次にどこを押すのか」
「再審査には何を書けばいいのか」

を一つずつ確認しました。

最終的にはアカウントを復旧できました。

この経験で感じたのは、

AIはプログラミングだけに使うものではない

ということです。

むしろ、こういう複雑なサービスの設定画面を一緒に進める用途の方が、AIのありがたさを強く感じました。

公開に必要な画像もAIに作ってもらった

Google Playでは、アプリ本体以外にも画像が必要です。

例えば、

  • アプリアイコン

  • フィーチャーグラフィック

などがあります。

今回はこれらもAIに作ってもらいました。

自分が鉛筆で書いたアイコン案を元にAIでデザインを作り、それをPhotopeaでGoogle Play指定のサイズへ調整しました。

フィーチャーグラフィックも、

「シンプル日付計算機」
「期間を計算」
「○日後を計算」

というアプリの特徴が伝わるようにAIで作成しました。

Google Play ConsoleにはAI生成アセットを申告する項目もあるので、そこではAIを使った画像として申告しています。

つまり今回のアプリは、

コードだけでなく、公開用の画像までかなりAIの力を借りています。

最終的にGoogle Playへ公開できた

こうして最終的に、

「シンプル日付計算機」

をGoogle Playへ公開することができました。

アプリはこちらです。

https://play.google.com/store/apps/details?id=com.uuc1h.datecalculator

機能はシンプルです。

  • 開始日と終了日から期間を計算

  • 日数

  • 週数+日数

  • 月数+日数

  • 年数+日数

  • 開始日から○日後の日付を計算

  • 開始日を含める/含めない計算

という日付計算用のAndroidアプリです。

AIを使ったアプリ開発で感じたこと

今回、Kotlinを全く知らないところからAndroidアプリを作り、Google Playへ公開しました。

そこで一番感じたのは、

AIのおかげで「プログラムを書ける人」しかアプリを作れない時代ではなくなってきた

ということです。

ただし、

「AIが全部やってくれる」

とも思いません。

AIに何を作らせるか。

どの提案を採用するか。

どのUIが使いやすいか。

何を削るか。

どういうアプリにしたいのか。

ここは人間が考える必要があります。

むしろAIがコードを書けるようになったことで、

人間側の「何を作りたいのかを考える力」が以前より重要になった

ように感じます。

今回の開発では、

人間がイメージする

AIに伝える

AIが実装する

人間が確認する

違えば修正を指示する

という流れを何度も繰り返しました。

このやり方なら、プログラム経験が少ない人でもAndroidアプリ開発にかなり入りやすくなったと思います。

そして個人的には、アプリそのものを作る部分以上に、

「Google Playへ実際に公開する」部分でAIが非常に役立った

ことが印象に残りました。

アプリを作って終わりではなく、実際にストアへ公開する。

そこまでAIと一緒に進められたことで、以前より個人開発のハードルはかなり下がったと感じています。

今後も、小さなツールアプリをいくつか作ってみようと思っています。

シンプル日付計算機 プライバシーポリシー

uuc1h(以下「開発者」といいます)は、Androidアプリ「シンプル日付計算機」(以下「本アプリ」といいます)における利用者情報の取り扱いについて、以下のとおりプライバシーポリシーを定めます。

1. 収集する情報について

本アプリは、利用者の個人情報および個人を識別できる情報を収集しません。

また、本アプリでは以下のような情報についても、収集、保存、外部への送信を行いません。

  • 氏名
  • メールアドレス
  • 電話番号
  • 住所
  • 位置情報
  • 端末識別情報
  • 広告識別子
  • 利用履歴
  • その他の個人情報

2. 日付・日数情報の取り扱いについて

本アプリでは、日付計算を行うために、利用者が開始日、終了日、日数などの情報を入力または選択します。

これらの情報は、日付計算を行うために利用者の端末内でのみ処理されます。

入力または選択された日付や日数が、開発者のサーバーや第三者のサーバーへ送信されることはありません。

3. 外部サービスについて

本アプリでは、利用者情報を収集するためのアクセス解析サービス、広告配信サービス、その他の外部サービスを使用していません。

4. 情報の第三者提供について

本アプリは利用者の個人情報を収集しないため、利用者情報を第三者へ提供または共有することはありません。

5. データの保存について

本アプリは、利用者が入力または選択した日付や日数などの情報を、開発者が管理する外部サーバーへ保存することはありません。

日付計算に必要な情報は、本アプリ上で計算処理を行うためにのみ使用されます。

6. 子どものプライバシーについて

本アプリは、年齢を問わず利用できる一般的な日付計算ツールです。

本アプリでは、子どもを含む利用者から個人情報を意図的に収集することはありません。

7. プライバシーポリシーの変更について

本アプリの機能変更、利用するサービスの変更、法令またはGoogle Playのポリシー変更などに伴い、本プライバシーポリシーを変更する場合があります。

重要な変更がある場合は、本ページを更新することによりお知らせします。

8. お問い合わせ

本アプリおよび本プライバシーポリシーに関するお問い合わせは、以下のメールアドレスまでお願いいたします。

開発者:uuc1h
メールアドレス:uuc1h.apps@gmail.com

9. 制定日

2026年8月12日

ChatGPTを使いながら、ポケモン金銀の相性チェッカーをNext.jsで作って公開した

最近、レトロゲームを遊ぶときに使える自分用ツールを作りたくなり、ポケモン金銀向けの相性チェッカーを作りました。

公開したものがこちらです。
https://pokemon-type-checker-for-goldsilver.hh08.workers.dev/

作ったもの

ポケモン金銀に登場するポケモンのタイプ相性を確認するためのツールです。
ポケモンを選ぶと、そのポケモンに対して各攻撃タイプが何倍になるかを一覧で確認できるようにしています。

なぜこれを作ったのか

わざわざ作らなくても、この手のツールはごまんとあります。
それでも作ろうと思ったのは、「自分にとって役立つものを作る」と決めていたからです。

これまで技術書やUdemyなどでいろいろ勉強してきましたが、教材どおりに作ることはできても、そこから先に自分なりに広げることがなかなかできませんでした。そして、勉強したこと自体に満足して終わってしまうことも多かったです。

そこで今回は、「勉強のために何かを作る」のではなく、「自分にとって本当に役立つものを作る」ことを出発点にしました。そうすることで、学んだ内容を実際の形に広げてみたかったのです。

実際にやってみると、この進め方はかなり良かったと思います。
作る目的がはっきりしているので、途中で詰まっても調べる意味があるし、何より完成したときの満足感も大きかったです。

ChatGPTの使い方

今回の開発ではChatGPTをかなり使いました。
ただしコード生成を丸投げではなく、機能を小さく分けて少しずつ作るようにしました。

あくまで設計の主導権は自分が持つことを意識し、分からない部分はその都度確認しながら進めました。その結果、「仕組みを理解しながら動くものを作れた」という感覚があります。

今後は、コード生成そのものをAIが担う場面がますます増えていくと思います。
その中で重要になるのは、中身を理解したうえで適切に指示を出し、必要に応じて修正や判断ができる人間だと感じています。SEとして生き残るうえでも、その力は大きな指標になると考えています。

技術構成

今回使った技術はかなりシンプルです。

  • Next.js
  • React
  • TypeScript
  • Cloudflare Workers

データは、ポケモン一覧とタイプ相性表を JSON / TypeScript の形で持たせて、画面側で計算して表示しています。サーバー側で複雑な処理をする必要がないので、小さなツールとしてはこの構成がちょうどよかった。

作ってみて感じたこと

自分は39歳で、仕事ではExcelやドキュメントを扱う場面も多く、個人でWebツールを1本作って公開するような機会はほとんどありません。それでも今回、自分で仕様を決めて、小さく作って、最後に公開までできたのはかなり良い経験になりました。

教材をなぞる学習も大事ですが、自分で使いたいものを決めて作ると、学習と実装がちゃんとつながる。今回はその感覚を久しぶりに強く持てました。

今後も、こうした「自分にとって役立つ小さなツール」を少しずつ形にしていきたいと思います。

TypeScriptのtypeとinterfaceの違いを整理してみた【ユニオン型も解説】

こんにちは。今日は TypeScript の typeinterface の違い、そしてよく一緒に出てくる ユニオン型 についてまとめます。
自分の勉強メモも兼ねて書いているので、これから TypeScript を学ぶ人の参考になれば嬉しいです。

typeinterfaceの共通点
  • どちらも 型を定義するために使える
  • オブジェクトの形を表したり、再利用性を高めることができる

一見すると「どっちを使っても同じじゃない?」と思うかもしれませんが、実は特徴が少し違います。

typeの特徴
  • ユニオン型やプリミティブ型のエイリアスに使える
  • &(インターセクション)を使えば型を合成できる
  • ただし 宣言マージはできない

例:ユニオン型の定義

export type AccountingType = 
  | "収入" 
  | "支出(現金)" 
  | "支出(クレジットカード)";

この場合、AccountingType は 3つの文字列のどれか を意味します。

interfaceの特徴
  • 主にオブジェクトの形を表現するのに使う
  • extends で他のインターフェースを継承できる
  • 宣言マージが可能 → 後から同じ名前で再定義すると自動で結合される

例:オブジェクト型の定義

export interface Accounting {
  id: string;
  date: string;
  amount: number;
  content: string;
  type: AccountingType;
  category: IncomeCategory | ExpenseCategory;
}
宣言マージの違い

interface の場合

同じ名前で再宣言すると自動で結合されます。

interface Accounting {
  id: string;
  amount: number;
}

// 後から拡張できる!
interface Accounting {
  memo: string;
}

const a: Accounting = {
  id: "1",
  amount: 1000,
  memo: "昼ごはん代"
};

あとから自由にフィールドを追加できるのが大きな特徴。

type の場合

同じ名前で再宣言はできません。

type Accounting = {
  id: string;
  amount: number;
};

// 再宣言するとエラー
// type Accounting = { memo: string };

// 拡張するなら & を使う
type AccountingWithMemo = Accounting & { memo: string };

const b: AccountingWithMemo = {
  id: "2",
  amount: 2000,
  memo: "家賃"
};

type は その場で閉じた型を作るイメージです。

ユニオン型とは?

ユニオン型は「どれかひとつ」を表す型です。
| を使います。

let value: string | number;

value = "こんにちは"; // OK
value = 123;         // OK
value = true;        // エラー

今回の例だと、IncomeCategory | ExpenseCategory がまさにユニオン型です。
「収入カテゴリ」か「支出カテゴリ」のどちらか、という意味になります。

まとめ

type

  • ユニオン型やプリミティブ型に強い
  • 拡張するときは & を使う

interface

  • オブジェクトの型を表すのに便利
  • 宣言マージがあるので後から拡張できる

ユニオン型

  • 「型の選択肢を列挙」できる便利な仕組み

僕の場合、

  • 固定的に使う型 → type
  • 将来拡張したい型 → interface

という感じで使い分けています。
TypeScript の型は慣れると本当に強力なので、ぜひいろいろ試してみてください。