0

我正在尝试创建一个函数来检查两副牌的顺序是否相同。

我编写了一个辅助函数 cardEq 来测试两张卡片是否相同,并且它可以工作。它在deckEq 函数中不起作用。

//Card Struct
//value 1 is ace, 11 is Jack, 12 is Queen, and 13 is King
function Card(suit, value, color){
  this.suit = suit,
  this.value = value,
  this.color = color
}

//Check if two Cards are the same
function cardEq(card1, card2){
  if(card1.suit === card2.suit
     && card1.value === card2.value
     && card1.color === card2.color){
    return true;
  } else {return false;}
}

//Check if two Decks/arrays of Cards are in the same order
function deckEq(deck1, deck2){
  let i = 0;
  let flag = false;
  while (i < 53){
    let x = deck1[i];
    let y = deck2[i];
    if(cardEq(x, y) === true){
      flag = true;
      i = i + 1;
    } else {flag = false; break;}
  }
  return flag;
}

我希望它返回 true 或 false,但它会抛出错误:TypeError: Cannot read property 'suit' of undefined at cardEq (repl:2:12) at deckEq (repl:7:8)

编辑:我将 while 语句中的 (i < 53) 更改为 (i < 52)。感谢@Christopher 和@traktor53 的捕获。我猜问题是该函数正在对数组中不存在的项目(第 52 个)调用 cardEq。由于这是为了比较套牌,它应该只运行到第 51 个元素(第 52 张牌)。

4

2 回答 2

0

正如@Christopher 所推测的那样,问题是检查 53 张卡片中的 52 张卡片的零基数组deckEq。将 while 循环语句更改为

  while (i < 52){

看到它在 52 张卡片组中正常工作 -

"use strict";
//Card Struct
//value 1 is ace, 11 is Jack, 12 is Queen, and 13 is King
function Card(suit, value, color){
  this.suit = suit,
  this.value = value,
  this.color = color
}

//Check if two Cards are the same
function cardEq(card1, card2){
  if(card1.suit === card2.suit
     && card1.value === card2.value
     && card1.color === card2.color){
    return true;
  } else {return false;}
}

//Check if two Decks/arrays of Cards are in the same order
function deckEq(deck1, deck2){
  let i = 0;
  let flag = false;
  while (i < 52){
    let x = deck1[i];
    let y = deck2[i];
    if(cardEq(x, y) === true){
      flag = true;
      i = i + 1;
    } else {flag = false; break;}
  }
  return flag;
}

function createDeck(){
    const deck = [];
    const colors = ["black", "red", "red", "black"];
    for( var i = 0; i < 52; ++i) {
        var suite = Math.floor( i / 13);
        var value = i % 13 + 1;
        var color = colors[ suite];
        deck.push( new Card( suite, value, color));
    }
    return deck;
}

let deck1 = createDeck();
let deck2 = createDeck();

console.log( deckEq( deck1, deck2));  // expect true
deck2[42] = deck2[0];
console.log( deckEq( deck1, deck2));  // expect false

最好使用甲板数组的长度来控制 while 循环迭代的次数,并在开始循环之前测试甲板具有相同的长度。

于 2018-12-23T22:15:40.080 回答
-1

this函数内部仅在函数用作“构造函数”时才有效,这需要new构造函数生成的对象的实例。那就是this将绑定到的对象,否则this将绑定到window并且window没有suit属性。

//Card Struct
//value 1 is ace, 11 is Jack, 12 is Queen, and 13 is King
function Card(suit, value, color){
  this.suit = suit,
  this.value = value,
  this.color = color
}

//Check if two Cards are the same
function cardEq(card1, card2){
  if(card1.suit === card2.suit
     && card1.value === card2.value
     && card1.color === card2.color){
    return true;
  } else {return false;}
}

//Check if two Decks/arrays of Cards are in the same order
function deckEq(deck1, deck2){
  let ceq = new cardEq(x,y); // <-- Need an instance produces by the function
  let i = 0;
  let flag = false;
  while (i < 53){
    let x = deck1[i];
    let y = deck2[i];
    if(ceq === true){  // <-- Use the instance
      flag = true;
      i = i + 1;
    } else {flag = false; break;}
  }
  return flag;
}

于 2018-12-23T21:31:13.877 回答