2016-10-19 1 views
1

Mein kleines Spiel ist so programmiert, dass zwei Charaktere gegeneinander kämpfen. Einer von der linken Seite und einer von der rechten Seite. Nach dem Kampf sollten beide gelöscht werden, unabhängig davon, wer gewinnt oder verliert. Sie werden in der Tat aus Listenfeldern gelöscht, aber nachdem Sie zwei weitere Charaktere von jeder Seite haben, kämpfen diese vorherigen Charaktere manchmal. Wenn Sie mit Zys und Rash kämpfen, werden in der Gewinn-und-Verlust-Sektion neben den anderen keine anderen Namen gedruckt. Nur wenn du rückwärts von Dant und Ilora gehst, funktioniert es so, wie es sollte, wenn jeder Charakter nur einmal einen Platz in Gewinnen oder Verlust einnimmt. Wenn Sie mit einigen anderen Charakteren beginnen, können Sie sie mehr als einmal in den Bereich Wins and Loss setzen. Es ist auch möglich, dass ein Charakter als Gewinn oder Verlust platziert wird, auch wenn er nicht zum Kämpfen ausgewählt wurde. Die Grundlinie ist, dass jeder Charakter einmal auf der gegenüberliegenden Seite gegen einen Charakter kämpfen muss und danach wird er platziert und dann im späteren Teil des Programms ohne Verwendung gelöscht. Aus irgendeinem ersichtlichen Grund tut es das nicht.Charaktere aus der Listbox werden immer noch aufgezeichnet, auch wenn sie aus der Listbox gelöscht wurden

from tkinter import * 
from tkinter import ttk 
from tkinter import messagebox 

class Character: 
    def __init__(self, name, attack, defense, health): 
     self.name = name 
     self.attack = attack 
     self.defense = defense 
     self.health = health 
     self.total = attack+defense+health 

#Left side characters 
Rash = Character("Rash", 42, 50, 80) 
Untss = Character("Untss", 15, 54, 100) 
Ilora = Character("Ilora", 60, 35, 80) 
            #Both sides have totals of 165 168 and 175 
#Right side characters 
Zys = Character("Zys", 12, 97, 83) 
Eentha = Character("Eentha", 55, 17, 90) 
Dant = Character("Dant", 73, 28, 88) 

def fight(): #Part of code that checks for wins and loss checks which has greater total stats and deletes from list box 

    try: 
     namel = "" 
     namer="" 
     left = lbox.curselection()[0] 
     right = rbox.curselection()[0] 

     totalleft = 0 
     totalright = 0 
     if left == 0: 
      namel = "Rash" 
      totalleft = Rash.total 
     elif left==1: 
      namel = "Untss" 
      totalleft = Untss.total 
     elif left==2: 
      namel = "Ilora" 
      totalleft = 60+35+80 

     if right == 0: 
      namer = "Zys" 
      totalright = Zys.total 
     elif right==1: 
      namer = "Eentha" 
      totalright = Eentha.total 
     elif right==2: 
      namer = "Dant" 
      totalright = Dant.total 

     lbox.delete(lbox.curselection()[0]) 
     rbox.delete(rbox.curselection()[0]) 
     print(namel) 
     print(namer) 
     if (totalleft>totalright): #Checks if won or lost 
      wins.set(wins.get()+"\n"+namel) 
      loss.set(loss.get()+"\n"+namer) 
     else: 
      wins.set(wins.get()+"\n"+namer) 
      loss.set(loss.get()+"\n"+namel) 
    except IndexError: 
      pass 


#The left listbox and its characters 
leftnames = ('Rash', 'Untss', 'Ilora') 
lnames = StringVar(value=leftnames) 
lbox = Listbox(mainframe, listvariable=lnames, exportselection=0, height=3) 
lbox.grid(column=0, row=0) 


