На каждой итерации, пока
i меньше длины
pipe.length будет выполняться:
1. функция
ctx.drawImage с переданными аргументами
pipeUp, pipe[i].x, pipe[i].y
2. снова эта же функция, с другими аргументами
pipeBottom, pipe[i].x, pipe[i].y + pipeUp.height + gap
3.
pipe[i].x-- - происходит декремент, то есть уменьшение pipe[i].x на единицу
4. Идет проверка: равно ли и есть ли совпадение с типом
pipe[i].x === 125
Если условие проверки выполнено, то в конец массива pipe добавляется объект с ключем
x, котрый равен
cvs.width и с ключем
y , который равен
Math.floor(Math.random() * pipeUp.height) - pipeUp.height
или
{
x: cvs.width,
y: Math.floor(Math.random() * pipeUp.height) - pipeUp.height
}