所以我的小游戏被编程为让两个角色互相争斗。一个来自左侧,一个来自右侧。在他们打架之后,无论谁赢或输,都应该删除。实际上它们已经从列表框中删除了,但是在你从两边争取两个以上的字符之后,那些以前的字符有时会显示出来。如果你从Zys和Rash开始战斗,除了他们之外,在胜负部分没有打印其他名字。只有当你从Dant和Ilora向后退时,它才会按照每个角色在胜负中只占一次的方式运作。如果你从一些其他角色开始,他们可以多次进入胜负部分。即使没有选择进行战斗,角色也可以作为输赢。底线是每个角色在对方ONCE上对抗一个角色,之后它被放置然后删除而在程序的后半部分没有用。出于某些明显的原因,它不会这样做。
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()
这只是代码中可能与问题有关的部分,而不是整个代码。
这与昨天相同的代码不是同一个问题。我认为一次使用一个错误作为不同的问题更合适,这样他们就可以更有条理。
答案 0 :(得分:0)
问题是因为您始终使用if left == 0: namel = "Rash" even if
“Rash”was deleted from listbox and now
left == 0 means
“Untss”。
您必须获取所选名称而不是索引
namel = lbox.get(lbox.curselection()[0])
namer = rbox.get(rbox.curselection()[0])
并使用它
if namel == "Rush":
totalleft = Rash.total
但你可以使用字典来获取数据
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())
然后
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)
如果您向字典中添加新字符,则无需更改代码。
BTW:请勿在{{1}}中使用pass
,因为如果代码出现问题,您就不会看到错误。