2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【9999無量大数<無量大数>ダメージ】桁の暴力でぶん殴るゲームの中身を冷静に考察する

Last updated at Posted at 2025-05-17

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。
  • 長所:オーバーフロー知らず/乗除が激速。
  • 短所:加算で毎回 powlog が走り、整数精度も失う。

仮説⑤ : int + スケール指数(BigInt × Scale)

  • 発想:Python の無限整数 int を “本体”、10 の指数を “タグ” に分離。

    @dataclass
    class Scaled:
        value: int   # 任意精度整数
        scale: int   # 10 の指数
    
  • 加算scale を合わせてから value を加算。乗算は value 同士掛け、scale は足すだけ。

  • 長所:誤差ゼロ/Python ならすぐ書ける。

  • 短所:ブラウザ JS で同じ仕組みを動かすと重い。


4. どれが有力?

  1. 速度と実装コストが最優先なら、迷わず 仮説①(float 丸め)
  2. ガントラの魅力は “とにかく桁がド派手”──小さなバフが誤差で消えても誰も困らない。むしろ演出がスッキリ。
  3. とはいえ 1e308 近辺 に到達する未来も想定し、HP やボス専用で仮説② (BigFloat) を部分的に併用しておけば安全。
  4. 仮説③〜⑤ はロマン枠かなー。正確だけれど開発コスト or パフォーマンスコストが高い。インディーで作るなら試してみたい。

結論たぶん float で爆速に回しつつ、ヤバいときだけ自作 BigFloat に逃がす――この折衷案が、派手さとコストのバランス的に “一番ガントラっぽい” と私は考えます。

5. 終わりに

ガンダムトライヴはほぼ未プレイ、プログラミングもまだまだ修行中の身です。記事中に勘違いや誤植があれば容赦なく指摘してください! 9999 無量大数<無量大数> のインパクトに負けない面白い実装案、ぜひコメントでお待ちしてます!

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?