2016-11-02 2 views
0

Новое в ОО, я сделать игру, и я это как мой initialState:Javascript DRY Pattern - функция

let initialState = { 
    grid : null, 
    player : { 
    coordinates : null, 
    health : 100 , 
    weapon : "Stick", 
    expLevel : 1 
    }, 
    enemies : [], 
    weapons : [], 
    items : [] 
} 

, когда DOM загружен, я могу инициализировать weapons и items corretly. Однако оба этих свойств разделяют точную функциональность, кроме литерал объекта, который инициализируется:

initialState.weapons = placeWeapons(3); 
initialState.items = placeItems(2); 

где placeWeapons

function placeWeapons(numberofWeapons){ 
    let weapons = []; 
    let availableSpots = []; 
    let placementWeapons = []; //list of coordinates that will place weapons 
    let grid = initialState.grid; 

    //collect whats available of coords that are not taken in initialState.occupiedCoordinates 
    grid.forEach((row, rowIndex) => (
    row.forEach((cell, colIndex) => { 
     if (cell === 1){ 
     availableSpots.push([rowIndex,colIndex]) 
     } 
    }) 
)) 

    //lets place the weapons. When placed, it will update initialState.occupiedCoordinates 
    while(placementWeapons.length < numberofWeapons){ 
    let randCoords = availableSpots[Math.floor(Math.random() * availableSpots.length)]; 
    if (grid[randCoords[0]][randCoords[1]] === 1){ 
     placementWeapons.push(randCoords); 
     grid[randCoords[0]][randCoords[1]] = 0 
    } 
    } 
    placementWeapons.forEach(coord => { 
    let weapon = { 
     name : "Weapon Name", 
     coords : coord, 
     damage : 3 
    } 
    weapons.push(weapon) 
    }) 
    return weapons; 
} 

placeItems

function placeItems(numberofItems){ 
    let items = []; 
    let availableSpots = []; 
    let placementItems = []; //list of coordinates that will place items 
    let grid = initialState.grid; 

    //collect whats available of coords that are not taken in initialState.occupiedCoordinates 
    grid.forEach((row, rowIndex) => (
    row.forEach((cell, colIndex) => { 
     if (cell === 1){ 
     availableSpots.push([rowIndex,colIndex]) 
     } 
    }) 
)) 

    //lets place the items. When placed, it will update initialState.occupiedCoordinates 
    while(placementItems.length < numberofItems){ 
    let randCoords = availableSpots[Math.floor(Math.random() * availableSpots.length)]; 
    if (grid[randCoords[0]][randCoords[1]] === 1){ 
     placementItems.push(randCoords); 
     grid[randCoords[0]][randCoords[1]] = 0 
    } 
    } 
    placementItems.forEach(coord => { 
    let item = { 
     name : "Item Name", 
     coords : coord, 
     health : 3 
    } 
    items.push(item) 
    }) 
    return items; 
} 

Как я могу Высушите этот шаблон?

+0

Сделать это проще, написав функцию, которая возвращает массив возможных мест размещения. – Bergi

ответ

2

Единственное существенное различие, которое я вижу, это то, что находится. Поэтому логично, что нужно сделать, это извлечь, что и передать его в качестве аргумента:

// WARNING: Untested code: 
function placeThings(thing, numberofThings){ 
    let things = []; 
    let availableSpots = []; 
    let placementItems = []; //list of coordinates that will place things 
    let grid = initialState.grid; 

    //collect whats available of coords that are not taken in initialState.occupiedCoordinates 
    grid.forEach((row, rowIndex) => (
    row.forEach((cell, colIndex) => { 
     if (cell === 1){ 
     availableSpots.push([rowIndex,colIndex]) 
     } 
    }) 
)) 

    //lets place the items. When placed, it will update initialState.occupiedCoordinates 
    while(placementItems.length < numberofThings){ 
    let randCoords = availableSpots[Math.floor(Math.random() * availableSpots.length)]; 
    if (grid[randCoords[0]][randCoords[1]] === 1){ 
     placementItems.push(randCoords); 
     grid[randCoords[0]][randCoords[1]] = 0 
    } 
    } 
    placementItems.forEach(coord => { 
    things.push(Object.create(thing)) 
    }) 
    return things; 
} 

Теперь вы можете сделать:

// Weapons: 
placeThings({ 
    name : "Weapon Name", 
    coords : coord, 
    damage : 3 
},50); 

// Items: 
placeThings({ 
    name : "Item Name", 
    coords : coord, 
    health : 3 
},100); 

Если вы хотите, чтобы сделать вещи, размещаемым случайным вы можете просто передать функция вместо объекта:

// WARNING: Untested code: 
function placeThings(thingGenerator, numberofThings){ 
    let things = []; 

    /* 
    * bla bla.. 
    */ 

    placementItems.forEach(coord => { 
    things.push(thingGenerator()) 
    }) 
    return things; 
} 

Так что вы могли бы сделать что-то вроде:

placeThings(makeWeapon, 50); 
placeThings(makeItem, 100); 
+0

Удивительный! Это сделал трюк :) – Alejandro