Мне нужно создать бесконечный цикл - PullRequest
0 голосов
/ 04 ноября 2018

Для моей цели мне нужно создать цикл, где одна переменная зацикливается следующим образом: 0, 1, 2, 3, 4, 3, 2, 1, 0, 1, 2, 3, 4, 3, 2, 1 ...

Это выглядит просто, но больше часа мне интересно, как это сделать. Моя цель - двигать звезду таким образом

*....
.*...
..*..
...*.
....*
...*.
..*..
.*...
*....
*....
.*...
..*..
...*.
....*

Ответы [ 5 ]

0 голосов
/ 04 ноября 2018
(function(min,max,max_loops)
{
    for(var loop = 1; loop <= max_loops; loop++, [min,max] = [-max,-min])
    {
        for(num = min; num < max + (loop == max_loops); num++)
        {
            console.log(".".repeat(Math.abs(num)) + "*" +  ".".repeat(Math.max(Math.abs(max),Math.abs(min)) - Math.abs(num)))
        }
    }
})(0,4,3)

Но так как вам нужен бесконечный цикл, использование генератора должно быть более подходящим.

0 голосов
/ 04 ноября 2018

Вы можете иметь простой счетчик, а затем использовать modulo 8 для получения итераций.

let x = (i += direction) % 8;
let y = x > 4 ? 8 - x : x;

В этом примере даже печатается ascii art;)

let i = -1;
let direction = +1;
const out = [
  "*....",
  ".*...",
  "..*..",
  "...*.",
  "....*",
  "...*.",
  "..*..",
  ".*...",
  "*....",
];
setInterval(function() {
  let x = (i += direction) % 8;
  let y = x > 4 ? 8 - x : x;
  window.document.write(y + " " + out[x] + "<br>");
}, 1000);
0 голосов
/ 04 ноября 2018

Запишите этот цикл как генератор (function *... yield) и затем используйте его, когда вам это нужно (for...of). Конечно, код потребления должен обеспечивать условие завершения.

function* bounce(min, max) {
  while (1) {
    for (let i = min; i < max; i++)
      yield i;
    for (let i = max; i > min; i--)
      yield i;
  }
}

STEPS = 10

for(let x of bounce(0, 4)) {
  console.log(x)
  if (--STEPS === 0) break;
}
0 голосов
/ 04 ноября 2018

Вы можете использовать следующий код, чтобы сгенерировать требуемый шаблон чисел. Однако вы не сможете запускать его бесконечно, так как это приведет к сбою браузера.

Если вы хотите проверить, я добавил инструкции для создания бесконечного цикла.

Для вашего требования будет достаточно большего значения для переменной rep.

let min = 0; // Start/min value
let max = 4; // Max value
let dir = 1; // Count direction (+1/-1)

let counter = min; // Your counter variable

let rep = 24; // Remove this line and change condition inside while to true for infinite loop

do {
  console.log(counter);

  dir = counter===max?-1:counter===min?1:dir;
  counter+=dir;
} while (rep-->0); // Change this expression to true for infinite loop
0 голосов
/ 04 ноября 2018

Вы можете использовать setTimeout или setInterval для этого:

let number = 0;
let increment = 1;
const from = 0;
const to = 4;

const starDiv = document.getElementById("star");

function printStar(number) {
  const text = [0, 1, 2, 3, 4].map(
    i => (i === number) ? '*' : '-'
  ).join('');
  starDiv.innerText = text;
}

function loop() {
  printStar(number);
  number += increment;

  if (number == to) {
    increment = -1;
  } else if (number == from) {
    increment = 1;
  }
}

const time = 10; // 10 millisecond between step
setInterval(loop, time);
<div id="star">
</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...