四年に一度の将棋オリンピックダブルス
プロダクトについて
一言で言うと...
2vs2の将棋!
完全にランダムな味方と、高度な読み合いを行い勝利を目指す
ただし2vs2ゆえの様々な特殊ルールが...
- 1ターンに2個の駒が動かせる!

- 同じ駒を選ぶと手が合成される!

- 合成された手で、自分の駒の位置に移動すると駒が重なる!

- 合成された手で、駒が場外に行くと相手の駒になる!
あなたの隣にいるのは、勝利へ導く軍師か、はたまた地獄へ道連れにする悪魔か。
技術系
めちゃくちゃ正統派な技術構成にしました。
アーキテクチャ図

使用技術
言語
フレームワーク
- フロントエンド: Next.js
- バックエンド: SpringBoot
インフラ周り
- Terraform
- Github Actions
- Azure
- Docker
技術こだわりポイント
- ドメイン駆動設計
将棋の仕様はただでさえ複雑ですが、それを2vs2にしたことにより特殊仕様が膨大に増えました。
これらの仕様をゲームに落とし込むため、丁寧にドメインを設計しました。
なお全て崩壊しました。
- Java,SpringBootを用いたバックエンド開発
GoやPHPほどメジャーではない(と思う)Javaでバックエンドサーバを開発しました。大規模開発がお得意のJavaの便利な構文でドメインクラスを作成し、SpringBootの依存性注入でRedisの操作やJSONの変換などを実装することができました。
- Redisを用いたセッションとゲーム管理
Redisというメモリ上で動作する高速なDBを使用しゲームを保存することにより、途中で切断されても再接続を可能にしました
- Terraformを用いたIaC管理。
属人性を排除したインフラ構築。Terraform applyするだけでいいので変更も簡単。
- フロントエンド/バックエンドをコンテナ化。
Docker-composeで管理することで、ローカルでもフロント-バック間通信のテストを容易化。
- Azure Container Appsを用いたコンテナ運用。
Azure Container Appsは通信を分散してくれるLoadBalancerもついてるし、コンテナオーケストレーションみたいなスケーリングも自動でやってくれる(裏でk8sが動いてる)から、手軽にスケーラビリティのあるインフラ環境をつくれる。嬉しいです。
- WebSocketを用いたリアルタイム通信。
プレイヤーの選択をミリ秒単位で反映させる。
- 将棋らしさとモダンを兼ね備えたデザイン
将棋らしさを損なわずに現代のWebアプリっぽいデザインを行いました。アニメーションもぬるぬる
動きます動く予定でした
将棋ロジックこぼれ話
移動、駒の配置などの行動適用
- 2人の行動を合成させる関係上、様々な競合が発生します。
- 基本的に決定が早かったユーザから先に行動します。
- 手駒から駒を配置する場合はターンの最後に駒を配置します。
- こうする理由は、1ターンに2人が同じ座標に駒を置く場合のみ、駒を重ねるようにするためです。
- こういった例外処理が多すぎて泣きそうでした :(