【问题标题】:In a snake game, how can a move a snake that has distinct pieces?在蛇游戏中,我如何移动具有不同碎片的蛇?
【发布时间】:2013-06-03 05:23:43
【问题描述】:

我看过一些 examples 用 javascript 构建蛇游戏,他们似乎用这种算法移动蛇:

  1. 将一块棋子放在你将要成为下一个刻度的地方
  2. 从你的尾巴上取下最后一块。

这会产生蛇四处移动的效果。但这仅在蛇是一种纯色时才有效。我正在尝试制作一个蛇游戏,其中蛇的每个部分都会在视觉上有所不同,如下所示:

假设黑色是头部,蓝色是尾部。上述算法不适用于这条蛇,因为去除尾巴会改变“部件”的顺序/颜色。 EG:你的尾巴不再是蓝色的,它会变成蓝绿色。

我可以使用什么算法来移动这条蛇,使它的头部呈黑色,尾巴保持蓝色,并且中间的所有颜色也保持相同的顺序?

【问题讨论】:

    标签: javascript algorithm canvas coffeescript


    【解决方案1】:

    您仍然可以使用以前的算法,但将颜色分别存储到像素中。

    假设你有一个列表pixel[0..n]

    其中包含 x,y 坐标。

    您可以创建另一个列表color[0..n]

    假设原始算法添加第一个像素,然后删除最后一个像素。

    您的显示功能可能如下所示:

    for i in 0..n:
        draw(pixel[i], "red")
    

    现在你就走吧:

    for i in 0..n:
        draw(pixel[i], color[i])
    

    假设您有一个 draw 函数,它接受一个 pixel 和一个 color

    【讨论】:

    • 太棒了,这很有意义。假设这些不是像素,而是形状或动画图像,你的算法仍然有效,对吧?
    • 是的,您可以使用对象列表来绘制而不是 color[i]。然后你可以去 object[i].draw(location=pixel[i])
    • 希望 JavaScript 有这样的语法:)
    • 现在我真的这样做了,我又一次把自己弄糊涂了。如果我使用的是图像列表并且它们的宽度为 20 像素,但我希望蛇每滴答声移动 5 像素,我该如何使用这个算法。我是否正确,您的算法假设蛇以每个滴答声添加一个段的速度移动,否则它将不起作用?
    • 在这个问题上帮不了你。
    【解决方案2】:

    您可以使用现有算法,但迭代所有单元格,用下一个单元格的颜色填充该单元格,以给人一种蛇正在移动的印象。

    你可能有一些看起来像这样的代码......

    if (this.body.length > this.length) {
        var oldPosition = this.body.shift();
        World.setCellAt(oldPosition.x, oldPosition.y, 0);
    }
    
    this.body.push({
        x: this.x,
        y: this.y
    });
    

    你的循环看起来像...

    this.body.forEach(function(piece, index) {
          var nextPiece = this.body[index + 1];
    
          if (nextPiece) {
               piece.color = nextPiece.color;
          }
    
    });
    

    【讨论】:

    • 啊,你用英语说的很好,很有道理。不过我不太懂你的代码。
    • @tieTYT 如果你用你所拥有的设置一个 jsFiddle,我会实现它并为你解释。
    • 我很感激这个提议,但我想我已经获得了足够的信息来继续。我想自己尝试一下。还是谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多