Отслеживание переменных внутри класса при многократном использовании метода

#javascript #oop

#javascript #ооп

Вопрос:

Я работаю на Ruby, поэтому немного потрудился, пытаясь выучить Javascript. Я инициализирую класс с именем Game и вставляю в него количество игроков. У меня есть метод этого класса, который называется move , который делает ход за игрока. Проблема, с которой я сталкиваюсь, заключается в том, что если я делаю несколько ходов подряд, переменные сбрасываются при каждом запуске метода.

С помощью метода move я хочу отслеживать текущие перемещения игроков, а также отслеживать общее количество сыгранных кубиков, независимо от игрока, который это перемещает.

У вас есть какое-либо представление? Был бы признателен за любую помощь! Спасибо.

 function Game(players) {
  _players = createPlayers(players);
  _total_dice = totalDice(players);

  this.move = function(id, dice, value) {
    current_player = _players[id - 1];
    current_player = { id: current_player.id, dice_middle: dice, value: value, dice_left: current_player.dice_left - dice }
    total_dice = _total_dice - dice;
  }
}


function createPlayers(amount) {
  var players = [];
  var player_count = new Array(amount).join().split(',').map(function(item, index){ return   index; })

  for ( var i = 0; i < player_count.length; i  ) {
    player = { id: i   1, dice_middle: 0, value: 0, dice_left: 5 }
    players.push(player);
  }

  return players;
}

function totalDice(amount) {
  total = amount * 5;
  return total;
}
  

и вот как я инициализирую Game и совершаю действия.

 var game = new Game(4);
game.move(1, 2, 3);
game.move(1, 1, 3);
  

При каждом перемещении переменные вводятся повторно, поэтому в этом примере общее количество кубиков остается на уровне 20, а ходы игрока не «сохраняются».

Ответ №1:

Функции — это просто функции, они не ведут себя как класс. Попробуйте использовать класс ES6, он должен делать то, что вы хотите — пример ниже (непроверенный):

 class Game {
   constructor(players) {
     this._players =  this.createPlayers(players);
     this._total_dice = this.totalDice(players)       
   }

   move (id, dice, value) {
     current_player = this._players[id - 1];
     current_player = { id: current_player.id, dice_middle: dice, value: value, dice_left: current_player.dice_left - dice }
     total_dice = this._total_dice - dice;
   }


   createPlayers(amount) {
     var players = [];
     var player_count = new Array(amount).join().split(',').map(function(item, index){ return   index; })

     for ( var i = 0; i < player_count.length; i  ) {
        player = { id: i   1, dice_middle: 0, value: 0, dice_left: 5 }
        players.push(player);
     }

     return players;
  }


  totalDice(amount) {
     total = amount * 5;
     return total;
  }
}
  

Комментарии:

1. Спасибо, чувак — пришлось изменить пару вещей, но все заработало. Просто интересно, если бы у меня была обычная функция, за которой мне не нужно было следить, как бы я ее настроил, чтобы я мог использовать ее в move , например?

Ответ №2:

Вы написали внутри функции перемещения

    this.move = function(id, dice, value) {
         total_dice = _total_dice - dice;
      }
  

Если я правильно предполагаю, что в total_dice есть опечатка, это должно быть _total_dice. Отсутствует «_»