Guide
つくって、出すまで。
プログラムが書けなくても大丈夫です。下の文を ChatGPT や Claude に貼ると、そのまま NARCER に出せる形のゲームができます。できたファイルを投稿ページに落とすだけ。つくりかけでも出していい場所です。
STEP 1AI につくってもらう
ChatGPT・Claude・Gemini など、どれでも構いません。下の文をまるごとコピーして、最後の2行だけ自分の言葉に書き換えて貼ってください。
ブラウザで遊べる小さなゲームを、HTML 1ファイルだけで作ってください。 NARCER(https://narcer.com/)という投稿サイトに出すので、次の決まりを必ず守ってください。 【つくりの決まり】 - HTML・CSS・JavaScript を、すべて1つの .html ファイルに入れる - 外部のファイルを読み込まない(画像・音・フォント・ライブラリを外から持ってこない)。絵は canvas で描くか、色と形で表す - 外へ通信しない(fetch / XMLHttpRequest / WebSocket / sendBeacon を使わない) - 親ページを触らない(window.top / parent.location / parent.document を使わない) - Cookie を使わない。保存が要るときは localStorage をそのまま使ってよい(NARCER 側で動くようにしてあります) - キーボードでもタッチでも遊べるようにする。操作の説明は画面の中に短く書く - 1〜3分で1回遊べる長さ。スコアかクリアの区切りをつける 【 に必ず入れる】ゲームの題名 【スマホの操作(おすすめの形)】 - 十字キーの絵は描かない。画面の左半分をなぞって動かす(触った所が中心・指をずらした方向へ進む・離すと止まる) - 画面の右半分をタップで決定。強く払う(24px 以上動かす)と「戻る」 - ボタンを置くなら画面の端から 44px 以上離す(iPhone の端は OS が取ってしまう) 【できあがり】 完成した HTML の全文を、そのままコピーできる形で1つ出してください。説明は最後に3行だけ。 つくってほしいゲーム:(ここに書く。例:雪原で獣を狩って料理するサバイバル) 雰囲気:(ここに書く。例:ドット絵・静かな音・寒色)
index.html を入れてください)。NARCER が受け取ったときに1つのファイルにまとめます。three.js・p5.js・Phaser など有名なライブラリも、決められた配布元(cdnjs・jsDelivr・unpkg)から読む書き方ならそのまま使えます。くわしくは下の表。
スマホしか無い場合
ChatGPT や Claude のアプリでも同じ文が使えます。できあがった HTML は次の手順でファイルにします。
Roblox・Unity で作ったゲームも出せます
NARCER が預かるのは HTML のゲームだけですが、ほかの作品も「作品ページ」を作れます。ゲーム本体は送りません。遊べる URL と画像があれば十分です。
よそで遊べる
Roblox・Steam・App Store・Google Play・自分のサイトなど。NARCER の作品ページから、その場所へ送ります。
まだ遊べない
町だけ作った、戦闘だけ試した、でも出せます。開発中として並び、フォローした人に更新が届きます。
作ったものは何でも
制作環境(Unity・Godot・Unreal・ツクールなど)と、遊ぶ場所は別々に選びます。配る先が変わっても作品ページはそのままです。
出し方:投稿ページで「外で遊ぶゲーム」を選ぶだけ。制作環境 → 遊ぶ場所 → 情報 → 送る、の4手順です。
STEP 2ファイルにする
AI が書いた HTML を、拡張子 .html のファイルとして保存します。うまくいかないときは、保存せずに次の手順で「貼り付け」でも出せます。
パソコン(Windows)
AI の答えのコードをコピー → メモ帳を開いて貼り付け → 「名前を付けて保存」→ ファイルの種類を「すべてのファイル」にして、名前を game.html、文字コードを UTF-8 にして保存。
Mac
テキストエディットを開き、メニューの「フォーマット → 標準テキストにする」を選んでから貼り付け。game.html という名前で保存します。
iPhone・Android
保存しなくて大丈夫です。コードをコピーしたまま次の手順へ進み、投稿ページの「貼り付けて送る」欄に貼ってください。
.html をそのまま使えます。ZIP で受け取った場合も、そのまま送れます。
STEP 3出す
投稿ページを開く
narcer.com の「投稿する」を開きます。登録はしなくても出せます。
ファイルを落とす、または貼る
枠の中に .html(または ZIP)を落とすか、スマホなら下の欄にコードを貼ります。落とした瞬間に自動検査が走り、10項目の結果が出ます。
その場で試し遊びする
次の画面で、本当に narcer.com で動く形のまま遊べます。ここで動けば、出したあとも同じように動きます。カバー画像を選ばなければ、この時の画面が自動でカバーになります。
題名などを書いて送る
題名・作者名・一言。あとは「投稿する」を押すだけ。人が中身を見てから並びます(ふつう1日以内)。
自分のものにする(おすすめ)
送ったあとの画面から登録すると、その投稿があなたのものになります。セーブが効くようになり、次からは送った瞬間に並び、あとから新しい版に差し替えられます。
AI に送信までやってもらう
Claude Code や Codex のように、パソコンの中でファイルを扱える AI を使っている場合は、この文だけで投稿まで終わります。ふつうのチャット AI では実行できないので、上の手順で出してください。
このゲームのファイルを NARCER に投稿して。やり方は https://narcer.com/llms.txt に書いてある。 読めないなら次を実行して(元のファイルを送ること。畳んだ後のファイルではなく): curl -sS -F "file=@game.html" https://narcer.com/api/submit 返ってきた JSON の id と state と message を教えて。 自動検査(checks)で ng があれば、その項目を直してからもう一度送って。
できること・できないこと
投稿されたゲームは、NARCER 本体から切り離した「砂場」の中で動きます。遊ぶ人を守るための決まりなので、ここだけは緩められません。
| 項目 | いまの上限 | おぼえかた |
|---|---|---|
| HTML 1ファイル | 10,000 KB | まとめたあとの大きさ。ふつうのゲームなら余裕があります |
| ZIP で送る | 12,000 KB | 中身は 400 ファイル・展開して 24 MB まで。index.html を入れる |
| カバー画像 | 300 KB | 大きくても送るときに自動で縮みます。選ばなければゲーム画面が使われます |
| 投稿の回数 | 10分に3回 | 書き込みは10分に12回まで |
| セーブ | 64 KB | 登録した作者のゲームだけ、遊ぶ人の端末に残ります |
canvas・WebGL・音
2D も 3D も動きます。音はコードで鳴らすか、ZIP に入れてください。
保存(localStorage)
そのまま書いて大丈夫です。砂場では NARCER が肩代わりします。
決まった配布元のライブラリ
cdnjs・jsDelivr・unpkg・Google Fonts。送るときに中に取り込みます。版は URL に固定してください。
外への通信
fetch・XMLHttpRequest・WebSocket。順位や対戦は下の仕組みを使います。
それ以外の外部ファイル
よそのサイトの画像・音・スクリプト。中に入れるか ZIP で送ってください。
親ページを触ること
window.top・parent.location など。遊ぶ人を守るための線です。
守ってほしいこと
- 自分が作った(AI といっしょに作った)ものだけ。他人の作品やキャラクターをそのまま使わない。
- 遊ぶ人の情報を集めない、外へ送らない。
- 成人向けは受け付けていません。
- つくりかけは歓迎です。
statusをwipにしておけば、そういう作品として並びます。
セーブ・順位・通信対戦
どれも「外へ通信しない」まま使えます。ゲームは NARCER のページに頼むだけで、NARCER が代わりにやります。使いたいものだけ、AI への文に足してください。
セーブ(続きから遊べるように)
登録した作者のゲームでは、遊ぶ人の端末に記録が残ります。この関数を使うと、NARCER の外(自分のパソコンで開いたとき)でも同じように動きます。
保存には次の関数を使ってください(NARCER のセーブの橋。外では localStorage に落ちます):
var NS={save:function(k,v){try{localStorage.setItem(k,JSON.stringify(v));}catch(e){}try{parent.postMessage({narcer:'save',key:k,value:v},'*');}catch(e){}},
load:function(k,cb){var v=null;try{v=JSON.parse(localStorage.getItem(k));}catch(e){}var done=false;function fin(x){if(done)return;done=true;cb(x==null?v:x);}
try{var h=function(e){if(e.data&&e.data.narcer==='load'&&e.data.key===k){removeEventListener('message',h);fin(e.data.value);}};addEventListener('message',h);
parent.postMessage({narcer:'load',key:k},'*');setTimeout(function(){removeEventListener('message',h);fin(null);},300);}catch(e){fin(null);}}};
使い方: NS.load('hi', function(v){ hi = v || 0; }); NS.save('hi', hi);
1ゲームあたり 64 KB まで。
順位表(みんなの点数)
ゲームごと・モードごとの順位を NARCER が持ちます。1人1行で、その人の最高点だけが残ります。作者本人の点は順位に入りません。
得点は NARCER の順位表に送ってください(fetch は使わない):
var NR={send:function(mode,score,pid){try{parent.postMessage({narcer:'score',mode:mode,score:score,pid:pid},'*');}catch(e){}},
get:function(mode,pid){try{parent.postMessage({narcer:'ranking',mode:mode,pid:pid},'*');}catch(e){}},
on:function(cb){addEventListener('message',function(e){if(e.data&&e.data.narcer==='ranking')cb(e.data);});}};
使い方: NR.on(function(r){ 順位表を描く(r.top, r.me); }); NR.send('main', score, pid);
pid は端末ごとの合言葉(英数6〜40字)を自分で作ってセーブに残す=同じ人だと分かるようにするため。
返事は {top:[{name,score,me}], me:{rank,score}, total}。
通信対戦・通信交換
合言葉(6桁)で部屋を作り、友達とつながります。同じ部屋の全員に同じ「乱数の種」が配られるので、両方の端末で同じ計算をすれば結果がぴったり合います。相手の手を待つターン制に向いています。
通信対戦は NARCER の中継を使ってください(ゲームは外へ通信しない):
var NS=NS||{}; NS.net={_h:{},on:function(ev,fn){(this._h[ev]=this._h[ev]||[]).push(fn);},
create:function(max){parent.postMessage({narcer:"net",op:"create",max:max||2},"*");},
join:function(code){parent.postMessage({narcer:"net",op:"join",code:String(code)},"*");},
send:function(data,to){parent.postMessage({narcer:"net",op:"send",data:data,to:to},"*");},
leave:function(){parent.postMessage({narcer:"net",op:"leave"},"*");}};
addEventListener("message",function(e){var d=e.data;if(!d||d.narcer!=="net")return;(NS.net._h[d.ev]||[]).forEach(function(f){f(d);});});
届く出来事:
room {code,seed,host,players,you} 部屋の姿。code を画面に出して相手に伝える。seed は全員同じ乱数の種
joined {player} / left {pid} 誰かが入った/出た
away {pid} / back {pid} 相手の回線が切れた/戻った(120秒以内なら同じ人として戻る)
msg {from,data,seq} 相手から届いたデータ
error {code,message} no_room(合言葉が違う)/ room_full など
つくり:「部屋を作る」で code を表示 → 相手が「部屋に入る」で入力 → 手番ごとに自分の手だけ send →
両方が相手の手を受け取ってから、同じ seed で同じ計算をする。1通 4,096 バイト・1秒に20通まで。
away か left)何も動かさないのが安全です。
止まったときは
自動検査で赤が出ても、壊れたわけではありません。ほとんどは書き方を少し変えるだけで通ります。投稿ページには「直し方を AI に頼む文」が自動で作られるので、それを貼るのが一番早い方法です。
外へ通信するコードがあります
外部のファイルを読み込んでいます
親ページを触っています
大きすぎます
「ソースを見る」で保存したものを送ったら止まった
スマホで画面が小さい/全画面にならない
narcer:size(例 640x360)を書いておくと、画面いっぱいに広げやすくなります。出したあと
新しい版に差し替える
作品ページの「持ち主の道具」から。前の版も残るので、戻すこともできます。
カバーを変える
画像を上げるか、「いまのゲーム画面をカバーにする」を押すだけ。
開発ログを書く
フォローしている人に届きます。つくりかけの経過も作品のうちです。
よその作品も紹介する
マイページのプロフィールから「外の作品」に5つまで。Roblox・アプリ・Steam など、NARCER に載せられない作品もリンクで見せられます。
取り下げる
いつでも一覧から外せます。消えるわけではないので、また戻せます。
困ったことがあれば フォーラムか、support@narcer.com まで。技術的な決まりの全文は llms.txt にあります(AI に読ませる用の1枚です)。