пытаясь построить игру bin go, в то время как l oop бесконечен, не могу понять, почему - PullRequest
0 голосов
/ 14 января 2020

Я пытаюсь создать игру для бина go.

Это задание, которое нам было дано. Я написал все функции, которые мне нужны, однако «основная» функция, которая выполняет все это, у нее есть oop, которая не останавливается. Кажется, я не знаю, что делает его бесконечным, так как я дал условие, чтобы оно прекратилось в конце.

Код немного длинный. Я надеюсь, что вы можете помочь мне.

var gNums = []

var gPlayers = [

  {
    name: 'player1',
    hitCounts: 0,
    board: creatBingoBoard()
  },
  {
    name: 'player2',
    hitCounts: 0,
    board: creatBingoBoard()
  }
]
// var check=gPlayers[0].board[0][0].isHit = true
// console.table(printBingoBoard(gPlayers[0].board))
// console.table(printBingoBoard(gPlayers[1].board))

// var check = gPlayers[0].board[0][0].isHit = true
playBingo()
// console.table(gPlayers[0].board)

function playBingo() {
  // debugger
  resetNums()
  var isVictory = false
  while (!isVictory) {
    // console.log('still running!')
    var calledNum = drawNum(gNums)
    // console.log(calledNum)

    for (var i = 0; !isVictory && i < gPlayers.length; i++) {
      var player = gPlayers[i]
      markBoard(player, calledNum)
      isVictory = checkBingo(player)
    }
  }
}

function creatBingoBoard() {
  resetNums()
  var board = [];
  const SIZE = 5;
  for (var i = 0; i < SIZE; i++) {
    board[i] = [];
    for (var j = 0; j < SIZE; j++) {
      board[i][j] = {
        value: getRandomIntInclusive(0, 25),
        isHit: false
      }
    }
  }
  return board;
}

function printBingoBoard(board) {
  var bingoBoardCopy = []
  var size = board.length
  for (var i = 0; i < size; i++) {
    bingoBoardCopy[i] = []
    for (var j = 0; j < size; j++) {
      if (board[i][j].isHit === true) {
        bingoBoardCopy[i][j] = board[i][j].value + 'v'
      } else bingoBoardCopy[i][j] = board[i][j].value
    }
  }
  return bingoBoardCopy
}

function resetNums() {
  gNums = []
  for (var i = 0; i < 25; i++) {
    gNums.push(i)
  }
  return gNums
}

function drawNum(nums) {
  var index = getRandomIntInclusive(0, nums.length);
  var num = nums[index];
  nums.splice(index, 1);

  return num;
}

function markBoard(player, calledNum) {
  for (var i = 0; i < player.board.length; i++) {
    for (var j = 0; j < player.board.length; j++) {
      var cell = player.board[i][j]
      if (cell === calledNum) {
        player.hitCounts++
          cell.isHit = true
      }
    }

  }
  printBingoBoard(player.board)
}

function checkBingo(player) {
  // for (var i = 0; i < player.length; i++) {
  // if (player.hitsCount === 25) return true
  if (player.hitCounts === 25) {
    return true
  }

  return false;
}

function getRandomIntInclusive(min, max) {
  min = Math.ceil(min);
  max = Math.floor(max);
  return Math.floor(Math.random() * (max - min + 1)) + min; //The maximum is inclusive and the minimum is inclusive 
}

Ответы [ 3 ]

2 голосов
/ 14 января 2020

В markBoard вы проверяете значение player.board[i][j]. Это объект , но вы сравниваете его с числом . Значение цифры c, к которому вы стремитесь, похоже, равно player.board[i][j].value.

. Как отмечали другие в комментариях, лучший способ решения этой проблемы - использовать отладчик. Chrome Инструменты разработчика позволяют вам прикреплять точки останова и проверять значение ваших объектов в коде. Однако регистрация значений ваших переменных также является хорошим средством отладки.

0 голосов
/ 15 января 2020
var gNums = []

var gPlayers = [

  {
    name: 'player1',
    hitCounts: 0,
    board: creatBingoBoard()
  },
  {
    name: 'player2',
    hitCounts: 0,
    board: creatBingoBoard()
  }
]
// var check=gPlayers[0].board[0][0].isHit = true
console.table(printBingoBoard(gPlayers[0].board))
console.table(printBingoBoard(gPlayers[1].board))

// var check = gPlayers[0].board[0][0].isHit = true
playBingo()
// console.table(gPlayers[0].board)

function playBingo() {
  // debugger
  resetNums()
  var isVictory = false
  while (!isVictory) {
    // console.log('still running!')
    var calledNum = drawNum();
   //<-- Fix 1 for some reason callednum is coming as Undefined
    if(calledNum){
        // console.log(calledNum)
        for (var i = 0; !isVictory && i < gPlayers.length; i++) {
          var player = gPlayers[i]
          markBoard(player, calledNum)
          isVictory = checkBingo(player)
        }
    }
    //<-- Fix 2 I am stopping fo gNums is empty 
    if(gNums.length == 0) isVictory=true;

  }
  console.table(printBingoBoard(gPlayers[0].board))
  console.table(printBingoBoard(gPlayers[1].board))
}

