1. イントロ ― ガンダムトライヴと桁インフレ
ガンダムトライヴはブラウザで遊べる放置系ソシャゲです。最大の特徴は “インフレが止まらない数値表記” です。2025 年のサービス終了告知イベントでは、∀(ターンエー)ガンダムが
9999 無量大数<無量大数> ダメージ/秒
という狂気のステータスを披露しました。
デカい即ち強い。
1.1 “無量大数<無量大数>”って何?
単位 | 10 の何乗 |
---|---|
京 | 10^16 |
垓 | 10^20 |
… | … |
無量大数 | 10^68 |
ガントラでは 〈無量大数〉 のように “角括弧” で同じ単位を再度掛ける独自拡張があります。
-
無量大数<無量大数>
= 10^(68×2) = 10^136 -
さらに前に付く 9999 は ≈ 9.999×10^3 なので、
9999 × 10^136 ≒ 9.999 × 10^139 ≈ 1×10^140
-
ざっくり 10^140 付近 のダメージ! こんなん草枯れるわ。
2. Python の数値型をざっくりおさらい
型 | 特徴 | 表せる桁の目安 |
---|---|---|
int |
任意精度整数。桁数はメモリ依存 | 数千桁でも平気 |
float |
64-bit IEEE-754 倍精度 | 約 ±1.8×10^308(有効桁 15〜16) |
つまり int
なら 10^140 なんて余裕で扱えます。ただし演算は遅くメモリも喰います。リアルタイムゲーム内では、もっと軽い工夫をしているはず──ということで、次章では5つの実装仮説を立てて考察してみます。
3. 巨大ダメージをどう実装する?
仮説① : 丸め付き IEEE-754 float
-
発想:とりあえず深く考えずに
float
へ放り込む。指数差が 16 桁以上離れると小さい方は自動で 0 になる特性を利用。big = 1e136 # 10^136 tiny = 8.53e32 # 8.53×10^32 res = big + tiny # tiny が消えた! → 1e136
-
長所:実装ゼロ秒/超高速。Cookie Clicker など他のインフレゲーでも採用例。
-
短所:桁差が大きいと “かすり傷” が完全に消える。
仮説② : Mantissa + Exponent(自作 BigFloat)
-
発想:
9.999 × 10^136
の “左側 4 桁+右側の指数” を自作クラスで保持。class BigFloat: def __init__(self, mant: int, exp: int): self.mant = mant # 1〜9999(固定桁) self.exp = exp # 10 の指数
-
加算:指数差が大きければ小さい方を無視。差が小さければ桁合わせして足す→正規化。
-
長所:丸め閾値を好きに設定/“9999 無量大数” のような表示が楽。
-
短所:四則演算を全部自前実装。
仮説③ : 桁バケツ方式
-
発想:万・億・兆…とタッパーを並べ、はみ出したら上位タッパにキャリー。
class BucketNum: # [万, 億, 兆, 京, 垓, …, 無量大数] def __init__(self): self.bucket = [0]*17
-
長所:誤差ゼロ/直感的なシンプルさ。
-
短所:新しい単位が出るたびにコードと DB を更新。10^67 のような “半端指数” は実装不可。
仮説④ : ログ空間 (log-space) 近似
- 発想:数そのものではなく “桁数 (log10)” を持つ。掛け算=足し算、割り算=引き算。
-
加算:
logsumexp
を使う;桁差が大きければ小さい方はほぼ 0。 - 長所:オーバーフロー知らず/乗除が激速。
-
短所:加算で毎回
pow
とlog
が走り、整数精度も失う。
仮説⑤ : int
+ スケール指数(BigInt × Scale)
-
発想:Python の無限整数
int
を “本体”、10 の指数を “タグ” に分離。@dataclass class Scaled: value: int # 任意精度整数 scale: int # 10 の指数
-
加算:
scale
を合わせてからvalue
を加算。乗算はvalue
同士掛け、scale
は足すだけ。 -
長所:誤差ゼロ/Python ならすぐ書ける。
-
短所:ブラウザ JS で同じ仕組みを動かすと重い。
4. どれが有力?
- 速度と実装コストが最優先なら、迷わず 仮説①(float 丸め)。
- ガントラの魅力は “とにかく桁がド派手”──小さなバフが誤差で消えても誰も困らない。むしろ演出がスッキリ。
- とはいえ 1e308 近辺 に到達する未来も想定し、HP やボス専用で仮説② (BigFloat) を部分的に併用しておけば安全。
- 仮説③〜⑤ はロマン枠かなー。正確だけれど開発コスト or パフォーマンスコストが高い。インディーで作るなら試してみたい。
結論:たぶん float で爆速に回しつつ、ヤバいときだけ自作 BigFloat に逃がす――この折衷案が、派手さとコストのバランス的に “一番ガントラっぽい” と私は考えます。
5. 終わりに
ガンダムトライヴはほぼ未プレイ、プログラミングもまだまだ修行中の身です。記事中に勘違いや誤植があれば容赦なく指摘してください! 9999 無量大数<無量大数> のインパクトに負けない面白い実装案、ぜひコメントでお待ちしてます!