@@ -1,6 +1,8 @@ | |||||
Механика Маджонга | Механика Маджонга | ||||
0.1.0 | |||||
0.2.0 | |||||
https://git.opengamestudio.org/MAOH/MEXMA | https://git.opengamestudio.org/MAOH/MEXMA | ||||
x /⨐.js | |||||
x /🎬.js | x /🎬.js | ||||
/🎬.череда | |||||
/🎬.череда | |||||
x /📖.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]; | |||||
}; |
@@ -1,4 +1,13 @@ | |||||
const ЗАДЕРЖКА = 100; | |||||
ОчиститьИндексыФишекМаджонгаОтУбранных = мир => | |||||
{ | |||||
for (var номер in мир.убранныеФишкиМаджонга) | |||||
{ | |||||
var н = мир.убранныеФишкиМаджонга[номер]; | |||||
var позиция = мир.фишкиМаджонга[н]["📍"]; | |||||
var индекс = индексПозицииФишкиМаджонга(позиция); | |||||
delete мир.индексыФишекМаджонга[индекс]; | |||||
} | |||||
}; | |||||
// // // // | // // // // | ||||
@@ -50,33 +59,4 @@ const ЗАДЕРЖКА = 100; | |||||
{ | { | ||||
мир.уведомить("выбрали пару фишек маджонга разных групп"); | мир.уведомить("выбрали пару фишек маджонга разных групп"); | ||||
} | } | ||||
}; | |||||
// // // // | |||||
ВыбратьФишкуМаджонга = мир => | |||||
{ | |||||
var номер = мир.фишкаМаджонгаДляВыбора; | |||||
// Отсекаем выбор одной и той же фишки. | |||||
if ( | |||||
мир.выбраннаяФишкаМаджонга && | |||||
мир.выбраннаяФишкаМаджонга == номер | |||||
) { | |||||
return; | |||||
} | |||||
мир.выбраннаяФишкаМаджонга = номер; | |||||
мир.выбранныеФишкиМаджонга.push(номер); | |||||
мир.уведомить("изменили выбранные фишки маджонга"); | |||||
}; | |||||
// // // // | |||||
ПодготовитьМеханикуМаджонга = мир => | |||||
{ | |||||
мир.выбранныеФишкиМаджонга = []; | |||||
мир.задержкаУбиранияФишекМаджонга = ЗАДЕРЖКА; | |||||
}; | }; |
@@ -3,4 +3,6 @@ | |||||
выбрали пару фишек маджонга разных групп | выбрали пару фишек маджонга разных групп | ||||
исключить из выбранных фишек маджонга первую | исключить из выбранных фишек маджонга первую | ||||
выбрали пару фишек маджонга одной группы | выбрали пару фишек маджонга одной группы | ||||
убрать выбранную пару фишек маджонга с задержкой | |||||
убрать выбранную пару фишек маджонга с задержкой | |||||
убрали фишки маджонга | |||||
очистить индексы фишек маджонга от убранных |
@@ -0,0 +1,53 @@ | |||||
const ЗАДЕРЖКА = 100; | |||||
// // // // | |||||
СоздатьИндексыФишекМаджонга = мир => | |||||
{ | |||||
мир.индексыФишекМаджонга = {}; | |||||
for (var н in мир.фишкиМаджонга) | |||||
{ | |||||
var позиция = мир.фишкиМаджонга[н]["📍"]; | |||||
var индекс = индексПозицииФишкиМаджонга(позиция); | |||||
мир.индексыФишекМаджонга[индекс] = н; | |||||
}; | |||||
}; | |||||
// // // // | |||||
ВыбратьФишкуМаджонга = мир => | |||||
{ | |||||
var номер = мир.фишкаМаджонгаДляВыбора; | |||||
// Отсекаем выбор одной и той же фишки. | |||||
if ( | |||||
мир.выбраннаяФишкаМаджонга && | |||||
мир.выбраннаяФишкаМаджонга == номер | |||||
) { | |||||
return; | |||||
} | |||||
// Проверяем доступность с точки зрения правил Маджонга. | |||||
var позиция = мир.фишкиМаджонга[номер]["📍"]; | |||||
var индекс = индексПозицииФишкиМаджонга(позиция); | |||||
if (!фишкуМаджонгаМожноВыбрать(мир.индексыФишекМаджонга, индекс)) | |||||
{ | |||||
return; | |||||
} | |||||
мир.выбраннаяФишкаМаджонга = номер; | |||||
мир.выбранныеФишкиМаджонга.push(номер); | |||||
мир.уведомить("изменили выбранные фишки маджонга"); | |||||
}; | |||||
// // // // | |||||
ПодготовитьМеханикуМаджонга = мир => | |||||
{ | |||||
мир.выбранныеФишкиМаджонга = []; | |||||
мир.задержкаУбиранияФишекМаджонга = ЗАДЕРЖКА; | |||||
}; |