Сцена Маджонга | Mahjong scene
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.

83 line
2.3KB

  1. фишкуМожноВыбрать = (индексы, индекс) =>
  2. {
  3. var позиция = позицияИндексаФишки(индекс);
  4. // Проверяем заблокированность фишки одновременно с обеих сторон.
  5. var слева = уФишкиЕстьСоседи(индексы, позиция, 0, -2);
  6. var справа = уФишкиЕстьСоседи(индексы, позиция, 0, 2);
  7. if (слева && справа)
  8. {
  9. return false;
  10. }
  11. // Проверяем заблокированность сверху.
  12. for (var смещениеСтолбца = -1; смещениеСтолбца < 2; ++смещениеСтолбца)
  13. {
  14. if (уФишкиЕстьСоседи(индексы, позиция, 1, смещениеСтолбца))
  15. {
  16. return false;
  17. }
  18. }
  19. return true;
  20. };
  21. // // // //
  22. уФишкиЕстьСоседи = (индексы, позиция, смещениеСлоя, смещениеСтолбца) =>
  23. {
  24. for (var смещениеРяда = -1; смещениеРяда < 2; ++смещениеРяда)
  25. {
  26. var позицияСоседа = [
  27. позиция[0] + смещениеСлоя,
  28. позиция[1] + смещениеРяда,
  29. позиция[2] + смещениеСтолбца,
  30. ];
  31. var индексСоседа = индексПозицииФишки(позицияСоседа);
  32. if (индексСоседа in индексы)
  33. {
  34. return true;
  35. }
  36. }
  37. return false;
  38. };
  39. // // // //
  40. позицияИндексаФишки = (индекс) =>
  41. {
  42. const x = индекс / 1000000;
  43. const y = (индекс - x * 1000000) / 1000;
  44. const z = индекс - x * 1000000 - y * 1000;
  45. return [x, y, z];
  46. };
  47. // // // //
  48. индексПозицииФишки = (позиция) =>
  49. {
  50. return позиция[0] * 1000000 + позиция[1] * 1000 + позиция[2];
  51. };
  52. // // // //
  53. номерФишки = (фишки, id) =>
  54. {
  55. for (var номер in фишки)
  56. {
  57. var фишка = фишки[номер];
  58. if (фишка.id == id)
  59. {
  60. return номер;
  61. }
  62. }
  63. return null;
  64. };