如何清理此 JavaScript 代码?

How do I clean up this JavaScript code?

所以我创建了一个简单的乒乓球游戏,但在 canvas 的底部和顶部都有一个球拍。但我想知道如何清理代码来完善游戏。我想做的一件事是阻止球在击中时沉入桨中。而且,我知道我应该使用 requestAnimationFrame() 而不是 setInterval(),但我制作这个游戏只是为了练习,所以我并不在意。所以基本上我只是征求有关如何清理代码的建议。提前致谢!

我的代码

var canvas = document.getElementById("myCanvas");
var ctx = canvas.getContext("2d");
var ballRadius = 10;
var x = (canvas.width/2)-5;
var y = canvas.height-30;
var dx = 2;
var dy = -2;
var paddleWidth = 75;
var paddleHeight = 10;
var paddleX = (canvas.width/2)-paddleWidth/2;
var leftPressed = false;
var rightPressed = false;

function ball() {
 ctx.beginPath();
 ctx.arc(x, y, ballRadius, 0, Math.PI*2);
 ctx.fillStyle = "#0095DD";
 ctx.fill();
 ctx.closePath();
}

function paddleOne() {
 ctx.beginPath();
 ctx.rect(paddleX, canvas.height-paddleHeight, paddleWidth, paddleHeight);
 ctx.fillStyle = "green";
 ctx.fill();
 ctx.closePath();

 if(leftPressed && paddleX > 0) {
  paddleX -= 7;
 }

 if(rightPressed && paddleX < canvas.width-paddleWidth) {
  paddleX += 7;
 }
}

function paddleTwo() {
 ctx.beginPath();
 ctx.rect(paddleX, 0, paddleWidth, paddleHeight);
 ctx.fillStyle = "green";
 ctx.fill();
 ctx.closePath();
}

function ballBounce() {
  if(x + dx > canvas.width-ballRadius || x + dx < ballRadius) {
  dx = -dx;
 }

 else if(y + dy < 0 + ballRadius) {
  if(x > paddleX && x < paddleX + paddleWidth) {
   dy = -dy;
  }
  
  else {
   alert("Game Over");
   document.location.reload();
  }
  
 }

 else if(y + dy > canvas.height - ballRadius) {
  if(x > paddleX && x < paddleX + paddleWidth) {
   dy = -dy;
  }

  else {
   alert("Game Over");
   document.location.reload();
  }
 }
}

function animate() {
 ctx.clearRect(0, 0, canvas.width, canvas.height);
 ball();
 paddleOne();
 paddleTwo();
 ballBounce();


 x += dx;
 y += dy;
}

setInterval(animate, 10);

document.addEventListener("keydown", keyDownHandler, false);
document.addEventListener("keyup", keyUpHandler, false);

function keyDownHandler(e) {
 if(e.keyCode === 37) {
  leftPressed = true;
 }

 if(e.keyCode === 39) {
  rightPressed = true;
 }
}

function keyUpHandler(e) {
 if(e.keyCode === 37) {
  leftPressed = false;
 }

 if(e.keyCode === 39) {
  rightPressed = false;
 }
}
* { padding: 0; margin: 0; }
  canvas { background: #eee; display: block; margin: 0 auto; }
<canvas id="myCanvas" width="480" height="320"></canvas>

首先,您可以进行一些重构。

示例:PaddleTwoPaddleOne 函数非常相似,在那里您可以使用带参数的函数,例如:DrawPaddle(positionX, positionY)

PaddleOne 中的 2 个条件不必存在。为机芯创建专用功能。

其次:添加一些变量(接近重构)

代码中直接有多个值。 示例:如果我要求您更改桨的速度,您应该在脚本中找到所有值 "speed"。

用变量(键码、速度、动画时间、颜色等)替换脚本中的所有直接值。您将更好地控制脚本。

第三种:使用OOP。

使用class清除代码并使代码更加模块化。 在这里我看到一些 class 你已经可以创建了: - 球(具有移动功能、绘图功能、键盘监听功能) - 桨(具有绘图功能和弹跳功能) - Point (with and X and a Y properties, and then avoid the variable like somethingX/somethingY)

再给我一个建议:检查并仔细检查您命名的有效性。如果你在你的代码中有错误的名字,你将无法理解它,你的同事也不会理解。并且您的代码中的一些黑区将出现。 在那里我可以看到 dx 和 dy,我猜你的意思是 directionX 和 directionY 但谁知道呢?它有无数的理由,过几次你会问这是什么?

第一步是向您的函数添加参数,而不是让您的所有函数都依赖于全局状态。

如果您的函数所依赖的所有内容都作为参数传递,那么您就可以开始考虑实际重构了。