From a4c4e2a1929e8282fa4a7511ceb5b4f99b42334d Mon Sep 17 00:00:00 2001 From: Ilia Mashkov Date: Sun, 19 Jul 2026 14:31:35 +0300 Subject: [PATCH] =?UTF-8?q?feat(spawnRandomPerk):=20=D0=94=D0=BE=D0=B1?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20=D1=84=D1=83=D0=BD=D0=BA?= =?UTF-8?q?=D1=86=D0=B8=D1=8F=20=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D1=81=D0=BB=D1=83=D1=87=D0=B0=D0=B9=D0=BD=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=20=D0=B1=D0=BE=D0=BD=D1=83=D1=81=D0=B0=20=D0=BF=D0=BE=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D1=8B=D0=BC=20=D0=BA=D0=BE=D0=BE?= =?UTF-8?q?=D1=80=D0=B4=D0=B8=D0=BD=D0=B0=D1=82=D0=B0=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/config.js | 6 ++++ src/lib/spawnRandomPerk/spawnRandomPerk.js | 28 +++++++++++++++++++ .../spawnRandomPerk/spawnRandomPerk.test.js | 24 ++++++++++++++++ 3 files changed, 58 insertions(+) create mode 100644 src/lib/spawnRandomPerk/spawnRandomPerk.js create mode 100644 src/lib/spawnRandomPerk/spawnRandomPerk.test.js diff --git a/src/config.js b/src/config.js index c61245a..bd1abe1 100644 --- a/src/config.js +++ b/src/config.js @@ -18,3 +18,9 @@ export const BRICK_HEIGHT = 10; export const BRICK_ROW_AMOUNT = 5; export const BRICK_COLUMN_AMOUNT = 20; + +export const PERK_WIDTH = 16; +export const PERK_HEIGHT = 16; +export const PERK_FALL_SPEED = 3; +export const PERK_DROP_CHANCE = 0.3; +export const PERK_BALL_SPEED_DECREASE = 2; diff --git a/src/lib/spawnRandomPerk/spawnRandomPerk.js b/src/lib/spawnRandomPerk/spawnRandomPerk.js new file mode 100644 index 0000000..8d97713 --- /dev/null +++ b/src/lib/spawnRandomPerk/spawnRandomPerk.js @@ -0,0 +1,28 @@ +import { PERK_FALL_SPEED, PERK_HEIGHT, PERK_WIDTH } from '../../config'; +import { Perk } from '../../entities/perk/perk'; + +/** + * Типы бонусов + */ +const DROPPABLE_PERKS = ['slow']; + +/** + * Создает случайный бонус в заданной точке + * @param {number} x координата бонуса по оси X + * @param {number} y координата бонуса по оси Y + * @returns {Perk | null} + */ +export function spawnRandomPerk(x, y) { + try { + if (typeof x !== 'number' || typeof y !== 'number') { + throw new Error('Координаты бонуса должны являться числами'); + } + + const type = DROPPABLE_PERKS[Math.floor(Math.random() * DROPPABLE_PERKS.length)]; + + return new Perk(x, y, PERK_WIDTH, PERK_HEIGHT, type, PERK_FALL_SPEED); + } catch (err) { + console.error(err); + return null; + } +} diff --git a/src/lib/spawnRandomPerk/spawnRandomPerk.test.js b/src/lib/spawnRandomPerk/spawnRandomPerk.test.js new file mode 100644 index 0000000..1e42b82 --- /dev/null +++ b/src/lib/spawnRandomPerk/spawnRandomPerk.test.js @@ -0,0 +1,24 @@ +import { PERK_FALL_SPEED, PERK_HEIGHT, PERK_WIDTH } from '../../config'; +import { Perk } from '../../entities/perk/perk'; +import { spawnRandomPerk } from './spawnRandomPerk'; + +describe('spawnRandomPerk', () => { + it('Возвращает корректное значение при неверных типах аргументов', () => { + expect(spawnRandomPerk(null, 0)).toBeNull(); + expect(spawnRandomPerk(0, null)).toBeNull(); + expect(spawnRandomPerk('10', 0)).toBeNull(); + expect(spawnRandomPerk(0, undefined)).toBeNull(); + }); + + it('Создает бонус в заданной точке с размерами и скоростью из конфига', () => { + const perk = spawnRandomPerk(10, 20); + + expect(perk).toBeInstanceOf(Perk); + expect(perk.x).toBe(10); + expect(perk.y).toBe(20); + expect(perk.width).toBe(PERK_WIDTH); + expect(perk.height).toBe(PERK_HEIGHT); + expect(perk.fallSpeed).toBe(PERK_FALL_SPEED); + expect(perk.alive).toBe(true); + }); +});