JavaScript纸牌游戏,如何比较两个字符串中的纸牌?

时间:2018-10-16 02:14:39

标签: javascript

我从这个社区学到了很多东西。这是我在这里的第一篇文章,最近我开始学习编码。  我正在通过创建一个在Alec和Bob之间玩的简单纸牌游戏来练习JS。  每个玩家从卡组轮流抽一张牌。抽出较高牌的玩家将赢得比赛。  我正在尝试找出Alec赢了多少场比赛?

这是我所做的:

function solution(A, B) {

    var card1, card2;
    var alecWin = 0;

    var cards = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"];

    var alecCards = A.split("");
    var bobCards = B.split("");

    for(var i=0; i< alecCards.length; i++){
        for(var j=0; j< bobCards.length; j++){
            alecIndex = alecCards.indexOf(i);
            bobIndex = bobCards.indexOf(j);
            if(alecIndex > bobIndex){
                alecWin++;
            }
        } 
        return alecWin;
    }
}

solution("23JK45", "352Q8")

我想返回亚历克赢得比赛的次数。谁能帮助我,并告诉我我做错了什么?

1 个答案:

答案 0 :(得分:3)

使用 one 循环而不是嵌套循环。然后,您要检查cards数组中每个玩家卡的索引,因此使用:

  alecIndex = cards.indexOf(alecCards[i]);
  bobIndex = cards.indexOf(bobCards[i]); // use i, not j - same index

然后您可以比较指标:

function solution(A, B) {

  var card1, card2;
  var alecWin = 0;

  var cards = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"];

  var alecCards = A.split("");
  var bobCards = B.split("");

  for (var i = 0; i < alecCards.length; i++) {
      alecIndex = cards.indexOf(alecCards[i]);
      bobIndex = cards.indexOf(bobCards[i]);
      if (alecIndex > bobIndex) alecWin++;
  }

  return alecWin;

}

console.log(solution("23JK4", "352Q8"));

但是,使用卡标签索引的对象或Map会更容易,更快捷(复杂度更低),其值就是该卡的索引。请注意,无需将字符串转换为数组,str[index]在字符串上的效果很好:

function solution(A, B) {
  const cards = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"];
  const cardObj = cards.reduce((a, label, i) => {
    a[label] = i;
    return a;
  }, {});
  let winCount = 0;
  for (let i = 0; i < A.length; i++) {
    if (cardObj[A[i]] > cardObj[B[i]]) winCount++;
  }
  return winCount;
}

console.log(solution("23JK4", "352Q8"));

还请注意,您应该修正输入内容:两个输入字符串的长度都应为相同,以得到有意义的结果。