こんにちは。
今回からモンスターを集めて育成するような簡単なWebゲームを題材にして、 Pythonを使ったAPIづくりに挑戦してみようと思っています。
ただ、自分でもちょっと不安があるというか、「ちゃんと動くものができるのかな…」と心配しながら書き始めています。
1. なぜモンスター育成ゲームを作りたいのか
- 子どもがポケポケとポケモンブレンダにハマっているから。
- 単純なCRUD(Create, Read, Update, Delete)操作だけだと、どうしても飽きてしまいそう…
- ゲーム的な要素(ガチャや育成、進化など)があると、DB設計がちょっと複雑になって面白いかな。。
- 将来的にはバトル機能とかも入れたら、APIのリクエスト・レスポンスを可視化するシーケンス図がにぎやかになるかな…?と思って
僕は、ゲームのAPI設計を本格的にやったことはないんです。だから「ほんとに作りきれるのかな……」って不安が大きいです。
でも、このシリーズを書きながら勉強して、形にしていきたいと思います。 もし変なところがあったらコメントで教えてもらえると助かります。。。
2. そもそもなんでAPIにするの?
フロントエンドからモンスター管理ができたり、将来的にスマホアプリでも使えるようにすることを考えると、バックエンドをAPI化しておいた方が拡張しやすいかなと思ったからかな。。
まあ、Pythonを勉強中ということもあって、バックエンド寄りのイメージがあるので、、、 フレームワークはFastAPIを使おうと思います。
また、FastAPIで実装すると、標準でOpenAPI(Swagger)仕様の自動ドキュメントとかが使えるので、ドキュメントづくりが楽になりそう…という期待もあります。
FastAPIを選んだ理由
1. 速くてシンプルらしい
なんだかんだ言って、FastAPIは速いってよく聞きます。 サーバーサイドの性能はまだそこまでこだわらなくても良いかもですが、「ある程度サクサク動いてくれそうなフレームワークを使いたいな」と思い、FastAPIを選びました。正直、Django REST FrameworkとかFlaskとかでもいいのかな…ってまだ迷いはあるんですけど、とりあえずFastAPIを試してみる感じです。
2. 型ヒント(Type Hints)を活かせる
FastAPIは、Pydanticを使ったリクエスト・レスポンスのバリデーションが強力だと聞きました。Pythonで型をしっかり書くのはあまり慣れていないんですが、これを機に型ヒントを積極的に使ってみようかなと。 ただ正直、最初は型の書き方を間違えまくりそうなのでドキュメントを見ながら「え、これで合ってる?」って一人で苦戦しそうです。。。
3. ドキュメント生成や自動補完が便利
FastAPIで書いていると、エディタ上で型に応じた自動補完が効いてくれたり、/docs でSwagger UIや /redoc でReDocが自動生成されるのが魅力です。 将来的にはReDocでAPIドキュメントを整備する予定なんですが、実はそれもちゃんとやったことがなくて…。 「見よう見まねで設定してみたら、よく分からないエラーが出た!」ってなりそうなので、試行錯誤しながら記事に残せればなと思ってます。
3. 今後の連載予定
まだ完璧に固まってはいないんですが、だいたい6回くらいの連載を想定しています。
- (今回) 要件とフレームワークの選定
- Mermaidでシーケンス図を書いてみる(モンスターを手に入れるフローとか)
- MermaidでER図を作ってSQLiteテーブル設計
- 環境構築やフォルダ構成
- 実際にAPIを作ってみる(
モンスター管理・ユーザー管理など) (最終回)Redoc & Geminiを使ってユニットテストやドキュメント整備- 実際にAPIを作ってみる(モンスター管理)
- (新最終回)実際にAPIを作ってみる(ガチャ実装)
あとはデプロイ!という所まで行きたいですね。
…という感じで書いてみようかなと考えてます。 でも、実際に進めてみると「うわ、うまくいかない」「ちょっと飽きてきた…」ってなる可能性も大いにあるので、そこは自分なりにがんばって完走したいです。
4. まとめ
モンスター育成ゲーム用API、ちゃんと作れるか不安だけどFastAPIで挑戦してみます。「ドキュメント生成」「テスト」「DB設計」あたりが勉強するポイントになりそう。引き続き、Mermaidでのシーケンス図やER図を描きながら、手探りでやっていく予定です。
次回はMermaidを使ったシーケンス図の作成に挑戦します。 多分最初は図がぐちゃぐちゃになると思いますが、お付き合いよろしくお願いします…!
少しでも「やれそうかも?」という気持ちが出てきたら嬉しいです。 僕も自信満々ではないですが、とにかく進めてみるしかないので、次回こそはもうちょっと踏み込んだ話を書きたいなと思います。それではまた!