Раскладка Маджонга | Mahjong layout
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

106 lines
4.2KB

  1. разобратьРаскладкуKMahjongg = function(содержимое)
  2. {
  3. this.__преобразоватьСодержимоеВСтроки = () =>
  4. {
  5. var строки = содержимое.split(/\n/);
  6. this.строки = [];
  7. for (var номер in строки)
  8. {
  9. var строка = строки[номер].trim();
  10. // Пропускаем комментарии и пустые строки.
  11. if (строка.startsWith("#") || !строка.length)
  12. {
  13. continue;
  14. }
  15. this.строки.push(строка);
  16. }
  17. };
  18. this.__разобратьПараметры = () =>
  19. {
  20. var параметры = {
  21. "ширина": 32,
  22. "высота": 16,
  23. "глубина": 0,
  24. "версия": "1.0",
  25. };
  26. var префиксы = {
  27. "версия": "kmahjongg-layout-v",
  28. "глубина": "d",
  29. "ширина": "w",
  30. "высота": "h",
  31. };
  32. var удалитьЭлементов = 0;
  33. var строки = this.строки;
  34. for (var номер in строки)
  35. {
  36. var строка = строки[номер];
  37. // Версия.
  38. if (строка.startsWith(префиксы.версия))
  39. {
  40. параметры.версия = строка.substring(префиксы.версия.length);
  41. }
  42. // Глубина.
  43. else if (строка.startsWith(префиксы.глубина))
  44. {
  45. параметры.глубина = строка.substring(префиксы.глубина.length);
  46. }
  47. // Ширина.
  48. else if (строка.startsWith(префиксы.ширина))
  49. {
  50. параметры.ширина = строка.substring(префиксы.ширина.length);
  51. }
  52. // Высота.
  53. else if (строка.startsWith(префиксы.высота))
  54. {
  55. параметры.высота = строка.substring(префиксы.высота.length);
  56. }
  57. else
  58. {
  59. удалитьЭлементов = номер;
  60. break;
  61. }
  62. }
  63. this.строки.splice(0, удалитьЭлементов);
  64. if (параметры.глубина == 0)
  65. {
  66. параметры.глубина = this.строки.length / параметры.высота;
  67. }
  68. this.параметры = параметры;
  69. };
  70. this.__разобратьПозиции = () =>
  71. {
  72. const параметры = this.параметры;
  73. const строки = this.строки;
  74. var позиции = [];
  75. for (var номерСлоя = 0; номерСлоя < параметры.глубина; ++номерСлоя)
  76. {
  77. for (var ряд = 0; ряд < параметры.высота - 1; ++ряд)
  78. {
  79. for (var столбец = 0; столбец < параметры.ширина - 1; ++столбец)
  80. {
  81. const рядСлоя = ряд + (номерСлоя * параметры.высота);
  82. if (
  83. (строки[рядСлоя][столбец] == '1') &&
  84. (строки[рядСлоя][столбец + 1] == '2') &&
  85. (строки[рядСлоя + 1][столбец] == '4') &&
  86. (строки[рядСлоя + 1][столбец + 1] == '3')
  87. ) {
  88. позиции.push([номерСлоя, ряд, столбец]);
  89. }
  90. }
  91. }
  92. }
  93. this.позиции = позиции;
  94. };
  95. // Исполняем.
  96. this.__преобразоватьСодержимоеВСтроки();
  97. this.__разобратьПараметры();
  98. this.__разобратьПозиции();
  99. return this.позиции;
  100. };