四年に一度の将棋オリンピックダブルス

https://github.com/shii-park/2vs2shogi

Next.js

Azure

Java

Redis

Terraform

隣の他人が俺の飛車を勝手に成らせた。2vs2の混沌将棋。

山田優吾

國廣蓮斗

推しアイデア

味方と完全ランダムマッチング!会話、チャット禁止の完全読み合い将棋です。もし味方と同じ駒を選ぶと、手が合成されます!

作った背景

頭が悪くても将棋を楽しみたい!そんな思いを叶えるため。

推し技術

フロント/バックをコンテナ化して、AzureのAzure Container Appsで動かすことでお手軽スケーリングをしてます。 Redisでセッション管理してるので速い?

プロジェクト詳細

四年に一度の将棋オリンピックダブルス

プロダクトについて

一言で言うと...

2vs2の将棋!

完全にランダムな味方と、高度な読み合いを行い勝利を目指す

ただし2vs2ゆえの様々な特殊ルールが...

  • 1ターンに2個の駒が動かせる! image
  • 同じ駒を選ぶと手が合成される! image
  • 合成された手で、自分の駒の位置に移動すると駒が重なる! image
  • 合成された手で、駒が場外に行くと相手の駒になる! image あなたの隣にいるのは、勝利へ導く軍師か、はたまた地獄へ道連れにする悪魔か

技術系

めちゃくちゃ正統派な技術構成にしました。

アーキテクチャ図

image

使用技術

言語

  • Java
  • React / TypeScript

フレームワーク

  • フロントエンド: 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人が同じ座標に駒を置く場合のみ、駒を重ねるようにするためです。
  • こういった例外処理が多すぎて泣きそうでした :(

山田優吾

@YugoYamada