boulier-standalone.js 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. const boulier = [[true,true,true,false,false,false], [true,true,true,false,false,false]];
  2. move(0, 1);
  3. print();
  4. move(0, 0);
  5. move(1, 2);
  6. print();
  7. move(1, 0);
  8. print();
  9. move(0, 4);
  10. move(1, 5);
  11. print();
  12. function move(line, col) {
  13. if (boulier.length <= line || boulier[line].length <= col || ! boulier[line][col]) {
  14. return false;
  15. }
  16. let data = boulier[line]
  17. // Détermine si il faut bouger les boules vers la gauche ou la droite
  18. let right = true;
  19. for (let i = col; i < data.length; i++) {
  20. if (!data[i]) {
  21. right = false;
  22. break;
  23. }
  24. }
  25. // Si a droite inverse la ligne
  26. if (right) {
  27. data = data.reverse();
  28. col = data.length - col - 1;
  29. }
  30. data = makemove(data, col);
  31. // Si a droite remet la ligne
  32. if (right) {
  33. data = data.reverse();
  34. }
  35. }
  36. function makemove(data, col) {
  37. // Compte le nombre de boule à deplacer et l'index pour faire le déplacement
  38. let cpt = 0;
  39. let gap = false;
  40. let index = null;
  41. for (let i = col; i < data.length; i++) {
  42. if (!gap && data[i]) {
  43. cpt++;
  44. data[i] = false;
  45. } else if (gap && data[i]) {
  46. index = i - 1;
  47. break;
  48. } else {
  49. gap = true;
  50. }
  51. }
  52. if (index == null) {
  53. index = data.length - 1;
  54. }
  55. // Déplace les boules
  56. for (let i = 0; i < cpt; i++) {
  57. data[index - i] = true;
  58. }
  59. return data;
  60. }
  61. function print() {
  62. let str = '';
  63. for (const line of boulier) {
  64. str += '-|';
  65. for (const boule of line) {
  66. if (boule) {
  67. str += 'o';
  68. } else {
  69. str += '-';
  70. }
  71. }
  72. str += '|-\n';
  73. }
  74. console.log(str);
  75. }