即使从列表框中删除,列表框中的字符仍会被记录

2024-10-01 05:04:14 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我的小游戏被编程为让两个角色互相争斗。一个在左侧,一个在右侧。在他们战斗之后,无论谁赢谁输,都应该删除他们。事实上,它们是从列表框中删除的,但当你从每一方都有两个以上的角色时,前面的角色有时会出现。如果你从Zys和Rash fighting开始,那么除了他们的名字外,赢与输部分没有其他名字。只有当你从但丁和伊洛拉那里后退时,它才会以应有的方式工作,每个角色只在一次胜负中占有一席之地。如果你从其他角色开始,他们可能会被放在赢和输的部分不止一次。一个角色即使没有被选中参战,也有可能被视为赢或输。底线是每个角色与对方的角色战斗一次,然后放置并删除它,在程序的后面部分没有任何用处。出于某种明显的原因,它没有做到这一点

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()

这只是代码中与问题相关的部分,而不是整个代码

这不是昨天的问题,只是相同的代码。我认为将bug作为不同的问题一次处理一个更合适,这样它们就可以更有组织性


Tags: self角色columngridrowtotalttkcharacter
1条回答
网友
1楼 · 发布于 2024-10-01 05:04:14

问题是因为您总是使用if left == 0: namel = "Rash" even if“Rash”was deleted from listbox and nowleft==0means“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)

若你们在字典中添加了新字符,那个么你们就不需要修改代码了

顺便说一句:不要在except中使用pass,因为如果代码有问题,您不会看到错误

相关问题 更多 >