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が特に力を発揮する領域でした。
ぜひツールを使ってみてください!お気に入りのシード値のマップが見られます 🗺️