Функция JavaScript, которая каждый раз принимает случайный аргумент

Я работаю над игрой Canvas API, и я хочу создать несколько врагов, каждый раз, когда я создаю новый экземпляр врага, я хочу, чтобы он создавался в новой позиции (не случайным образом, а скорее в трех конкретных позициях.

Допустим, у меня есть эта функция:

var enemy = new Enemy(0, Math.random() * 184 + 50, Math.random() * 256);

Это создает нового врага с положением Y, равным 0, положением X, которое является случайным, и аргументом Speed, который также случайным.

Это отлично работает, но я хочу, чтобы враги создавались только в 3 определенных положениях, а скорость увеличивалась только на 10 каждый раз, когда создается новый экземпляр врага.

Дополнительная информация: новые враги вызываются, когда игрок достигает финальной позиции, например:

var increaseDifficulty = function(numEnemies) {
    // remove all previous enemies on canvas
    allEnemies.length = 0;

    // load new set of enemies
    for (var i = 0; i <= numEnemies; i++) {
        var enemy = new Enemy(0, Math.random() * 184 + 50, Math.random() * 256);

        allEnemies.push(enemy);
    }
};

Я хочу создать нового врага с разными аргументами каждый раз. Только по положению и скорости.

Что-то вроде:

var enemy = new Enemy(0, 1, 1);

Во второй раз все будет иначе:

var enemy = new Enemy(0, 3, 2);

Конечно, значения не будут 1, 2 и 3, но идею вы поняли.

ОБНОВЛЕНИЕ:
Новый враг призывает к следующему:

var Enemy = function(x, y, speed) {
    this.x = x;
    this.y = y;
    this.speed = speed;
    this.sprite = 'images/enemy-bug.png';
};

Enemy.prototype.update = function(dt) {
    this.x += this.speed * dt;
    if (this.x >= 505) {
        this.x = 0;
    }

    checkCollision(this);
};
Enemy.prototype.render = function() {
    ctx.drawImage(Resources.get(this.sprite), this.x, this.y);
};

person Sparrky    schedule 07.12.2017    source источник
comment
Что вы имеете в виду под different expression?   -  person MUT    schedule 07.12.2017
comment
Я хотел сказать аргумент. Извините, я редактировал вопрос.   -  person Sparrky    schedule 07.12.2017
comment
Непонятно, чего вы хотите добиться. Сколько врагов вы создаете, когда увеличиваете сложность? В частности, сколько раз повторяется цикл for? Сколько вы на самом деле хотите создать? 3? Или 1, но выбрать случайным образом из 3 позиций, которые вы произвольно генерируете где-то в начале (когда вы все инициализируете)? Как создать первого врага?   -  person Adelin    schedule 07.12.2017
comment
Пожалуйста, отредактируйте свой вопрос, чтобы добавить больше информации. Не добавляйте информацию в качестве ответа.   -  person Dmitry    schedule 07.12.2017
comment
Хорошо, готово, вы все еще не понимаете вопроса?   -  person Sparrky    schedule 07.12.2017
comment
Каким образом знание того, сколько экземпляров врагов создано, может иметь какое-либо значение?   -  person Sparrky    schedule 07.12.2017
comment
Вы написали, что Y всегда 0, но в ваших примерах вы передаете 0 в x   -  person Dmitry    schedule 07.12.2017


Ответы (2)


Y всегда равен 0, поэтому нет смысла передавать его конструктору, speed имеет некоторое начальное значение, а затем всегда увеличивается на 10, поэтому передавать его тоже нет смысла. X - единственное, что является случайным, и есть смысл передать его конструктору, но я бы тоже этого не делал. Я бы создал массив возможных значений X и случайным образом выбрал бы одно из них внутри конструктора.

const xValues = [20, 60, 100];

//The Enemy "class":
function Enemy() {
    this.y = 0;
    this.x = xValues[Math.floor(Math.random() * xValues.length)];
    Enemy.speed = (Enemy.speed += 10) || 10;
    this.speed = Enemy.speed;
    this.sprite = 'images/enemy-bug.png';
}

let e1 = new Enemy;
console.log(e1);
let e2 = new Enemy;
console.log(e2);
let e3 = new Enemy;
console.log(e3);

Примечание 1: Math.floor(Math.random() * xValues.length) создает случайное целое (благодаря Math.floor) число от 0 до длины в моем массиве xValues. Это число используется для выбора случайного значения из массива xValues.

Примечание 2: в этой строке я создаю что-то вроде переменной класса Enemy.speed с начальным значением 10. Сначала Enemy.speed не существует, поэтому Enemy.speed += 10 оценивается как NaN, поскольку NaN ложно, оценка продолжается до 10;

Enemy.speed = (Enemy.speed += 10) || 10;

Затем я копирую значение в экземпляр.

this.speed = Enemy.speed;
person Dmitry    schedule 07.12.2017

Я не знаю всего проекта, поэтому это только пример / черновик:

const createEnemiesFactory = pos => {
    let lastPos = -1;
    let lastSpeed = 0;
    return () => {
        lastPos = (lastPos + 1) % pos.length;
        lastSpeed += 10;
        return new Enemy(pos[lastPos].x, pos[lastPos].y, lastSpeed);
    };
};

let enemiesFactory = createEnemiesFactory([
    {x: 0, y: 0},
    {x: 10, y: 10},
    {x: 20, y: 20}
]);

var increaseDifficulty = function(numEnemies) {
    // remove all previous enemies on canvas
    allEnemies.length = 0;

    // load new set of enemies
    for (var i = 0; i <= numEnemies; i++) {
        allEnemies.push( enemiesFactory() );
    }
};

Небольшое замечание: если вам нужно сбросить сложность (например, при перезапуске), то, очевидно, воссоздайте фабрику врагов, потому что другого способа сбросить lastSpeed нет.

person Green_Wizard    schedule 07.12.2017