【问题标题】:Javascript Array Test Behaves False When Is True当为真时,Javascript 数组测试的行为为假
【发布时间】:2018-06-02 03:12:29
【问题描述】:

我正在尝试使用 Node.js 制作多人扑克游戏,但最近遇到了很多问题。这是一个主要的。此代码应该从数组中识别顺手。但是,我的代码显然不是通用的。我制作了 2 个数组作为测试用例,即使只有一个数组被识别为直线,也会产生不同的结果。请帮忙。

代码如下:

    var arr = [9,1,2,11,8,12,10];   // first array
    var arr2 = [9,1,8,4,5,3,2];     // second array
    var straight = [];

    // Removes duplicate elements in an array
    /* example:
    array = removeDuplicates(array)
    */
    function removeDuplicates(arr){
        let unique_array = []
        for(let i = 0;i < arr.length; i++){
            if(unique_array.indexOf(arr[i]) == -1){
                unique_array.push(arr[i])
            }
        }
        return unique_array
    }

    //Sorts the array
    arr.sort(function(a,b){return b-a});

    //Removes duplicates
    arr = removeDuplicates(arr);

    // Displays sorted and cleaned up array
    console.log(arr)

    /*Basic translation: loops through the array
    and if the difference between the a term and
    the term after it is 1, it will append it to the 
    array 'straight'. It will break if the difference 
    is greater than 1. Then it will remove those elements
    from the original array and retry to append consecutive
    elements in the 'straight' array.
    */
    for (var i=1; i<arr.length+1; i++) {
      if (arr[i-1] - arr[i] === 1) {
        straight.push(arr[i-1],arr[i]); // error occurs at this line
      } else if (arr[i-1] - arr[i] > 1){
        break; }

        if (straight.length === 2) {
          arr.splice(arr.indexOf(straight[0]),1)
          arr.splice(arr.indexOf(straight[1]),1)
          straight = [];

          for (var i=1; i<arr.length; i++) {
            if (arr[i-1] - arr[i] === 1) {
              straight.push(arr[i-1],arr[i]);
            }
          }
        }
    };

    // There are duplicates and I don't know why sometimes
    straight = removeDuplicates(straight)
    console.log(straight);

由于某种原因,这不起作用。但是如果你改变它只会对第一个数组正常工作

straight.push(arr[i-1],arr[i]); 

straight.push(arr[i-1],arr[i],arr[i]);

如果您切换变量名,它仅适用于第二个数组:

  var arr2 = [9,1,2,11,8,12,10];   // first array
  var arr = [9,1,8,4,5,3,2];     // second array

并在没有进一步更改的情况下运行代码,我不知道为什么会这样。我什至记录了布尔值

    arr[i-1] - arr[i] === 1

到控制台(我的意思是在循环中),它连续四次出现(遍历数组的前 5 个索引),所以我不知道为什么它在 11 处停止第一个数组并确定 11-10 不是 1。

【问题讨论】:

  • 我想知道为什么你需要变量straight。您不需要检查每个元素是否大于排序数组中的最后一个元素吗?
  • 是的,但是我创建了数组straight,以便我可以操作第一个数组中的元素并将其放入straight,以便以后可以在需要时重用原始数组。

标签: javascript arrays node.js boolean poker


【解决方案1】:

您的逻辑有点难以理解 - 我认为您看到的问题是由于清除了 if (straight.length === 2) 部分中的 straight 数组。这是我简化事情的方法:

const isStraight = a => { 
  const uniq = a.filter((val, idx) => a.indexOf(val) === idx);
  uniq.sort((a, b) => a-b); 
  const tries = uniq.length - 4;
  for (var i=0; i<tries; i++) {
    if (uniq[i + 4] - uniq[i] === 4) {
      return true;
    }
  }
  return false; 
}

console.log(isStraight([9,1,2,11,8,12,10]));
console.log(isStraight([9,1,8,4,5,3,2]));
console.log(isStraight([2,5,4,3,6,8,7]));
console.log(isStraight([2,5,4,3,6,8,7,10]));
console.log(isStraight([2,5,2,4,7,3,6,8,8,8,8,7]));
console.log(isStraight([1,2,3,4,6,7,8,9,11,12,13,13]))

【讨论】:

  • 谢谢,但这并不适合我需要它做的事情......而且我对 js 有点陌生,所以我不完全知道如何让你的代码适合帮帮我.... straight 数组只应该在从原始数组中删除不连续的值(在第一个数组中是连续的)后被清除。不过,谢谢。
  • 我的错 - 我忘了这是扑克,所以你只需要连续 5 个 - 我更新了我的答案
  • 谢谢一百万,我已经在这几个小时了。我也理解你的代码,很好。基本上是寻找 4 范围内的值。
【解决方案2】:

let arr = [9,1,2,11,8,12,10];

function checkStraight(arr) {
  let answer = [];
  
  if(arr.length < 5)
    return false;

  arr = [...new Set(arr)];
  arr.sort(function(a,b){return b-a});

  for(let index=0; index < arr.length; index++){
    if(answer.length === 5) break;

    if(answer.length === 0){
      answer.push(arr[index])
    }

    if(answer[answer.length-1] - arr[index] === 1){
    	answer.push(arr[index]);
    }else{
      answer = [];
      answer.push(arr[index])
    }
  } 
  
  return answer
}

console.log(checkStraight(arr));

您可以尝试通过代码运行,应该很简单。基本上不是在自己数组中的元素之间进行比较,而是在两个数组之间进行比较,并有条件地将匹配的直牌推入新数组中

**假设:**由于我们在玩扑克,假设一旦找到连续 5 张牌,则认为是顺子,不需要进一步检查

【讨论】:

  • 谢谢,但是当我测试我的阵列时它不起作用
  • @user9883729:由于错过了唯一的检查和排序,它无法与您的数组一起使用。你可以再看看
猜你喜欢
  • 1970-01-01
  • 2021-02-20
  • 2010-11-09
  • 2015-07-25
  • 2016-08-26
  • 1970-01-01
  • 2022-09-28
  • 1970-01-01
  • 2012-12-06
相关资源
最近更新 更多