2010-11-15 6 views
0
function genEnemy(a) { 
//javascript:alert(en[0]+'\n'+genEnemy(en[0])+'\n'+en[0]) 
with (Math) { 
    a[1]=round(a[1]*(.5+random())) 
    a[2]=round(a[2]*(1+random())) 
    for (var b=0;b<5;b++) a[3][b]=round(a[3][b]*(a[3][b]/2+random()*a[3][b]/10)) 
    for (var b=0;b<a[4].length;b++) random()<it[a[4][b]][3]/10?a[4][b]=0:0 
    } 
return a 
} 

Script pour générer les statistiques d'un ennemi étant donné les bases de chaque groupe ennemi. (Jeu RPG) Le problème est, quand je m'attends à ce qu'il renvoie un tableau contenant les nouvelles statistiques, il définit également le tableau ennemi à la nouvelle. Pourquoi est-ce? Évidemment, vous pouvez voir comment les problèmes sont causés par cela (les bases étant changées, un ennemi faible peut devenir plus puissant). Comment est-ce que je l'empêcherais de placer le tableau dans en (tableau de valeurs ennemies)?variable de réglage de fonction quand elle ne devrait pas

+2

Je ne suis pas ce que vous voulez faire, vos noms de variables rendent difficile le décodage de votre code basé sur la description. –

+2

'avec (Obj)' peut être dangereux, assurez-vous de lire [this] (http://stackoverflow.com/questions/61088/hidden-features-of-javascript#61118). – alex

Répondre

6

Les objets sont transmis par référence en JavaScript. Cela signifie que toutes les modifications que vous apportez au tableau a à l'intérieur de genEnemy sont répercutées sur le tableau original transmis. Vous devez effectuer une copie complète du tableau et renvoyer cette copie. Voici une fonction qui le fera pour vous:

function cloneArray(a) { 
    var b = []; 
    for (var i = 0; i < a.length; i++) 
    if (a[i] instanceof Array) 
     b[i] = cloneArray(a[i]); 
    else 
     b[i] = a[i]; 
    return b; 
} 

intérieur genEnemy, alors vous faire:

a = cloneArray(a); 
// make changes to the new array 
return a; 

En outre, ne pas oublier d'inclure dans votre code des points-virgules. Même si elles sont facultatives, vous pouvez rencontrer des problèmes inattendus si vous prenez l'habitude de les omettre.

+0

Existe-t-il un moyen de le faire sans une autre fonction? Je déteste juste ajouter des fonctions pour de petites choses. – Anonymous

+0

+1, beaucoup de conseils utiles – alex

+0

@Ruffian Sortez le corps de la fonction et exécutez-le de manière procédurale et vous n'avez pas de fonction: P Mais souvenez-vous que le fait de transformer un code souvent utilisé en une fonction est une bonne chose. – alex

0

Passez-vous array en à votre fonction getEnemy()? Si tel est le cas, il changera les valeurs dans en array car il est passé par référence non par valeur

Questions connexes