2017-08-07 5 views
0

Dans le programme ci-dessous le résultat de l'instruction if près de la fin est parfois incorrect, mais je ne peux pas y voir un motif. Je l'ai débogué autant que possible mais je ne trouve pas mon erreur. Je suis désolé pour la grande quantité de code mais je ne sais pas où l'erreur est dans ce code tout ce que je sais est que c'est quelque part dans le code ci-dessous.erreur occasionnelle de comparaison de variables dans python

L'aide serait grandement appréciée!

Je ne suis pas extrêmement expérimenté en python alors s'il vous plaît expliquer toutes les réponses en détail

for i in range(1,10): 
import random 

Cards = list(range(0,8)) 
print("shuffling...") 
random.shuffle(Cards) 
#print(Cards) 

PlayerCards = [] 
ComputerCards = [] 
CardsLen = int(len(Cards))/2 

for i in range(int(CardsLen)): 
    PlayerCards.append(Cards[0]) 
    del Cards[0] 
    ComputerCards.append(Cards[0]) 
    del Cards[0] 

#print(PlayerCards) 
#print(ComputerCards) 



Ab5s = ['9', '12', '1', '10', '5', '6', '6', '8'] 

#print(Ab5s) 

Ab5sS = sorted(Ab5s, key = int) 
#print(Ab5sS) 


AbNames = ['Magic', 'Cunning', 'Courage', 'Wisdom', 'Temper'] 
#print(AbNames) 

Ab5Name = AbNames[4] 
AbNamesDict = {5: Ab5s} 



PlayerCardNum = PlayerCards[0] 
ComputerCardNum = ComputerCards[0] 



PlayerCardAb5 = Ab5s[PlayerCardNum] 
ComputerCardAb5 = Ab5s[ComputerCardNum] 


PlayerAbVal = Ab5s[PlayerCardNum] 
ComputerAbVal = Ab5s[ComputerCardNum] 

#print(PlayerAbVal) 
#print(ComputerAbVal) 


while True: 
    try: 
     PlayerAbUse = "Temper" #input("Which ability do you want to use ") 
     PlayerAbUse = PlayerAbUse.title() 
     PlayerAbNum = (AbNames.index(PlayerAbUse) + 1) 
     break 

    except ValueError: 
     print("error") 
     continue 


AbList = AbNamesDict[PlayerAbNum]  
PlayerAbVal = (AbList)[PlayerCardNum] 
ComputerAbVal = (AbList)[ComputerCardNum] 

#print(PlayerAbVal) 
#print(ComputerAbVal) 

print("Player has " + PlayerCardAb5 + " " + Ab5Name) 
print("Computer has " + ComputerAbVal + " " + Ab5Name) 

WonCards = [] 


#This is where I believe it is going wrong 

if PlayerAbVal < ComputerAbVal: 
    Winner = 0 
else: 
    if PlayerAbVal == ComputerAbVal: 
     Winner = 2 
    else: 
     Winner = 1 

WonCards.append(PlayerCards.pop(0)) 
WonCards.append(ComputerCards.pop(0)) 



if Winner == 0: 
    print("Computer Win ") 
    while len(WonCards) > 0: 
     ComputerCards.append(WonCards.pop(0)) 
    print("") 
else: 
    if Winner == 1: 
     print("Player Win ") 
     while len(WonCards) > 0: 
      PlayerCards.append(WonCards.pop(0)) 
     print("") 

    else: 
     print("Draw ") 
     Winner = random.randint(1,2) 
+2

Que doit exactement faire ce code? Qu'est-ce que je cherche? Il est préférable d'isoler le code qui, selon vous, pose problème :-) – Mangohero1

+3

'pour i dans la plage (1,10): import random'. Quelle? – roganjosh

+0

@ mangoHero1 Le code fait partie d'un jeu d'atouts et parfois il donne la mauvaise réponse pour le gagnant – user8430559

Répondre

0

Juste votre déclaration modifier if pour forcer le type à int « s. (utilisez if..elif..else pour plus de pythonicness)

if int(PlayerAbVal) < int(ComputerAbVal): 
    Winner = 0 
elif int(PlayerAbVal) == int(ComputerAbVal): 
    Winner = 2 
else: 
    Winner = 1 
+0

Merci, j'allais accepter la solution @roganjosh mais c'est mieux pour moi car il me permet d'importer la liste à partir d'un fichier – user8430559

+0

Cela fait mais il n'y a pas de raison d'avoir la liste en tant que cordes, donc il me semble contre-intuitif de contourner ce problème. – roganjosh

+0

@ user8430559 ok, ce n'était pas vraiment dans votre question. Si j'avais su cela, je vous aurais montré la conversion rapide. Je modifierai ma réponse, quelle que soit l'option choisie, car vous ne devriez pas vraiment coder autour de cette question plutôt que de l'aborder à la source. – roganjosh

1

Votre problème est que vous comparez des chaînes, pas des valeurs numériques. Ma première pensée était que vous étiez en Python 2, mais en fait cet échec peut aussi s'expliquer par lexicographical ordering

Modifiez votre liste Ab5sS pour contenir des entiers. Alors:

Ab5s = [9, 12, 1, 10, 5, 6, 6, 8] 

Pour corriger vos print s, exprimés à la chaîne il par exemple:

print("Player has " + str(PlayerCardAb5) + " " + Ab5Name) 

Ou, mieux, utiliser format():

print("Player has {} {}".format(PlayerCardAb5, Ab5Name)) 

Comme vous l'avez mentionné dans un autre commentaire, votre problème est que vous lisez les chaînes comme des valeurs d'un fichier. Cela ne vous empêche pas de convertir les valeurs en int; le plus simple est probablement juste une compréhension de la liste:

Ab5s = ['9', '12', '1', '10', '5', '6', '6', '8'] 
Ab5s = [int(item) for item in Ab5s] 

Il y a d'autres façons, comme map, mais je pense que ce falling out of favour.

Ab5s = map(float, Ab5s) 
+0

Merci encore, il semble avoir travaillé – user8430559