はじめに
「相手の駒が見えない状態でチェスをしたらどうなるんだろう?」
そんな思いつきから、Blind Chess(ブラインドチェス)というゲームを個人開発しました。
通常のチェスとは異なり、相手の駒配置が視覚的に確認できないため、
記憶・推理・直感を頼りにプレイする変わり種なゲームを目指しました。
現在はベータ版として公開しており、最低限遊べる状態まで実装できたため、開発内容や構成についてまとめます。
>>ベータ版Blind chessはこちら<<
※「Blindfold chess(目隠しチェス)」という伝統的な形式が存在しますが、本作はすこし異なり、
UI上の制約として相手の駒が見えないといルールで開発しています。
ルール
①2手目までは全ての駒が見えます。通常のチェスゲームと同じようにオープニングします。
②3手目から、相手の駒が隠されます。ゴースト(丸い点のこと)は相手の駒が位置していることを指します。
③駒の食い合いが発生した場合、右上に駒と点数が表示されます。
技術スタック
今回の構成は以下の通りです。
フロントエンド
- Next.js(React / TypeScript)
ルール管理
- chess.js
思考エンジン
- Stockfish(Python → WASM)
デプロイ
- Vercel
開発支援
- Codex(設計・リファクタリング・実装補助)
新しく得た知見
当初は以下のような構成でした。
- Next.js(フロント)
- Python API(FastAPI)
- サーバーでBot思考
この構成だと、以下の課題がありました。
- 同時接続が増えるとサーバー負荷が高い
- デプロイ先を分ける必要がある(バックエンドのデプロイをどうしよう…)
特に「Botの思考処理」はCPU負荷が高いと学びました。
初めての個人開発+Vercelでのデプロイということもあり、なるべくシンプルに公開したいと思いました。
WASMにすることでフロント完結構成に変更
そこで、思考エンジンをPython → WASMに変換し、ブラウザ上で動かす構成に変更しました。
Next.js + chess.js + Stockfish(WASM)
これにより
- サーバー不要(バックエンド削除)
- 同時アクセスの影響を受けにくい
- Vercel単体でデプロイ可能
というメリットが得られました。
Stockfishは強すぎる問題と難易度調整の難しさ
今回、思考エンジンにはStockfishを使用していますが、これが想像以上に強くて初めは全く勝てませんでした。
一応レートを低い設定にできるのですが、やっぱり強いし Botがこちらの手を「見えてない」体にすることが難しくて、人間らしいミスを打ちにくい課題があります。
単純に強さを下げると意味の分からないミスをするし、逆に少し強めると一気に歯が立たなくなります。
このあたりは今後の課題として、より自然なプレイ体験に近づけたいです。。
まとめ
今回、Blind Chessを個人開発する中で、
- ゲームロジックの設計
- WASMの活用
- デプロイ構成の最適化
など、多くの学びがありました。
まだまだ改善したい点はたくさんありますが、ひとまず「遊べる状態で公開できた」ことが大きな一歩だと思っています!
最後まで読んでいただきありがとうございました 🙏

