Atomic Studio
/
ピンポン(テンプレートから)
0部品・0〜数百トークン
↩ 戻す
履歴
複製
💬 ことばで直す
▶ Run
🔗 共有
🚀 デプロイ
⏹
☰
▷ プレビュー
</> コード
🖥 PC
📱 スマホ
↻ 新タブ
atomic.studio/s/3727
📄 index.html
コードを直接編集して「適用」でプレビューに反映
適用 ▷
<!doctype html><html lang="ja"><head><meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"><title>ピンポン</title> <style> html,body{margin:0;height:100%;background:#0e1525;color:#f5f9fc;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif} .wrap{min-height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:16px;box-sizing:border-box} h1{font-size:18px;margin:0;font-weight:700} .hud{font-size:14px;color:#9da9bd} .hint{font-size:12px;color:#6b7689} canvas{background:var(--bg,#11131f);border-radius:14px;box-shadow:0 12px 48px #0008;max-width:96vw;height:auto;touch-action:none} .btn{background:#6366f1;color:#fff;border:0;border-radius:10px;padding:8px 16px;font-size:14px;font-weight:600;cursor:pointer} #board{display:grid;gap:6px} .cell{display:flex;align-items:center;justify-content:center;border-radius:8px;font-weight:700;user-select:none;cursor:pointer} </style></head><body><div class="wrap"> <h1 id="title">ピンポン</h1><div class="hud" id="hud">あなた <span id="ps">0</span> ― CPU <span id="cs">0</span></div> <canvas id="cv" width="420" height="300"></canvas> <div class="hint" id="hint">← → / ドラッグ でラケット移動</div><button class="btn" id="restart">もう一度</button> </div> <script id="game-data" type="application/json">{"title": "ピンポン", "bg": "#0b1020", "ball": "#fde047", "me": "#60a5fa", "cpu": "#f43f5e", "goal": 5}</script> <script> const DATA=JSON.parse(document.getElementById('game-data').textContent); document.getElementById('title').textContent=DATA.title||document.title; if(DATA.bg)document.documentElement.style.setProperty('--bg',DATA.bg); const cv=document.getElementById('cv'),x=cv.getContext('2d');let mx,cx,bx,by,vx,vy,ps,cs; function serve(d){bx=cv.width/2;by=cv.height/2;vx=d*3.2;vy=(Math.random()*2-1)*2.4;} function reset(){mx=cv.width/2-35;cx=cv.width/2-35;ps=0;cs=0;serve(1);document.getElementById('ps').textContent=0;document.getElementById('cs').textContent=0;} function step(){bx+=vx;by+=vy;if(by<6||by>cv.height-6)vy*=-1; cx+=Math.max(-3,Math.min(3,(bx-(cx+35))*0.08)); if(bx<16&&by>cx&&by<cx+70){vx=Math.abs(vx)+.2;} if(bx>cv.width-16&&by>mx&&by<mx+70){vx=-(Math.abs(vx)+.2);} if(bx<0){cs++;document.getElementById('cs').textContent=cs;serve(1);} if(bx>cv.width){ps++;document.getElementById('ps').textContent=ps;serve(-1);}} function draw(){x.fillStyle=DATA.bg;x.fillRect(0,0,cv.width,cv.height); x.fillStyle=DATA.cpu;x.fillRect(8,cx,8,70);x.fillStyle=DATA.me;x.fillRect(cv.width-16,mx,8,70); x.fillStyle=DATA.ball;x.fillRect(bx-5,by-5,10,10);} function loop(){step();draw();requestAnimationFrame(loop);} function move(d){mx=Math.max(0,Math.min(cv.height-70,mx+d));} window.addEventListener('keydown',e=>{if(e.key==='ArrowUp'||e.key==='ArrowLeft')move(-22);if(e.key==='ArrowDown'||e.key==='ArrowRight')move(22);}); cv.addEventListener('pointermove',e=>{const r=cv.getBoundingClientRect();mx=Math.max(0,Math.min(cv.height-70,(e.clientY-r.top)*(cv.height/r.height)-35));}); document.getElementById('restart').onclick=reset;reset();requestAnimationFrame(loop); window.__state=()=>({ps,cs,bx:Math.round(bx),by:Math.round(by)});window.__input=()=>{step();step();}; </script></body></html>
▸ コンソール
0部品・0〜数百トークン
✕