function creatBingoBoard() {
  resetNums()
  var board = [];
  const SIZE = 5;
  for (var i = 0; i < SIZE; i++) {
    board[i] = [];
    for (var j = 0; j < SIZE; j++) {
      board[i][j] = {
        value: getRandomIntInclusive(0, 25),
        isHit: false
      }
    }
  }
  return board;
}

function printBingoBoard(board) {
  var bingoBoardCopy = []
  var size = board.length
  for (var i = 0; i < size; i++) {
    bingoBoardCopy[i] = []
    for (var j = 0; j < size; j++) {
      if (board[i][j].isHit === true) {
        bingoBoardCopy[i][j] = board[i][j].value + 'v'
      } else bingoBoardCopy[i][j] = board[i][j].value
    }
  }
  return bingoBoardCopy
}

function resetNums() {
  gNums = []
  for (var i = 0; i < 25; i++) {
    gNums.push(i)
  }
  return gNums
}

function drawNum() {
  var index = getRandomIntInclusive(0, gNums.length);
  var num = gNums[index];
  gNums.splice(index, 1);

  return num;
}

function markBoard(player, calledNum) {
  for (var i = 0; i < player.board.length; i++) {
    for (var j = 0; j < player.board.length; j++) {
      var cell = player.board[i][j]
  //<-- Fix3 Cell is a object so we need to check with value 
      if (cell.value === calledNum) {
        player.hitCounts++
          cell.isHit = true
      }
    }

  }
  printBingoBoard(player.board)
}

function checkBingo(player) {
  // for (var i = 0; i < player.length; i++) {
  // if (player.hitsCount === 25) return true
  if (player.hitCounts === 25) {
    return true
  }

  return false;
}

function getRandomIntInclusive(min, max) {
  min = Math.ceil(min);
  max = Math.floor(max);
  return Math.floor(Math.random() * (max - min + 1)) + min; //The maximum is inclusive and the minimum is inclusive 
}
0 голосов
/ 14 января 2020

Получил это на работу!

Я старался не связываться с вашим кодом слишком много.

Мои изменения помечены // <- fix.

  1. Просто показывая, кто победил:)
  2. Вы никогда не push ed 25.
  3. По одному.
  4. Вы сравнивали выпавший номер с cell, вместо cell х value.

var gNums = []

var gPlayers = [

  {
    name: 'player1',
    hitCounts: 0,
    board: creatBingoBoard()
  },
  {
    name: 'player2',
    hitCounts: 0,
    board: creatBingoBoard()
  }
]
// var check=gPlayers[0].board[0][0].isHit = true
// console.table(printBingoBoard(gPlayers[0].board))
// console.table(printBingoBoard(gPlayers[1].board))

// var check = gPlayers[0].board[0][0].isHit = true
playBingo()
// console.table(gPlayers[0].board)

function playBingo() {
  // debugger
  resetNums()
  var isVictory = false
  let totalNumbersCalled = 0;
  while (!isVictory) {
    var calledNum = drawNum(gNums)
    console.log(++totalNumbersCalled, '->', calledNum);

    for (var i = 0; !isVictory && i < gPlayers.length; i++) {
      var player = gPlayers[i]
      markBoard(player, calledNum)
      isVictory = checkBingo(player)
    }
  }
  console.log('Player', i - 1, 'wins!'); // <- fix 1
}

function creatBingoBoard() {
  resetNums()
  var board = [];
  const SIZE = 5;
  for (var i = 0; i < SIZE; i++) {
    board[i] = [];
    for (var j = 0; j < SIZE; j++) {
      board[i][j] = {
        value: getRandomIntInclusive(0, 25),
        isHit: false
      }
    }
  }
  return board;
}

function printBingoBoard(board) {
  var bingoBoardCopy = []
  var size = board.length
  for (var i = 0; i < size; i++) {
    bingoBoardCopy[i] = []
    for (var j = 0; j < size; j++) {
      if (board[i][j].isHit === true) {
        bingoBoardCopy[i][j] = board[i][j].value + 'v'
      } else bingoBoardCopy[i][j] = board[i][j].value
    }
  }
  return bingoBoardCopy
}

function resetNums() {
  gNums = []
  for (var i = 0; i <= 25; i++) { // <- fix 2
    gNums.push(i)
  }
  return gNums
}

function drawNum(nums) {
  var index = getRandomIntInclusive(0, nums.length - 1); // <- fix 3
  var num = nums[index];
  nums.splice(index, 1);

  return num;
  ;
}

function markBoard(player, calledNum) {
  for (var i = 0; i < player.board.length; i++) {
    for (var j = 0; j < player.board.length; j++) {
      var cell = player.board[i][j]
      if (cell.value === calledNum) { // <- fix 4
        player.hitCounts++
          cell.isHit = true
      }
    }

  }
  printBingoBoard(player.board)
}

function checkBingo(player) {
  // for (var i = 0; i < player.length; i++) {
  // if (player.hitsCount === 25) return true
  if (player.hitCounts === 25) {
    return true
  }

  return false;
}

function getRandomIntInclusive(min, max) {
  min = Math.ceil(min);
  max = Math.floor(max);
  //The maximum is inclusive and the minimum is inclusive 
  return Math.floor(Math.random() * (max - min + 1)) + min;
}
...