这个JS有什么问题吗?

问题描述 投票:0回答:2

[我正在尝试使用JS和p5.js编写国际象棋游戏,但是我的代码中有一个问题,我有几天无法解决。

这里是代码:

function setup() {
  // some other stuff: init canvas & board, set noStroke()

  let wp1 = new Piece('white', ['a', 2], 'p', board);
  wp1._draw();
}

我在let wp1 = new Piece('white', ['a', 2], 'p', board);处收到错误。它来自构造函数。我那里还有很多其他代码,但这是出现错误的部分:

  switch (type) { // "type refers to the third argument, 'p', from the code above
      case 'p':
        this.type = new Pawn(this.color, this.square);
      case 'r':
        this.type = new Rook(this.color, this.square);
      case 'n':
        this.type = new Knight(this.color, this.square);
      case 'b':
        this.type = new Bishop(this.color, this.square);
      case 'k':
        this.type = new King(this.color, this.square);
      case 'q':
        this.type = new Queen(this.color, this.square);
      default:
        console.error(`Expected piece type as a one-letter string, but got "${type}".`);
    }

即使我将'p'传递给函数,也很显然是'p' === 'p',但在底部却出现了错误,因此应该没有错误。我尝试了几种不同的方法来解决此问题。首先,我尝试以以下格式将代码重写为if语句而不是switch语句:

if (type == 'p') {
  this.type = new Pawn(this.color, this.square);
} else if (type == 'r') {
  // same as above but with Rook()
} // ... and as such for all the other piece types
else {
  console.error(`Expected piece type as a one-letter string, but got "${type}".`);
}

...我仍然会收到错误!

我也尝试用其他所有片段类型('r','n','b','q'和'k'替换字符串'p'无济于事。

为什么这不起作用?我看不出有什么错吗?

javascript string if-statement switch-statement
2个回答
2
投票

MDN:

与每个case标签关联的可选break语句可确保一旦执行了匹配的语句,程序便会退出switch,并在switch之后的语句处继续执行。如果省略break,则程序在switch语句中的下一个语句处继续执行。

如果您不希望脚本继续执行switch语句中的行直到到达break,则需要添加console.error语句。

喜欢这个:

  switch (type) { // "type refers to the third argument, 'p', from the code above
      case 'p':
        this.type = new Pawn(this.color, this.square);
        break;
      case 'r':
        this.type = new Rook(this.color, this.square);
        break;
      case 'n':
        this.type = new Knight(this.color, this.square);
        break;
      case 'b':
        this.type = new Bishop(this.color, this.square);
        break;
      case 'k':
        this.type = new King(this.color, this.square);
        break;
      case 'q':
        this.type = new Queen(this.color, this.square);
        break;
      default:
        console.error(`Expected piece type as a one-letter string, but got "${type}".`);
    }

这是使用switch语句的预期模式。


1
投票

您只需要在每种情况的底部添加break;语句。 (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/switch

当前因为您没有break语句,所以将检查所有情况,包括默认情况。


0
投票

[就像其他人说的那样,的确,您在break语句的每个部分中都缺少了switch,但是您说过您还尝试使用if-else语句,并且遇到了相同的问题。如果您可以发布错误,那将会有所帮助。

我将很快删除它,但是我没有业力要评论。

© www.soinside.com 2019 - 2024. All rights reserved.