fork download
  1. >>400478
  2.  
  3. Вообще, код работает. Это хорошо, но тут есть что исправить:
  4.  
  5. Шаблоны окна победы и проигрыша слишком похожи, надо избавиться от копипасты.
  6.  
  7. Окошко лучше расположить по центру. Не стоит привязывать его размер к ширине окна, лучше сделать чтобы он зависел только от содержимого + поля.
  8.  
  9. На окне «вы победили» текст черный на темном фоне, надо сделать светлый. Также, можешь попрбовать сделать фон окошка чуть прозрачным (alpha = 0.8), а кнопку оставить непрозрачной.
  10.  
  11. > if ( classes.indexOf(' ' + klass + ' ') >= 0 ) {
  12. > return true;
  13. Можно писать return x >= 0; так как оператор сравнения возвращает true или false
  14.  
  15. > Util.toggleContentOfTag
  16. Это неудачный способ, читать innerHTML. Гораздо лучше завести в Cell поле, показывающее есть флаг или нет.
  17.  
  18. Насчет функции showWindow(...), а зачем ты передаешь self? Это не надо, можно просто:
  19.  
  20. .... // где-то Field или внешнем коде
  21. Util.showWindow('win', function (...) {
  22. self.newGame(...);
  23. });
  24.  
  25. А self и так будет доступна.
  26.  
  27. То, что у тебя — очень странно выглядит. Ты разбираешься в замыканиях? Решал первые задачи отсюда (или понимаешь как они решаются?)? https://g...content-available-to-author-only...b.com/codedokode/ce30e7a036f18f416ae0
  28.  
  29. Алсо, если уж передавать self то логично при вызове функции передавать его в качестве this. Ты знаешь про методы apply/call/bind? Если нет то очень плохо.
  30.  
  31. > cell.getCoorByCell(...).x,
  32. Не проще было сделать cell.getX(...) ?
  33.  
  34. > this.cells[x] !== undefined
  35. Есть оператор in, зачем костыли?
  36.  
  37. Неиспользуемые функции типа Util.clickBtn хорошо бы удалять.
  38.  
  39. В функции Field.prototype.openCell есть огромный if размером со всю функцию. Это плохо, надо исправить, например с помощью return
  40.  
  41. > if (mines !== 0) {
  42. > if (mines === 0) {
  43.  
  44. Используй else
  45.  
  46. > var td = this.cells[x][y].getTd(...);
  47. > Util.clearClass(td);
  48. Ты опять лезешь в зону ответственности другого класса и нарушаешь инкапсуляцию. Тут надо написать
  49.  
  50. this.cells[x][y].clear(...);
  51.  
  52. То есть ты должен сказать ячейке: «очисти себя», а не лезть руками ее очищать.
  53.  
  54. Непонятно зачем вызвать this.closeCells после this.generateCells
  55.  
  56. > <span>
  57. А span зачем?
  58.  
  59. > target.setAttribute('oncontextmenu'
  60. Костыль. Используй предотвращение действия по умолчанию в обработчике mousedown, если не работает то сделай обработчик события oncontextmenu через addEventListener
  61.  
  62.  
Success #stdin #stdout 0.01s 20568KB
stdin
Standard input is empty
stdout
>>400478

Вообще, код работает. Это хорошо, но тут есть что исправить:

Шаблоны окна победы и проигрыша слишком похожи, надо избавиться от копипасты.

Окошко лучше расположить по центру. Не стоит привязывать его размер к ширине окна, лучше сделать чтобы он зависел только от содержимого + поля.

На окне «вы победили» текст черный на темном фоне, надо сделать светлый. Также, можешь попрбовать сделать фон окошка чуть прозрачным (alpha = 0.8), а кнопку оставить непрозрачной.

> if ( classes.indexOf(' ' + klass + ' ') >= 0 ) { 
>    return true; 
Можно писать return x >= 0; так как оператор сравнения возвращает true или false

> Util.toggleContentOfTag
Это неудачный способ, читать innerHTML. Гораздо лучше завести в Cell поле, показывающее есть флаг или нет.

Насчет функции showWindow(...), а зачем ты передаешь self? Это не надо, можно просто:

.... // где-то Field или внешнем коде
Util.showWindow('win', function (...) {
self.newGame(...);
});

А self и так будет доступна.

То, что  у тебя — очень странно выглядит. Ты разбираешься в замыканиях? Решал первые задачи отсюда (или понимаешь как они решаются?)?  https://g...content-available-to-author-only...b.com/codedokode/ce30e7a036f18f416ae0

Алсо, если уж передавать self то логично при вызове функции передавать его в качестве this. Ты знаешь про методы apply/call/bind? Если нет то очень плохо.

> cell.getCoorByCell(...).x,
Не проще было сделать cell.getX(...) ? 

> this.cells[x] !== undefined
Есть оператор in, зачем костыли? 

Неиспользуемые функции типа Util.clickBtn хорошо бы удалять.

В функции Field.prototype.openCell есть огромный if размером со всю функцию. Это плохо, надо исправить, например с помощью return

> if (mines !== 0) {
> if (mines === 0) {

Используй else 

> var td = this.cells[x][y].getTd(...);    
>      Util.clearClass(td);
Ты опять лезешь в зону ответственности другого класса и нарушаешь инкапсуляцию. Тут надо написать

this.cells[x][y].clear(...);

То есть ты должен сказать ячейке: «очисти себя», а не лезть руками ее очищать.

Непонятно зачем вызвать this.closeCells после this.generateCells

> <span>⚑
А span зачем? 

> target.setAttribute('oncontextmenu'
Костыль. Используй предотвращение действия по умолчанию в обработчике mousedown, если не работает то сделай обработчик события oncontextmenu через addEventListener