#Right listboxes characters 
rightnames = ('Zys', 'Eentha', 'Dant') 
rnames = StringVar(value=rightnames) 
rbox = Listbox(mainframe, listvariable=rnames, exportselection=0, height=3) 
rbox.grid(column=1, row=0) 


#Shows users wins and lossses 

wins = StringVar() 
loss = StringVar() 

#Label that 
ttk.Label(mainframe, text="Wins", width=13).grid(column=2, row=0, sticky=N) 
ttk.Label(mainframe, text="Loss", width=13).grid(column=2, row=1, sticky=N) 
ttk.Label(mainframe, textvariable=wins).grid(column=2, row=0, sticky=(S,E)) 
ttk.Label(mainframe, textvariable=loss).grid(column=2, row=1, sticky=(S, E)) 

#Button for fighting 
fightbttn= ttk.Button(mainframe, text="Fight", command=fight) 
fightbttn.grid(column=3, row=3, sticky=(E)) 

root.mainloop() 

Dies ist nur der Teil des Codes, der sich auf das Problem beziehen könnte, nicht der Code als Ganzes.

Dies ist nicht die gleiche Frage von gestern, nur der gleiche Code. Ich dachte, es wäre angemessener, mit den Fehlern nacheinander als verschiedene Probleme zu arbeiten, damit sie besser organisiert werden können.

+0

Was ist die Frage? – atomh33ls

+0

Problem ist mit Ihrem 'if left == 0: namen =" Rash "', etc. Wenn Sie '" Rash "' Formularliste löschen und wählen Sie das erste Element in der Listbox ('" Untss "') dann 'if left == 0: namel = "Rash" 'gibt dir" Rash "' anstatt "' Untss "'. Sie können 'left == 0' nicht verwenden, um das ausgewählte Element zu erkennen. Sie müssen 'left ==" Rush "' oder etwas ähnliches verwenden. – furas

Antwort

0

Problem ist, weil Sie immer if left == 0: namel = "Rash" even if "Rash" was deleted from listbox and now left == 0 means "Untss" verwenden.

Sie müssen Name

namel = lbox.get(lbox.curselection()[0]) 
    namer = rbox.get(rbox.curselection()[0]) 

statt Index und

if namel == "Rush": 
     totalleft = Rash.total 

Aber Sie könnten Wörterbuch verwenden erhalten ausgewählte verwenden, um Daten zu erhalten

left_characters = {   
    "Rash": Character("Rash", 42, 50, 80), 
    "Untss": Character("Untss", 15, 54, 100), 
    "Ilora": Character("Ilora", 60, 35, 80), 
} 

right_characters = { 
    "Zys": Character("Zys", 12, 97, 83), 
    "Eentha": Character("Eentha", 55, 17, 90), 
    "Dant": Character("Dant", 73, 28, 88), 
} 

leftnames = list(left_characters.keys()) 
rightnames = list(right_characters.keys()) 

und dann

def fight(): 

    try: 
     namel = lbox.get(lbox.curselection()[0]) 
     namer = rbox.get(rbox.curselection()[0]) 

     print(namel) 
     print(namer) 

     totalleft = left_characters[namel].total 
     totalright = right_characters[namer].total 

     lbox.delete(lbox.curselection()[0]) 
     rbox.delete(rbox.curselection()[0]) 

     if totalleft > totalright : #Checks if won or lost 
      wins.set(wins.get()+"\n"+namel) 
      loss.set(loss.get()+"\n"+namer) 
     else: 
      wins.set(wins.get()+"\n"+namer) 
      loss.set(loss.get()+"\n"+namel) 
    except IndexError as e: 
     print("ERROR:", e) 

Wenn Sie dem Wörterbuch neue Zeichen hinzufügen, müssen Sie den Code nicht ändern.

BTW: Verwenden Sie nicht pass in except, weil Sie Fehler nicht sehen, wenn es etwas mit Code falsch ist.

+0

Danke! Das hat es getan. Du bist der beste! – Unknownzdx

Verwandte Themen