如何使用 Javascript 保持块的独立性?

我正在学习 JavaScript,但在某些方面仍在苦苦挣扎。我正在尝试使这段代码中的块具有自己的颜色,因此稍后我可以弄清楚如何将图片添加到每个块,但它不起作用,因为仅在 3 个循环之后颜色消失并且它们变成全黑。对于如何制作每个块并保持其颜色的任何帮助,我将非常感激。请看下面的代码:


<!DOCTYPE html>

<html>


<head>

  <meta charset="UTF-8">

  <meta name="viewport" content="width=device-width, initial-scale=1.0">

  <title>Slot Machine</title>

</head>


<body>

  <canvas id="canvas" width="1000" height="2000"></canvas>


  <script>

    var game = {

      tickNumber: 0,

      timer: null,

      board: [

        "####################",

        "#                  #",

        "#                  #",

        "#                  #",

        "#                  #",

        "#                  #",

        "#                  #",

        "#                  #",

        "#                  #",

        "#                  #",

        "#                  #",

        "#                  #",

        "#                  #",

        "#                  #",

        "#                  #",

        "#                  #",

        "#                  #",

        "#                  #",

        "#                  #",

        "#                  #",

        "#                  #",

        "#                  #",

        "#                  #",

        "#                  #",

        "#                  #",

        "#                  #",

        "####################"

      ],

      tick: function() {

        game.tickNumber++;

        snake.move();

        graphics.drawGame();

        game.timer = window.setTimeout("game.tick()", 500);

      }

    };

    var snake = {

      parts: [{

          x: 2,

          y: 2,

          color: "green"

        },

        {

          x: 2,

          y: 6,

          color: "red"

        },

        {

          x: 2,

          y: 10,

          color: "blue"

        },

        {

          x: 2,

          Y: 14,


萧十郎
浏览 103回答 1
1回答

开满天机

问题在于您的蛇中的移动功能。您正在用只有 x 和 y 且没有颜色属性的新位置替换部件对象。理想情况下,要移动蛇,您应该只移动头部,然后更新身体的其余部分以向上移动一个部分。我已经更新了你的移动功能,你可以在其中看到这个算法。<!DOCTYPE html><html><head>&nbsp; <meta charset="UTF-8">&nbsp; <meta name="viewport" content="width=device-width, initial-scale=1.0">&nbsp; <title>Slot Machine</title></head><body>&nbsp; <canvas id="canvas" width="1000" height="2000"></canvas>&nbsp; <script>&nbsp; &nbsp; var game = {&nbsp; &nbsp; &nbsp; tickNumber: 0,&nbsp; &nbsp; &nbsp; timer: null,&nbsp; &nbsp; &nbsp; board: [&nbsp; &nbsp; &nbsp; &nbsp; "####################",&nbsp; &nbsp; &nbsp; &nbsp; "#&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #",&nbsp; &nbsp; &nbsp; &nbsp; "#&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #",&nbsp; &nbsp; &nbsp; &nbsp; "#&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #",&nbsp; &nbsp; &nbsp; &nbsp; "#&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #",&nbsp; &nbsp; &nbsp; &nbsp; "#&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #",&nbsp; &nbsp; &nbsp; &nbsp; "#&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #",&nbsp; &nbsp; &nbsp; &nbsp; "#&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #",&nbsp; &nbsp; &nbsp; &nbsp; "#&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #",&nbsp; &nbsp; &nbsp; &nbsp; "#&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #",&nbsp; &nbsp; &nbsp; &nbsp; "#&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #",&nbsp; &nbsp; &nbsp; &nbsp; "#&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #",&nbsp; &nbsp; &nbsp; &nbsp; "#&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #",&nbsp; &nbsp; &nbsp; &nbsp; "#&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #",&nbsp; &nbsp; &nbsp; &nbsp; "#&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #",&nbsp; &nbsp; &nbsp; &nbsp; "#&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #",&nbsp; &nbsp; &nbsp; &nbsp; "#&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #",&nbsp; &nbsp; &nbsp; &nbsp; "#&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #",&nbsp; &nbsp; &nbsp; &nbsp; "#&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #",&nbsp; &nbsp; &nbsp; &nbsp; "#&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #",&nbsp; &nbsp; &nbsp; &nbsp; "#&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #",&nbsp; &nbsp; &nbsp; &nbsp; "#&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #",&nbsp; &nbsp; &nbsp; &nbsp; "#&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #",&nbsp; &nbsp; &nbsp; &nbsp; "#&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #",&nbsp; &nbsp; &nbsp; &nbsp; "#&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #",&nbsp; &nbsp; &nbsp; &nbsp; "#&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #",&nbsp; &nbsp; &nbsp; &nbsp; "####################"&nbsp; &nbsp; &nbsp; ],&nbsp; &nbsp; &nbsp; tick: function() {&nbsp; &nbsp; &nbsp; &nbsp; game.tickNumber++;&nbsp; &nbsp; &nbsp; &nbsp; snake.move();&nbsp; &nbsp; &nbsp; &nbsp; graphics.drawGame();&nbsp; &nbsp; &nbsp; &nbsp; game.timer = window.setTimeout("game.tick()", 500);&nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; };&nbsp; &nbsp; var snake = {&nbsp; &nbsp; &nbsp; parts: [{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; x: 2,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; y: 2,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; color: "green"&nbsp; &nbsp; &nbsp; &nbsp; },&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; x: 2,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; y: 6,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; color: "red"&nbsp; &nbsp; &nbsp; &nbsp; },&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; x: 2,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; y: 10,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; color: "blue"&nbsp; &nbsp; &nbsp; &nbsp; },&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; x: 2,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Y: 14,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; color: "yellow"&nbsp; &nbsp; &nbsp; &nbsp; },&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; x: 2,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Y: 16,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; color: "grey"&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; ],&nbsp; &nbsp; &nbsp; facing: "S",&nbsp; &nbsp; &nbsp; nextLocation: function() {&nbsp; &nbsp; &nbsp; &nbsp; var snakeHead = snake.parts[0];&nbsp; &nbsp; &nbsp; &nbsp; var targetX = snakeHead.x;&nbsp; &nbsp; &nbsp; &nbsp; var targetY = snakeHead.y;&nbsp; &nbsp; &nbsp; &nbsp; targetY = snake.facing == "S" ? targetY + 4 : targetY;&nbsp; &nbsp; &nbsp; &nbsp; if (targetY >= 24) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; targetY = 2;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; return {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; x: targetX,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; y: targetY&nbsp; &nbsp; &nbsp; &nbsp; };&nbsp; &nbsp; &nbsp; },&nbsp; &nbsp; &nbsp; move: function() {&nbsp; &nbsp; &nbsp; &nbsp; var location = snake.nextLocation();&nbsp; &nbsp; &nbsp; &nbsp; var prevX = snake.parts[0].x;&nbsp; &nbsp; &nbsp; &nbsp; var prevY = snake.parts[0].y;&nbsp; &nbsp; &nbsp; &nbsp; snake.parts[0].x = location.x;&nbsp; &nbsp; &nbsp; &nbsp; snake.parts[0].y = location.y;&nbsp; &nbsp; &nbsp; &nbsp; for(var i = 1; i < snake.parts.length; i++) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var currentX = snake.parts[i].x;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var currentY = snake.parts[i].y;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; snake.parts[i].x = prevX;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; snake.parts[i].y = prevY;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; prevX = currentX;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; prevY = currentY;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; };&nbsp; &nbsp; var graphics = {&nbsp; &nbsp; &nbsp; canvas: document.getElementById("canvas"),&nbsp; &nbsp; &nbsp; squareSize: 20,&nbsp; &nbsp; &nbsp; squarePic: 60,&nbsp; &nbsp; &nbsp; drawBoard: function(ctx) {&nbsp; &nbsp; &nbsp; &nbsp; var currentYoffset = 0;&nbsp; &nbsp; &nbsp; &nbsp; game.board.forEach(function checkLine(line) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; line = line.split('');&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var currentXoffset = 0;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; line.forEach(function checkCharacter(character) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (character == '#') {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ctx.fillStyle = "blue";&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ctx.fillRect(currentXoffset, currentYoffset, graphics.squareSize, graphics.squareSize);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; currentXoffset += graphics.squareSize;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; currentYoffset += graphics.squareSize;&nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; &nbsp; },&nbsp; &nbsp; &nbsp; drawSnake: function(ctx) {&nbsp; &nbsp; &nbsp; &nbsp; snake.parts.forEach(function drawPart(part) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var partXlocation = part.x * graphics.squareSize;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var partYlocation = part.y * graphics.squareSize;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var coloracao = part.color;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ctx.fillStyle = coloracao;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ctx.fillRect(partXlocation, partYlocation, graphics.squarePic, graphics.squarePic);&nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; &nbsp; },&nbsp; &nbsp; &nbsp; drawGame: function() {&nbsp; &nbsp; &nbsp; &nbsp; var ctx = graphics.canvas.getContext("2d");&nbsp; &nbsp; &nbsp; &nbsp; ctx.clearRect(0, 0, graphics.canvas.width, graphics.canvas.height);&nbsp; &nbsp; &nbsp; &nbsp; graphics.drawBoard(ctx);&nbsp; &nbsp; &nbsp; &nbsp; graphics.drawSnake(ctx);&nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; };&nbsp; &nbsp; graphics.drawGame();&nbsp; &nbsp; var gameControl = {&nbsp; &nbsp; &nbsp; startGame: function() {&nbsp; &nbsp; &nbsp; &nbsp; game.tick();&nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; };&nbsp; &nbsp; gameControl.startGame();&nbsp; </script></body></html>
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript