diff --git a/0000 b/0000 index cbb1f2f..ef5e356 100644 --- a/0000 +++ b/0000 @@ -1,6 +1,8 @@ Механика Маджонга -0.1.0 +0.2.0 https://git.opengamestudio.org/MAOH/MEXMA +x /⨐.js x /🎬.js -/🎬.череда \ No newline at end of file +/🎬.череда +x /📖.js \ No newline at end of file diff --git a/⨐.js b/⨐.js new file mode 100644 index 0000000..3007e1e --- /dev/null +++ b/⨐.js @@ -0,0 +1,65 @@ +фишкуМаджонгаМожноВыбрать = (индексы, индекс) => +{ + var позиция = позицияИндексаФишкиМаджонга(индекс); + // Проверяем заблокированность фишки одновременно с обеих сторон. + var слева = уФишкиМаджонгаЕстьСоседи(индексы, позиция, 0, -2); + var справа = уФишкиМаджонгаЕстьСоседи(индексы, позиция, 0, 2); + if (слева && справа) + { + return false; + } + + // Проверяем заблокированность сверху. + for (var смещениеСтолбца = -1; смещениеСтолбца < 2; ++смещениеСтолбца) + { + if (уФишкиМаджонгаЕстьСоседи(индексы, позиция, 1, смещениеСтолбца)) + { + return false; + } + } + + return true; +}; + + +// // // // + + +уФишкиМаджонгаЕстьСоседи = (индексы, позиция, смещениеСлоя, смещениеСтолбца) => +{ + for (var смещениеРяда = -1; смещениеРяда < 2; ++смещениеРяда) + { + var позицияСоседа = [ + позиция[0] + смещениеСлоя, + позиция[1] + смещениеРяда, + позиция[2] + смещениеСтолбца, + ]; + var индексСоседа = индексПозицииФишкиМаджонга(позицияСоседа); + if (индексСоседа in индексы) + { + return true; + } + } + return false; +}; + + +// // // // + + +позицияИндексаФишкиМаджонга = (индекс) => +{ + const x = Math.round(индекс / 1000000); + const y = Math.round((индекс - x * 1000000) / 1000); + const z = индекс - x * 1000000 - y * 1000; + return [x, y, z]; +}; + + +// // // // + + +индексПозицииФишкиМаджонга = (позиция) => +{ + return позиция[0] * 1000000 + позиция[1] * 1000 + позиция[2]; +}; \ No newline at end of file diff --git a/🎬.js b/🎬.js index f451f7b..4438a7e 100644 --- a/🎬.js +++ b/🎬.js @@ -1,4 +1,13 @@ -const ЗАДЕРЖКА = 100; +ОчиститьИндексыФишекМаджонгаОтУбранных = мир => +{ + for (var номер in мир.убранныеФишкиМаджонга) + { + var н = мир.убранныеФишкиМаджонга[номер]; + var позиция = мир.фишкиМаджонга[н]["📍"]; + var индекс = индексПозицииФишкиМаджонга(позиция); + delete мир.индексыФишекМаджонга[индекс]; + } +}; // // // // @@ -50,33 +59,4 @@ const ЗАДЕРЖКА = 100; { мир.уведомить("выбрали пару фишек маджонга разных групп"); } -}; - - -// // // // - - -ВыбратьФишкуМаджонга = мир => -{ - var номер = мир.фишкаМаджонгаДляВыбора; - // Отсекаем выбор одной и той же фишки. - if ( - мир.выбраннаяФишкаМаджонга && - мир.выбраннаяФишкаМаджонга == номер - ) { - return; - } - мир.выбраннаяФишкаМаджонга = номер; - мир.выбранныеФишкиМаджонга.push(номер); - мир.уведомить("изменили выбранные фишки маджонга"); -}; - - -// // // // - - -ПодготовитьМеханикуМаджонга = мир => -{ - мир.выбранныеФишкиМаджонга = []; - мир.задержкаУбиранияФишекМаджонга = ЗАДЕРЖКА; }; \ No newline at end of file diff --git a/🎬.череда b/🎬.череда index 42a2d82..a5e319d 100644 --- a/🎬.череда +++ b/🎬.череда @@ -3,4 +3,6 @@ выбрали пару фишек маджонга разных групп исключить из выбранных фишек маджонга первую выбрали пару фишек маджонга одной группы - убрать выбранную пару фишек маджонга с задержкой \ No newline at end of file + убрать выбранную пару фишек маджонга с задержкой +убрали фишки маджонга + очистить индексы фишек маджонга от убранных \ No newline at end of file diff --git a/📖.js b/📖.js new file mode 100644 index 0000000..48644a5 --- /dev/null +++ b/📖.js @@ -0,0 +1,53 @@ +const ЗАДЕРЖКА = 100; + + +// // // // + + +СоздатьИндексыФишекМаджонга = мир => +{ + мир.индексыФишекМаджонга = {}; + for (var н in мир.фишкиМаджонга) + { + var позиция = мир.фишкиМаджонга[н]["📍"]; + var индекс = индексПозицииФишкиМаджонга(позиция); + мир.индексыФишекМаджонга[индекс] = н; + }; +}; + + +// // // // + + +ВыбратьФишкуМаджонга = мир => +{ + var номер = мир.фишкаМаджонгаДляВыбора; + // Отсекаем выбор одной и той же фишки. + if ( + мир.выбраннаяФишкаМаджонга && + мир.выбраннаяФишкаМаджонга == номер + ) { + return; + } + // Проверяем доступность с точки зрения правил Маджонга. + var позиция = мир.фишкиМаджонга[номер]["📍"]; + var индекс = индексПозицииФишкиМаджонга(позиция); + if (!фишкуМаджонгаМожноВыбрать(мир.индексыФишекМаджонга, индекс)) + { + return; + } + + мир.выбраннаяФишкаМаджонга = номер; + мир.выбранныеФишкиМаджонга.push(номер); + мир.уведомить("изменили выбранные фишки маджонга"); +}; + + +// // // // + + +ПодготовитьМеханикуМаджонга = мир => +{ + мир.выбранныеФишкиМаджонга = []; + мир.задержкаУбиранияФишекМаджонга = ЗАДЕРЖКА; +}; \ No newline at end of file