如何为Atari Breakout游戏的砖块设置随机独特色彩
为Atari Breakout游戏添加随机彩色砖块
需求
实现Atari Breakout游戏中砖块的多彩效果:每个砖块拥有随机生成的独特色彩,且不改变球、挡板等其他元素的默认颜色。
修改方案
1. 为砖块添加随机颜色属性
在初始化砖块数组的循环中,新增getRandomColor辅助函数生成随机RGB颜色,为每个砖块对象添加color属性存储独特色值。
2. 绘制砖块时应用对应颜色
在drawBricks函数中,绘制单个砖块前,将画布的fillStyle设置为该砖块的color属性值,再执行填充操作。
3. 锁定其他元素颜色
在drawBall和drawPaddle函数中显式设置fillStyle为黑色,确保砖块颜色不会影响球、挡板的默认显示效果。
修改后的完整代码
JavaScript代码
'use strict'; var canvas = document.getElementById("myCanvas"); var ctx = canvas.getContext("2d"); var ballRadius = 20; var x = canvas.width/2; var y = canvas.height-30; var dx = 3; var dy = -3; var paddleHeight = 10; var paddleWidth = 175; var paddleX = (canvas.width-paddleWidth)/2; var rightPressed = false; var leftPressed = false; var brickRowCount = 11; var brickColumnCount = 5; var brickWidth = 73; var brickHeight = 20; var brickPadding = 10; var brickOffsetTop = 30; var brickOffsetLeft = 30; var score = 0; var lives = 3; // 生成随机RGB颜色的辅助函数 function getRandomColor() { var r = Math.floor(Math.random() * 256); var g = Math.floor(Math.random() * 256); var b = Math.floor(Math.random() * 256); return `rgb(${r}, ${g}, ${b})`; } var bricks = []; for(var c=0; c<brickColumnCount; c++) { bricks[c] = []; for(var r=0; r<brickRowCount; r++) { // 为每个砖块添加随机颜色属性 bricks[c][r] = { x: 0, y: 0, status: 1, color: getRandomColor() }; } } document.addEventListener("keydown", keyDownHandler, false); document.addEventListener("keyup", keyUpHandler, false); document.addEventListener("mousemove", mouseMoveHandler, false); function keyDownHandler(e) { if(e.key == "Right" || e.key == "ArrowRight") { rightPressed = true; } else if(e.key == "Left" || e.key == "ArrowLeft") { leftPressed = true; } } function keyUpHandler(e) { if(e.key == "Right" || e.key == "ArrowRight") { rightPressed = false; } else if(e.key == "Left" || e.key == "ArrowLeft") { leftPressed = false; } } function mouseMoveHandler(e) { var relativeX = e.clientX - canvas.offsetLeft; if(relativeX > 0 && relativeX < canvas.width) { paddleX = relativeX - paddleWidth/2; } } function collisionDetection() { for(var c=0; c<brickColumnCount; c++) { for(var r=0; r<brickRowCount; r++) { var b = bricks[c][r]; if(b.status == 1) { if(x > b.x && x < b.x+brickWidth && y > b.y && y < b.y+brickHeight) { dy = -dy; b.status = 0; score++; if(score == brickRowCount*brickColumnCount) { alert("YOU WIN, CONGRATS!"); document.location.reload(); } } } } } } function drawBall() { // 显式设置球的颜色为黑色 ctx.fillStyle = "#000000"; ctx.beginPath(); ctx.arc(x, y, ballRadius, 0, Math.PI*2); ctx.fill(); ctx.closePath(); } function drawPaddle() { // 显式设置挡板颜色为黑色 ctx.fillStyle = "#000000"; ctx.beginPath(); ctx.rect(paddleX, canvas.height-paddleHeight, paddleWidth, paddleHeight); ctx.fill(); ctx.closePath(); } function drawBricks() { for(var c=0; c<brickColumnCount; c++) { for(var r=0; r<brickRowCount; r++) { if(bricks[c][r].status == 1) { var brickX = (r*(brickWidth+brickPadding))+brickOffsetLeft; var brickY = (c * (brickHeight + brickPadding)) + brickOffsetTop; bricks[c][r].x = brickX; bricks[c][r].y = brickY; ctx.beginPath(); ctx.rect(brickX, brickY, brickWidth, brickHeight); // 使用砖块的随机颜色填充 ctx.fillStyle = bricks[c][r].color; ctx.fill(); ctx.closePath(); } } } } function drawScore() { ctx.font = "16px Arial"; ctx.fillText("Score: "+score, 8, 20); } function drawLives() { ctx.font = "16px Arial"; ctx.fillText("Lives: "+lives, canvas.width-65, 20); } function draw() { ctx.clearRect(0, 0, canvas.width, canvas.height); drawBricks(); drawBall(); drawPaddle(); drawScore(); drawLives(); collisionDetection(); if(x + dx > canvas.width-ballRadius || x + dx < ballRadius) { dx = -dx; } if(y + dy < ballRadius) { dy = -dy; } else if(y + dy > canvas.height-ballRadius) { if(x > paddleX && x < paddleX + paddleWidth) { dy = -dy; } else { lives--; if(!lives) { alert("GAME OVER"); document.location.reload(); } else { x = canvas.width/2; y = canvas.height-30; dx = 3; dy = -3; paddleX = (canvas.width-paddleWidth)/2; } } } if(rightPressed && paddleX < canvas.width-paddleWidth) { paddleX += 7; } else if(leftPressed && paddleX > 0) { paddleX -= 7; } x += dx; y += dy; requestAnimationFrame(draw); } function hardFunction(){ ballRadius = 8; paddleWidth = 80; lives = 1; dx = 5; dy = -5; }; function mediumFunction(){ ballRadius = 15; paddleWidth = 120; lives = 2; dx = 4; dy = -4; }; function easyFunction(){ ballRadius = 20; paddleWidth = 175; lives = 3; dx = 3; dy = -3; }; draw(); console.log(ctx.fillStyle);
CSS代码
* { padding: 0; margin: 0; } canvas { background: #eee; display: block; margin: 0 auto; } button { border: none; color: gray; padding: 16px 32px; text-align: center; text-decoration: none; display: inline-block; font-size: 16px; margin: 4px 2px 0px 16.67%; transition-duration: 0.4s; cursor: pointer } .buttonHard:hover { background-color: red; color: black; } .buttonMedium:hover { background-color: yellow; color: black; } .buttonEasy:hover { background-color: green; color: black; }
HTML代码
<canvas id="myCanvas" width="960" height="640"></canvas> <button id="button" class="buttonHard" onclick="hardFunction();">Hard Mode</button> <button id="button" class="buttonMedium" onclick="mediumFunction();">Medium Mode</button> <button id="button" class="buttonEasy" onclick="easyFunction();">Easy Mode</button> <script src="script.js"></script>
内容的提问来源于stack exchange,提问作者Riad Afandili
相关产品推荐
相关产品推荐

