2010-10-10 12 views
1

Je suis assez nouveau pour python et j'essaie de saisir les ficelles du métier et j'ai décidé d'apprendre de manière amusante à faire un jeu de type MUD ringard . Mon objectif pour le morceau de code que je vais montrer est d'avoir trois ennemis choisis au hasard (à partir d'une liste) pour que le «héros» se batte. La question que je suis en cours d'exécution en est que Python est la copie de la liste à la liste par référence, pas de valeur (je crois), en raison du code ci-dessous ...Je ne peux pas * copier * un index de la liste vers un autre avec une torsion en Python

import random 

#ene = [HP,MAXHP,loDMG,hiDMG] 
enemies = [[8,8,1,5,"Ene1"],[9,9,3,6,"Ene2"],[15,15,2,8,"Ene3"]] 
genENE = [] 

#skews # of ene's to be gen, favoring 1,2, and 3 
eneAppears = 3 

for i in range(0,eneAppears): 
    num = random.randint(5,5) 
    if num <= 5: 
     genENE.insert(i,enemies[0]) 
    elif num >= 6 and num <=8: 
     genENE.insert(i,enemies[1]) 
    else: 
     genENE.insert(i,enemies[2]) 

#genENE = [[8,8,1,5,"Ene1"],[9,9,3,6,"Ene2"],[15,15,2,8,"Ene3"]]   
for i in range(0,eneAppears): 
    if eneAppears == 1: 
     print "A " + genENE[0][4] + " appears!" 
    else: 
     while i < eneAppears: 
      print "A " + genENE[i][4] + " appears!" 
      i = eneAppears 

genENE[1][0] = genENE[1][0] - 1 
print genENE 

Fondamentalement, j'ai une liste « maître » de ennemis que j'utilise pour copier ce que je veux dans un index d'une autre liste lors de ma première boucle "for". Normalement, les nombres générés aléatoirement vont de 1 à 10, mais le problème que je rencontre est plus facilement démontré en forçant le même ennemi à être inséré plusieurs fois dans ma liste de "copie". Fondamentalement, quand je tente de soustraire une valeur d'un ennemi avec le même nom dans ma liste "copie", ils soustraient tous cette valeur (voir les deux dernières lignes de code). J'ai fait beaucoup de recherche et ne peux pas trouver un moyen de copier juste un seul index d'une liste à l'autre. Aucune suggestion? Merci!

Répondre

1

changement

genENE.insert(i,enemies[0]) 

à

genENE.insert(i,enemies[0][:]) 

Cela forcera la liste à copier plutôt que de référence. Aussi, j'utiliserais append plutôt que d'insérer dans ce cas.

+0

Fantastique! Étonnant comme je n'étais qu'à 3 caractères du succès ... J'ai aussi mis en place un ajout comme tu l'as suggéré, je suppose que c'est un peu plus rapide, plus propre et moins sujette aux erreurs? Merci un million! – thebill

+0

liste (ennemis [0]) fait la même chose que les ennemis [0] [:], et est un peu plus explicite, mais le choix est une question de goût. –

+0

@Ruseel Borogove, vous avez raison. Ma conscience m'avait dit que j'aurais dû le mentionner. –

0

they all subtract that value Qu'entendez-vous par tous? Si vous voulez dire les deux listes, vous avez un problème parce que vous ne faites que référencer la liste et pas en créer une seconde.