GPTo3-mini-highでクソゲー(ブロック崩し)を作ってみた!
ChatGPTがまたまた進化しましてGPTo3-mini-highというコーディングに特化したモデルが出てしまいましたこれはかなり高機能で、エラーがほとんどなくデータベースやらお仕事に使えるコーディングをやってくれてしまいますここ数日、事務所で使うWebベースのデータベースをほぼほぼJavascriptだけで作っていたのですが超速すぎてやばい感じです!なんでも巷では、これのおかげでゲーム祭りだそう・・・ということで、試しにクソゲーを作らせてみました仕様だけちゃんと与えるとほんの数十秒で完成ですあとは、2、3回チャットをするか生身でちょっと手直しする程度でも、結構いい感じで得点やブロックが壊れた時のエフェクトが出てるのでお暇な方はお試しください下のコードをテキストファイルに貼り付けて適当なファイル名で拡張子をhtmlにしたらファイルをクリックでブラウザーで表示されゲームが開始できますよ!っと思ったけど、ここにアップしました!クソゲーはこちら!クソゲーにしては細部が凝ってるかも?<!DOCTYPE html><html lang="ja"><head> <meta charset="UTF-8"> <title>ブロック崩しゲーム</title> <style> html, body { height: 100%; margin: 0; background: #222; display: flex; justify-content: center; align-items: center; } canvas { background: #000; border: 20px solid #fff; box-shadow: 0 0 20px rgba(0,0,0,0.5); } </style></head><body> <canvas id="gameCanvas"></canvas> <script> const INITIAL_SPEED = Math.sqrt(3*3 + (-3)*(-3)); // 約4.24 const MAX_SPEED = 8; const ACCELERATION = 0.1; const BOOST_ON_BLOCK = 0.3; const INITIAL_BALL_RADIUS = 8; const MAX_BALL_RADIUS = 12; const canvas = document.getElementById('gameCanvas'); const ctx = canvas.getContext('2d'); canvas.width = 800; canvas.height = 600; let gameState = 'preAnimation'; let leftPressed = false; let rightPressed = false; const paddleWidth = 100; const paddleHeight = 20; const paddleSpeed = 7; const paddle = { x: canvas.width/2 - paddleWidth/2, y: canvas.height - paddleHeight - 10, width: paddleWidth, height: paddleHeight, speed: paddleSpeed }; let ball = { x: canvas.width/2, y: paddle.y - INITIAL_BALL_RADIUS - 2, dx: 3, dy: -3, radius: INITIAL_BALL_RADIUS }; // ブロック設定(ここではシンプルな例) const blockRowCount = 5; const blockColCount = 10; const blockPadding = 10; const blockMargin = 20; const blockWidth = (canvas.width - 2 * blockMargin - (blockColCount - 1) * blockPadding) / blockColCount; const blockHeight = 20; const blockOffsetTop = 50; const blockOffsetLeft = blockMargin; const blockColors = ["#e74c3c", "#e67e22", "#f1c40f", "#2ecc71", "#3498db", "#9b59b6"]; let blocks = []; let lives = 3; let score = 0; let scorePopups = []; let preAnimStart = Date.now(); let flashAlpha = 0; let fireworks = []; let lastFrameTime = Date.now(); function initGame() { gameState = 'preAnimation'; preAnimStart = Date.now(); lastFrameTime = Date.now(); leftPressed = false; rightPressed = false; lives = 3; score = 0; scorePopups = []; paddle.x = canvas.width/2 - paddle.width/2; ball.x = canvas.width/2; ball.y = paddle.y - INITIAL_BALL_RADIUS - 2; ball.dx = 3; ball.dy = -3; ball.radius = INITIAL_BALL_RADIUS; blocks = []; for(let r = 0; r < blockRowCount; r++){ for(let c = 0; c < blockColCount; c++){ let blockX = blockOffsetLeft + c*(blockWidth + blockPadding); let blockY = blockOffsetTop + r*(blockHeight + blockPadding); const delay = r * 200 + c * 100; const duration = 300; const point = (blockRowCount - r) * 10; blocks.push({ x: blockX, y: blockY, currentY: -blockHeight, width: blockWidth, height: blockHeight, color: blockColors[(r+c) % blockColors.length], animStart: delay, animDuration: duration, destroyed: false, point: point, row: r }); } } fireworks = []; } function lerp(a, b, t) { return a + (b - a)*t; } document.addEventListener('keydown', keyDownHandler); document.addEventListener('keyup', keyUpHandler); function keyDownHandler(e) { if(e.key === "ArrowLeft") { leftPressed = true; } else if(e.key === "ArrowRight") { rightPressed = true; } else if(e.key === "Enter") { if(gameState === 'waiting') { gameState = 'playing'; } else if(gameState === 'lifeLost' || gameState === 'gameOver') { if(gameState === 'lifeLost') { resetBallAndPaddle(); gameState = 'playing'; } else { initGame(); } } else if(gameState === 'victory') { initGame(); } } } function keyUpHandler(e) { if(e.key === "ArrowLeft") { leftPressed = false; } else if(e.key === "ArrowRight") { rightPressed = false; } } function resetBallAndPaddle() { paddle.x = canvas.width/2 - paddle.width/2; ball.x = canvas.width/2; ball.y = paddle.y - ball.radius - 2; ball.dx = 3; ball.dy = -3; } initGame(); requestAnimationFrame(gameLoop); </script></body></html>思いの外、集中力が続かず全クリできない!