1はじめに考えること
「好きなファイターを見つけたい」を約束にする
SCAN BATTLE VSは、スマホ1台を交代で使う2人対戦ゲーム。バーコードを読み取り、力・守備・スピード・運にポイントを配分し、通常攻撃・必殺技・防御の順番を考えます。
「気に入ったバーコードを取っておきたい」という希望から、同じ番号なら何度読んでも同じファイターになる約束を決めました。毎回違う結果なら、見つけたお気に入りを再び呼び出せません。
発見して、工夫して勝つ
身近なものからキャラを見つけ、配分や作戦を変えて試せる。
何を固定し、何を選べる?
キャラと色は番号から決める。ポイント配分、必殺技、3手の順番は自分で選べる。
こうした約束を仕様(しよう)と呼びます。システムエンジニアは、希望を聞いて、使う場面と必要な動きを整理します。
2使う道具
道具に任せる仕事、自分で決める仕事
カメラの映像からバーコードを読む部分には、ZXingというライブラリを使います。ライブラリは、ほかの人も使えるようにまとめたプログラムです。キャラを選ぶルールやダメージの計算は、ゲーム独自のプログラムで作ります。
| 道具 | 何をする? |
|---|---|
| React / TypeScript | 準備、コマンド選択、バトルの画面とルールを作る。データの種類の間違いも見つけやすくする。 |
| ZXing / カメラAPI | 許可されたカメラの映像からバーコードの番号を読み取る。 |
| HTML / CSS / SVG | 文字、ボタン、配置、色、光のアニメーションや紋章を作る。 |
| Canvas 2D | バトル中の光の粒子、盾、斬撃、衝撃波を描く。 |
| Web Audio | 波形を組み合わせて短い効果音を作る。初期設定はOFF。 |
| ローカルストレージ | お気に入りやバトル速度を、そのブラウザに保存する。 |
| Vite / Vitest | 開発と公開用ファイルの作成、動作の自動チェックを支える。 |
ゲームの処理はブラウザ内で動きます。公開するHTML・画像・プログラムはXServerから届けます。
3番号をファイターに変える
同じ材料に、同じ計算をする
最初に、全角数字や空白を整理し、桁数と最後のチェック用の数字を確かめます。12桁のUPCは、先頭に0を付けた13桁のEANと同じ番号として扱います。書き方が違っても、同じ商品なら同じ結果にしたいからです。
番号とルールの版を、ハッシュという一定の計算で数値に変換します。その数値から、まずレア度、次にそのレア度のキャラ、最後に色を決めます。同じ番号・同じルールなら結果も同じ。この性質を決定論的と呼びます。
レア度の割合は「毎回のくじ」とは少し違う
今の設定はRが60%、SRが35%、SSRが5%。多くの異なる番号を試したときの分かれ方を、この割合に近づけています。特定の番号を読み直しても、別のレア度へ引き直すことはできません。少数の番号では、この割合ぴったりになるとも限りません。
基本キャラ32種類と色3種類で96通り。画像は基本キャラごとに用意し、色違いは画面上で色合いを変えて表現します。
もう少し知りたい:ルールを変えたいとき
公開済みのルールは版を残し、新しい設定は別の版として追加する設計です。割合やキャラの一覧を変えると、同じ番号でも結果が変わる可能性があります。お気に入りには番号だけでなく、使ったルールの版も保存します。
バーコードから商品の価格や名前を調べているわけではありません。数字をキャラクター選びの材料にしています。
4算数をゲームにする
計算の答えだけでなく、途中も見せる
配分できるポイントはRが10、SRが12、SSRが14。これは特性を加える前に、自分で配れる合計です。基本キャラの特性を適用し、その後に色の特性を適用して、実際の能力を決めます。
特性には「守備+2」のような加算だけでなく、倍率や能力の入れ替えもあります。順番によって答えが変わるため、いつ適用するかを決めます。倍率の小数は切り捨て、能力は0未満にならないようにします。
ダメージのミニ実験
攻撃側の力は6、守備側の守備は3。会心・ミス・回避を省いた、命中したときの計算を試します。
4は今のルールの基本攻撃値。防御すると半分にし、小数は切り上げます。この模型ではカウンターを省いています。
ゲームでは能力の変化やダメージの計算を、折りたたんだ説明で確認できます。「なぜその答え?」を見られると、次の配分や作戦を考える材料になります。
5状態と順番
秘密の3手を、どうやって進める?
通常バトルでは、両プレイヤーが通常攻撃・必殺技・防御を1回ずつ並べます。選び終わるまで相手の順番を表示しません。スマホ1台を渡し合うので、交代画面で次の人に操作を知らせます。
3手目までが1ターン。次は3アクションを選び直せます。防御が効くのは、相手と同じ手番です。スピードの高い方から攻撃し、同速ならターンごとに先攻を交代します。HPが0になったら、残りの行動は止めます。
ミス、回避、会心は順番に判定します。ミスなら回避や会心の判定へ進みません。防御して生き残ったときは、今のルールでは10%で受けたダメージを返すカウンターが発動します。
もう少し知りたい:オートバトル
3アクションの並べ方は6通り。オートでは両者がそれぞれランダムに順番を決め、演出後も操作を挟まず次のターンへ進みます。相手の順番を読んで有利な並びにする処理はありません。通常と同じ計算や確率を使います。
対戦はHP30から開始し、最大20ターン。それでも決着しなければ残りHPで比べ、同じなら引き分けです。
6見やすさとわくわく
答えを決めてから、かっこよく見せる
戦闘の計算を先に行い、「誰が何をして、何ダメージだったか」という記録を作ります。アニメーションはその記録を順番に再生します。演出をスキップしても、音をOFFにしても、もう一度ダメージを抽選しません。
結果を計算する
順番、ミス、回避、会心、HPの変化を記録する。
結果を伝える
記録に合わせて絵を動かし、光・文字・音を出す。
グレートパンチは炎の拳、シールドバッシュは六角形の盾、スピードラッシュは青い連続斬撃。名前と色だけでなく形や動きも変えます。バーコードを読んだときは光の粒子を集め、光が弾けてファイターが現れる演出にしました。
速さと情報の量も、遊びやすさになる
バトルが速すぎると状況を追いにくいため、「ふつう」を初期設定にし、「はやい」も選べるようにしました。スマホではファイター紹介を読み取り欄の上に置き、特性も一緒に表示します。能力の詳しい計算は折りたたみ、必要なときに読めます。
効果音は最初OFF。ONにする操作から再生を準備し、OFF・スキップ・一時停止では音を止めます。端末の「動きを減らす」設定にも対応し、派手な動きを省いても文字で結果を伝えます。
キャラクターから、歴史にもつながる
3頭身のモンスター戦士には、世界の偉人から着想した装備や装飾があります。人物の名前・簡単な説明・参考リンクを紹介欄で読めます。キャラと人物の対応を一覧で管理し、追加時にモチーフが重ならないか確認できます。
7確認と公開
「一度動いた」から「安心して変えられる」へ
同じ番号で同じ結果になるか、3アクションが重複しないか、OFFのときに効果音を作らないか。こうした約束を、決めた条件で繰り返し確かめるのが自動テストです。
- 番号のチェック値が違うときに、間違いを伝えられる。
- 同じ番号の生成結果が、変更で意図せず変わらない。
- 秘密のコマンドが交代画面で見えない。
- オートは一時停止でき、再開後は決着まで進む。
- 演出を動かしても、戦闘の乱数を余分に使わない。
前に動いていた機能を変更後も確かめることを、回帰テストと呼びます。楽しさや読みやすさは人の目でも確認します。スマホ幅でボックスと親の幅を比べると、左に寄ってしまう問題を見つけられます。
公開した後も、確かめる
自分のPCで確認する「ローカル」でテストとビルドを行い、GitHubへ変更を保存します。公開環境の「本番」では、前の版をバックアップしてから切り替えます。公開後に必要なファイルが届くか、ローカルの成果物と内容が一致するかも調べます。
もう少し知りたい:お気に入りとキャッシュ
お気に入りは、そのブラウザのローカルストレージにあります。別端末へ自動で移ったり、ブラウザのデータ削除後に戻ったりはしません。
画像などをブラウザが再利用するしくみを「キャッシュ」と呼びます。更新したプログラムのファイル名を変え、古い版が残りにくいようにしています。


