0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AIでMinecraftのシード値マップツールを作った話【C言語→WebAssembly→ブラウザ】

0
Last updated at Posted at 2026-03-15

AIでMinecraftのシード値マップツールを作った話【C言語→WebAssembly→ブラウザ】

はじめに

Minecraftのシード値から構造物(村、要塞、海底神殿など)の座標を知りたい——そんな時に使えるWebツール「MC Seed View」をAIと一緒に個人開発しました。

技術的なポイントは、Minecraftのワールド生成アルゴリズムをC言語で再現し、WebAssemblyにコンパイルしてブラウザ上で動かしていることです。

🔗 サイト:https://mcseedview.com/


どんなツール?

シード値を入力すると、そのワールドに生成される構造物(村、寺院、要塞、海底神殿など)の座標がマップ上に表示されます。

  • 🌍 完全にブラウザ上で動作 — サーバーに通信しない
  • 🌐 8言語対応 — 日本語・英語・韓国語・中国語(簡体/繁体)・タイ語・ベトナム語・インドネシア語・ヒンディー語
  • 📱 スマホ対応
  • Minecraft公式と同じアルゴリズム — cubiomesライブラリを使用

技術スタック

cubiomes (C言語) → Emscripten → WebAssembly (.wasm)
                                      ↓
                        ブラウザ上のJavaScriptから呼び出し
                                      ↓
                           Canvas/HTMLでマップ描画

なぜ C → WebAssembly?

Minecraftのワールド生成アルゴリズムを正確に再現するために、cubiomes というC言語のオープンソースライブラリを使用しています。

これをEmscriptenでWebAssemblyにコンパイルすることで、ブラウザ上でネイティブに近い速度でワールド生成の計算ができます。

// bridge.c — C言語とJavaScriptの橋渡し
int enhanced_viable_check(Generator *g, int struct_id, int block_x, int block_z) {
    // 高解像度バイオームサンプリング(Scale=1, Y=63)で
    // 「ゴースト構造物」問題を解決
    int b = getBiomeAt(g, 1, block_x, 63, block_z);
    // 構造物ごとに有効なバイオームかチェック
    ...
}

JavaScriptからはEmscriptenのAPIを通じてWASMの関数を呼び出します:

// WASM関数をJSから呼び出す
const Module = await CubiomesModule({
    locateFile: (path) => '/src/wasm/' + path
});

// シード値を設定して構造物を検索
Module._set_seed(dimension, seedLo, seedHi);
const count = Module._find_structures(structId, x1, z1, x2, z2, 1);

// WASMメモリから座標を読み取る
const bufPtr = Module._get_struct_buf_ptr();
for (let i = 0; i < count; i++) {
    const x = Module.HEAP32[(bufPtr >> 2) + i * 3 + 1];
    const z = Module.HEAP32[(bufPtr >> 2) + i * 3 + 2];
}

AIをどう活用したか

開発全体でAIを活用

このプロジェクトではAIコーディングアシスタントをフル活用しました。

フェーズ AIにやってもらったこと
WASM連携 C言語のブリッジコード作成、Emscriptenビルド設定
UI構築 マップ描画、レスポンシブ対応、ダークモードUI
多言語対応 8言語のi18n実装、localStorage ベースの言語切替
SEO対策 canonical / hreflang タグ、構造化データ、sitemap
インフラ Cloudflare Workers のルーティング設定
バグ修正 ゴースト構造物バグの原因調査と修正

「ゴースト構造物」バグの解決

開発中に面白いバグに遭遇しました。本来生成されないはずの構造物がマップに表示されてしまう問題です。

AIと一緒にデバッグした結果:

  • 原因: バイオームのサンプリング解像度が粗すぎた
  • 修正: Scale=1(ブロックレベル)、Y=63(海面高度)でのサンプリングに変更

この修正により、既存の有名ツール(Chunkbase)と同等の精度を達成できました。

多言語対応もAIで

8言語への対応もAIに依頼しました。ただし、クローラー(Googlebot等)がJSベースのリダイレクトに引っかかる問題が発生。

// ボット除外パッチ — AIと一緒に解決
(function () {
    var lang = localStorage.getItem('seedmap_lang');
    
    // クローラーにはリダイレクトを適用しない
    if (/bot|crawl|spider|googlebot/i.test(navigator.userAgent)) lang = null;
    
    var map = { ja: '/ja', ko: '/ko', zh_CN: '/zh-CN', /* ... */ };
    if (lang && map[lang] && location.pathname.startsWith('/blog/')) {
        location.replace(map[lang] + location.pathname);
    }
})();

Google Search Consoleで「リダイレクトエラー」が出ていたのを、AIに相談して34ファイルに一括修正しました。


インフラ構成

Cloudflare Pages(静的ホスティング)
       +
Cloudflare Worker(エッジルーティング)
       ↓
  ┌─── www.mcseedview.com → 301 → mcseedview.com
  └─── mcseedview.com → 静的アセット配信

Cloudflare Workers を使った理由:

  • エッジでのリダイレクト — www → non-www を Worker で処理
  • 無料枠で十分 — 静的サイトなのでほぼコストゼロ
  • グローバルCDN — 世界中から高速アクセス(8言語対応なので重要)

AI開発で感じたこと

WASMプロジェクトとAIの相性

良かった点

ポイント 詳細
C⇔JS連携のボイラープレート Emscripten の HEAP32 操作など、定型的だが間違えやすいコードをAIが正確に生成
多ファイル一括修正 34ファイルのSEOパッチを一度の指示で実行
デバッグ支援 ゴースト構造物バグの原因仮説→検証→修正をAIと対話で進行

注意が必要だった点

ポイント 詳細
アルゴリズムの正確性 Minecraftの仕様との整合性は最終的に自分で検証が必要
WASM固有の知識 メモリアライメントやポインタ操作はAIの出力を理解して確認すべき

まとめ

C言語 → WebAssembly → ブラウザというパイプラインのプロジェクトでも、AI活用で個人開発は十分に成立します。

特に:

  • C⇔JSブリッジのような定型的だが複雑なコード
  • 多言語対応・SEOのような横展開が多い作業
  • バグのデバッグ(仮説→検証のサイクル)

これらはAIが特に力を発揮する領域でした。

ぜひツールを使ってみてください!お気に入りのシード値のマップが見られます 🗺️

🔗 https://mcseedview.com/

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?