Настройки игрового поля “Сапер”

25
08 июля 2018, 15:10

не работает prompt()

var game = {
  askStandartField: confirm("Стандартные настройки?"),
  width: 10,
  height: 10,
  mineCount: 9,
  standartField: (function() {
    if (!game.askStandartField) {
    game.width = prompt("Длина поля")
    game.height = prompt("Высота поля");
    game.mineCount = prompt("Кол-во мин:");
}
}

Вот весь код чтобы вы лучше понимали:

var game = { 
  askStandartField: confirm("Стандартные настройки?"), 
  width: 10, 
  height: 10, 
  mineCount: 9, 
  standartField: (function() { 
    if (!game.askStandartField) { 
      game.width = prompt("Длина поля") 
      game.height = prompt("Высота поля"); 
      game.mineCount = prompt("Кол-во мин:"); 
    } 
  })(), 
  openCount: 0, 
  field: [], 
  fillField: function() { 
    for (var x = 0; x < game.width; x++) { 
      var row = []; 
      game.field.push(row); 
      for (var y = 0; y < game.height; y++) { 
        row.push(new setCellState()); 
      } 
    } 
    for (var i = 0; i < game.mineCount; i++) { 
      var xx = Math.floor(Math.random() * game.width); 
      var yy = Math.floor(Math.random() * game.height); 
      if (!game.field[xx][yy].isMine) { 
        game.field[xx][yy].isMine = true; 
      } else { 
        i--; 
      } 
    } 
  }, 
  drawField: function() { 
    $("body").append("<table id = 'table'>"); 
    for (var x = 0; x < game.width; x++) { 
      $("table").append("<tr>"); 
      for (var y = 0; y < game.height; y++) { 
        $("tr:last-child").append(`<td class="${game.field[x][y].isMine?'isMine':''}">`); 
      } 
    } 
  } 
}; 
game.fillField(); 
game.drawField(); 
$("td").click(function() { 
  $(this).addClass("isOpen"); 
});

Answer 1

Значения присваивающиеся полям литерала объекта вычисляются до того, как созданный объект присвоен указанной переменной, поэтому в случае

  standartField: (function() {
    if (!game.askStandartField) {
      game.width = prompt("Длина поля")
      game.height = prompt("Высота поля");
      game.mineCount = prompt("Кол-во мин:");
    }
  })(),

Внутри вызванной функции game будет undefined, так как функция вызывается раньше.

Исправить ошибку можно несколькими способами:

  1. убрать вызов функции при инициализации объекта:

    standartField: (function() {
        if (!game.askStandartField) {
          game.width = prompt("Длина поля")
          game.height = prompt("Высота поля");
          game.mineCount = prompt("Кол-во мин:");
        }
    }),
    

    и вызвать затем эту функцию: game.standartField();

  2. вообще убрать из объекта эти ненужные поля, так как они не хранят состояние объекта, а только инициализируют его. например:

    var game = { 
      width: 10, 
      height: 10, 
      mineCount: 9, 
      openCount: 0, 
      field: [], 
      fillField: function() { 
        for (var x = 0; x < game.width; x++) { 
          var row = []; 
          game.field.push(row); 
          for (var y = 0; y < game.height; y++) { 
            row.push(new setCellState()); 
          } 
        } 
        for (var i = 0; i < game.mineCount; i++) { 
          var xx = Math.floor(Math.random() * game.width); 
          var yy = Math.floor(Math.random() * game.height); 
          if (!game.field[xx][yy].isMine) { 
            game.field[xx][yy].isMine = true; 
          } else { 
            i--; 
          } 
        } 
      }, 
      drawField: function() { 
        $("body").append("<table id = 'table'>"); 
        for (var x = 0; x < game.width; x++) { 
          $("table").append("<tr>"); 
          for (var y = 0; y < game.height; y++) { 
            $("tr:last-child").append(`<td class="${game.field[x][y].isMine?'isMine':''}">`); 
          } 
        } 
      } 
    }; 
     
    function standartField() { 
      if (!confirm("Стандартные настройки?")) { 
        game.width = prompt("Длина поля") 
        game.height = prompt("Высота поля"); 
        game.mineCount = prompt("Кол-во мин:"); 
      } 
    } 
    game.fillField(); 
    game.drawField(); 
    $("td").click(function() { 
      $(this).addClass("isOpen"); 
    });

  3. не использовать функцию, а инициализировать каждое поле отдельно:

    var isStdFields = confirm("Стандартные настройки?"); 
    var game = { 
      width: isStdFields ? 10 : prompt("Длина поля"), 
      height: isStdFields ? 10 : prompt("Высота поля"), 
      mineCount: isStdFields ? 9 : prompt("Кол-во мин:"), 
      openCount: 0, 
      field: [], 
      fillField: function() { 
        for (var x = 0; x < game.width; x++) { 
          var row = []; 
          game.field.push(row); 
          for (var y = 0; y < game.height; y++) { 
            row.push(new setCellState()); 
          } 
        } 
        for (var i = 0; i < game.mineCount; i++) { 
          var xx = Math.floor(Math.random() * game.width); 
          var yy = Math.floor(Math.random() * game.height); 
          if (!game.field[xx][yy].isMine) { 
            game.field[xx][yy].isMine = true; 
          } else { 
            i--; 
          } 
        } 
      }, 
      drawField: function() { 
        $("body").append("<table id = 'table'>"); 
        for (var x = 0; x < game.width; x++) { 
          $("table").append("<tr>"); 
          for (var y = 0; y < game.height; y++) { 
            $("tr:last-child").append(`<td class="${game.field[x][y].isMine?'isMine':''}">`); 
          } 
        } 
      } 
    }; 
     
    game.fillField(); 
    game.drawField(); 
    $("td").click(function() { 
      $(this).addClass("isOpen"); 
    });

READ ALSO
Сборка мусора в стеке

Сборка мусора в стеке

Подскажите, пожалуйста, есть ли у значащих типов деструкторы, и происходит ли вызов деструктора при удалении объекта из стека?

40
c# stackoverflow Exception

c# stackoverflow Exception

Решил поексперементировать и написал вот такой код:

12
C# значения, выдаваемое индексатором

C# значения, выдаваемое индексатором

Читая книжку Шилдта C# наткнулся на следующую информацию

18
C#. Сохранить развернутые айтемы в TreeView

C#. Сохранить развернутые айтемы в TreeView

Я кодом обновляю содержимое TreeView:

21