Python 错误:如何阻止敌人';要重置的健康栏?
我目前正在使用python和tkinter开发一款类似RPG的游戏。 问题是,在按下治疗按钮,然后按下任何攻击按钮后,敌人的健康栏将重置 我已经试着从哪里来理解这个错误,但是没有结果。我在每行后面都使用print()来验证这些值,但这些都不能回答我的问题Python 错误:如何阻止敌人';要重置的健康栏?,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我目前正在使用python和tkinter开发一款类似RPG的游戏。 问题是,在按下治疗按钮,然后按下任何攻击按钮后,敌人的健康栏将重置 我已经试着从哪里来理解这个错误,但是没有结果。我在每行后面都使用print()来验证这些值,但这些都不能回答我的问题 import tkinter as tk from tkinter import font import time import threading import random class InGameWindow(object) :
import tkinter as tk
from tkinter import font
import time
import threading
import random
class InGameWindow(object) :
def __init__(self, master) :
#Window and it's settings
self.master = master
windowWidth = self.master.winfo_screenwidth()
windowHeight = self.master.winfo_screenheight()
rootCoord = f"800x400+{int((windowWidth/2)-400)}+{int((windowHeight/2)-200)}"
master.title("A Simple RPG")
master.geometry(rootCoord)
master.resizable(width=False, height=False)
master.overrideredirect(False)
master.configure(bg="black")
#Import files as .png etc...
levelIcon = tk.PhotoImage(file="playerInfoIcon.png")
fireballIcon = tk.PhotoImage(file="fireball.png")
earthquackeIcon = tk.PhotoImage(file="earthquacke.png")
strokeIcon = tk.PhotoImage(file="stroke.png")
healIcon = tk.PhotoImage(file="heal.png")
startIcon = tk.PhotoImage(file="start.png")
self.levelIcon = levelIcon
self.fireballIcon = fireballIcon
self.earthquackeIcon = earthquackeIcon
self.strokeIcon = strokeIcon
self.healIcon = healIcon
self.startIcon = startIcon
#Frames to create fancy borders and titles
mainWindowFrame = tk.Frame(master, width=780, height=380, bg="black")
mainWindowFrame.place(x=10, y=10)
attackButtonsFrame = tk.LabelFrame(mainWindowFrame, width=420, height=165, bg="black", relief="ridge", bd=3)
attackButtonsFrame.place(x=300, y=210)
playerInfoFrame = tk.LabelFrame(mainWindowFrame, width=240, height=365, bg="black", bd=3)
playerInfoFrame.place(x=10, y=10)
self.mainWindowFrame = mainWindowFrame
#Canvas and stuff related to player's info
playerInfo = tk.Canvas(playerInfoFrame, bg="black", width=225, height=340, bd=0, highlightthickness=0, relief='ridge')
playerInfo.place(x=0, y=0)
self.playerInfo = playerInfo
#Coordinates for .create_figure/image
dynamicHealthBarCoord = [14, 16, 214, 16, 195, 34, 14, 34]
dynamicManaBarCoord = [13, 16+30, 214-100, 16+30, 195-100, 34+30, 13, 34+30]
self.dynamicHealthBarCoord, self.dynamicManaBarCoord = dynamicHealthBarCoord, dynamicManaBarCoord
healthBarForground = playerInfo.create_polygon(14, 15, 214, 16, 196, 34, 14, 34, fill="black", outline="black", width=2)
dynamicHealthBar = playerInfo.create_polygon(dynamicHealthBarCoord, fill="red", width=1)
healthBarBackground = playerInfo.create_polygon(11, 13, 220, 13, 196, 37, 11, 37, fill="", outline="gray", width=2)
manaBarForground = playerInfo.create_polygon(14, 15+30, 214-100, 16+30, 196-100, 34+30, 14, 34+30, fill="black", outline="black", width=2)
dynamicManaBar = playerInfo.create_polygon(dynamicManaBarCoord, fill="blue", width=1)
manaBarBackground = playerInfo.create_polygon(11, 13+30, 220-99, 13+30, 196-99, 37+30, 11, 37+30, fill="", outline="gray", width=2)
self.dynamicHealthBar, self.dynamicManaBar = dynamicHealthBar, dynamicManaBar
#Buttons
Attack_Stroke = tk.Button(mainWindowFrame, image=self.strokeIcon, command=lambda: self.Stroke(dynamicHealthBarCoord), cursor="hand1", state="disabled")
Attack_Stroke.place(x=346.67-10, y=242-15)
Spell_Heal = tk.Button(mainWindowFrame, image=self.healIcon, command=lambda: self.Heal(dynamicHealthBarCoord), cursor="hand1", state="disabled")
Spell_Heal.place(x=533.33+10, y=242-15)
Attack_Fireball = tk.Button(mainWindowFrame, image=self.fireballIcon, command=lambda: self.FireBall(dynamicHealthBarCoord, dynamicManaBarCoord), cursor="hand1", state="disabled")
Attack_Fireball.place(x=346.67-10, y=242+60)
Attack_Earthquake = tk.Button(mainWindowFrame, image=self.earthquackeIcon, command=lambda: self.EarthQuacke(dynamicHealthBarCoord, dynamicManaBarCoord), cursor="hand1", state="disabled")
Attack_Earthquake.place(x=533.33+10, y=242+60)
Enter_The_Dunjon = tk.Button(self.master, image=self.startIcon, command=self.Dunjon, cursor="hand1")
Enter_The_Dunjon.place(x=440, y=67)
self.Enter_The_Dunjon = Enter_The_Dunjon
self.Attack_Stroke, self.Spell_Heal, self.Attack_Fireball, self.Attack_Earthquake =Attack_Stroke, Spell_Heal, Attack_Fireball, Attack_Earthquake
manaRegenerationThread = threading.Thread(target=lambda: self.manaRegeneration(self.dynamicManaBarCoord))
manaRegenerationThread.setDaemon(True)
manaRegenerationThread.start()
deathEventHandlerThread = threading.Thread(target=lambda: self.deathEventHandler(self.dynamicHealthBarCoord))
deathEventHandlerThread.setDaemon(True)
deathEventHandlerThread.start()
#m = threading.Thread(target=lambda: manaRegeneration(dynamicManaBarCoord))
#m.start()
def Stroke(self, healthCoordList) :
healthCoordList[2], healthCoordList[4] = healthCoordList[2] - 20, healthCoordList[4] - 20
self.ennemyInfo.coords(self.ennemyDynamicHealthBar, healthCoordList)
def Heal(self, healthCoordList) :
healthCoordList[2], healthCoordList[4] = 214, 195
self.playerInfo.coords(self.dynamicHealthBar, healthCoordList)
def FireBall(self, healthCoordList, manaCoordList) :
healthCoordList[2], healthCoordList[4] = healthCoordList[2] - 20, healthCoordList[4] - 20
self.ennemyInfo.coords(self.ennemyDynamicHealthBar, healthCoordList)
manaCoordList[2], manaCoordList[4] = manaCoordList[2] - 5, manaCoordList[4] - 5
self.playerInfo.coords(self.dynamicManaBar, manaCoordList)
self.master.update()
i = threading.Thread(target=self.timerFireBall)
i.setDaemon(True)
i.start()
def EarthQuacke(self, healthCoordList, manaCoordList) :
healthCoordList[2], healthCoordList[4] = healthCoordList[2] - 20, healthCoordList[4] - 20
self.ennemyInfo.coords(self.ennemyDynamicHealthBar, healthCoordList)
manaCoordList[2], manaCoordList[4] = manaCoordList[2] - 25, manaCoordList[4] - 25
self.playerInfo.coords(self.dynamicManaBar, manaCoordList)
self.master.update()
i = threading.Thread(target=self.timerEarthQuacke)
i.setDaemon(True)
i.start()
def timerStroke(self) :
self.Attack_Stroke.configure(state="disabled")
self.master.update()
time.sleep(0)
self.Stroke.configure(state="active")
self.master.update()
def timerHeal(self) :
self.Spell_Heal.configure(state="disabled")
self.master.update()
time.sleep(0)
self.Spell_Heal.configure(stae="active")
self.master.upgrade()
def timerFireBall(self) :
self.Attack_Fireball.configure(state="disabled")
self.master.update()
time.sleep(0)
self.Attack_Fireball.configure(state="active")
self.master.update()
def timerEarthQuacke(self) :
self.Attack_Earthquake.configure(state="disabled")
self.master.update()
time.sleep(0)
self.Attack_Earthquake.configure(state="active")
self.master.update()
def manaRegeneration(self, manaCoordList) :
while True :
if manaCoordList[2] < 114 :
manaCoordList[2], manaCoordList[4] = manaCoordList[2] + 1, manaCoordList[4] + 1
self.playerInfo.coords(self.dynamicManaBar, manaCoordList)
self.master.update()
time.sleep(0.90)
elif manaCoordList[2] >= 114 :
manaCoordList[2], manaCoordList[4] = manaCoordList[2] + 0, manaCoordList[4] + 0
self.playerInfo.coords(self.dynamicManaBar, manaCoordList)
self.master.update()
def deathEventHandler(self, healthCoordList) :
while True :
if healthCoordList[2] < 10 :
self.master.destroy()
def Dunjon(self) :
self.Enter_The_Dunjon.place_forget()
ennemyInfoFrame = tk.LabelFrame(self.mainWindowFrame, width=420, height=165, bg="black", bd=3)
ennemyInfoFrame.place(x=300, y=10)
ennemyInfo = tk.Canvas(ennemyInfoFrame, bg="black", width=415, height=160, bd=0, highlightthickness=0, relief='ridge')
ennemyInfo.place(x=0, y=0)
ennemyDynamicHealthBarCoord = [14, 16, 214, 16, 195, 34, 14, 34]
ennemyHealthBarForground = ennemyInfo.create_polygon(14, 15, 214, 16, 196, 34, 14, 34, fill="black", outline="black", width=2)
ennemyDynamicHealthBar = ennemyInfo.create_polygon(ennemyDynamicHealthBarCoord, fill="red", width=1)
ennemyHealthBarBackground = ennemyInfo.create_polygon(11, 13, 220, 13, 196, 37, 11, 37, fill="", outline="gray", width=2)
self.ennemyInfo, self.ennemyDynamicHealthBar = ennemyInfo, ennemyDynamicHealthBar
self.Attack_Stroke.configure(state="active")
self.Attack_Fireball.configure(state="active")
self.Attack_Earthquake.configure(state="active")
self.Spell_Heal.configure(state="active")
root = tk.Tk()
InGameWindow(root)
root.mainloop()
将tkinter作为tk导入
从tkinter导入字体
导入时间
导入线程
随机输入
类InGameWindow(对象):
定义初始(自我,主):
#窗口及其设置
self.master=master
windowWidth=self.master.winfo_screenwidth()
windowHeight=self.master.winfo_屏幕高度()
rootCoord=f“800x400+{int((windowWidth/2)-400)}+{int((windowHeight/2)-200)}”
大师头衔(“一个简单的RPG”)
几何硕士(rootCoord)
master.可调整大小(宽度=假,高度=假)
master.overrideredirect(False)
主配置(bg=“黑色”)
#以.png等格式导入文件。。。
levelIcon=tk.PhotoImage(file=“playerInfoIcon.png”)
fireballIcon=tk.PhotoImage(file=“fireball.png”)
earthquackeIcon=tk.PhotoImage(file=“earthquacke.png”)
strokecon=tk.PhotoImage(file=“stroke.png”)
healIcon=tk.PhotoImage(file=“heal.png”)
startIcon=tk.PhotoImage(file=“start.png”)
self.levelIcon=levelIcon
self.fireballIcon=fireballIcon
self.earthquackecon=Earthquackecon
self.strokeIcon=strokeIcon
self.healIcon=healIcon
self.startIcon=startIcon
#框架以创建花哨的边框和标题
主窗口框架=传统框架(主窗口,宽度=780,高度=380,bg=“黑色”)
主窗框位置(x=10,y=10)
attackButtonsFrame=tk.LabelFrame(主窗口框架,宽度=420,高度=165,bg=“黑色”,relief=“脊状”,bd=3)
附件按钮框架位置(x=300,y=210)
playerInfoFrame=tk.LabelFrame(主窗口框架,宽度=240,高度=365,bg=“黑色”,bd=3)
playerInfoFrame.place(x=10,y=10)
self.mainWindowFrame=mainWindowFrame
#画布和与玩家信息相关的东西
playerInfo=tk.Canvas(playerInfo框架,bg=“黑色”,宽度=225,高度=340,bd=0,高亮厚度=0,浮雕=ridge')
playerInfo.place(x=0,y=0)
self.playerInfo=playerInfo
#创建图形/图像的坐标
dynamicHealthBarCoord=[14,16,214,16,195,34,14,34]
dynamicManaBarCoord=[13,16+30,214-100,16+30,195-100,34+30,13,34+30]
self.dynamicHealthBarCoord,self.dynamicManaBarCoord=dynamicHealthBarCoord,dynamicManaBarCoord
healthbarforgfround=playerInfo.创建多边形(14,15,214,16,196,34,14,34,fill=“black”,outline=“black”,width=2)
dynamicHealthBar=playerInfo.创建多边形(dynamicHealthBarCoord,fill=“red”,width=1)
healthBarBackground=playerInfo.创建多边形(11,13,220,13,196,37,11,37,fill=“”,outline=“gray”,width=2)
ManabarForgfround=playerInfo.创建多边形(14,15+30,214-100,16+30,196-100,34+30,14,34+30,fill=“black”,outline=“black”,width=2)
dynamicManaBar=playerInfo.创建_多边形(dynamicManaBarCoord,fill=“blue”,width=1)
manabackground=playerInfo.创建多边形(11,13+30,220-99,13+30,196-99,37+30,11,37+30,fill=“”,outline=“gray”,width=2)
self.dynamicHealthBar,self.dynamicManaBar=dynamicHealthBar,dynamicManaBar
#钮扣
攻击按钮(主窗口框,图像=self.strokeIcon,命令=lambda:self.Stroke(dynamicHealthBarCoord),光标=“hand1”,状态=“禁用”)
攻击位置(x=346.67-10,y=242-15)
Spell_Heal=tk.按钮(主窗口框架,image=self.healIcon,command=lambda:self.Heal(dynamicHealthBarCoord),cursor=“hand1”,state=“disabled”)
法术治疗位置(x=533.33+10,y=242-15)
攻击\火球=tk.按钮(主窗口框,图像=self.fireballIcon,命令=lambda:self.Fireball(dynamicHealthBarCoord,dynamicManaBarCoord),cursor=“hand1”,state=“disabled”)
攻击火球位置(x=346.67-10,y=242+60)
攻击\地震=tk.按钮(主窗口框架,图像=self.earthquackeIcon,命令=lambda:self.EarthQuacke(DynamicAlthbarCoord,dynamicManaBarCoord),光标=“hand1”,状态=“禁用”)
地震发生地点(x=533.33+10,y=242+60)
输入_Dunjon=tk.按钮(self.master,image=self.startIcon,command=self.Dunjon,cursor=“hand1”)
输入Dunjon.place(x=440,y=67)
self.Enter_The_Dunjon=输入_The_Dunjon
自攻\中风,自攻\治疗,自攻\火球,自攻\地震=攻击\中风,自攻\治疗,攻击\火球,攻击\地震
manaRegenerationThread=threading.Thread(目标=lambda:self.manaRegeneration(self.dynamicManaBarCoord))
ManaRecreationThread.setDaemon(True)
manaRecreationThread.start()
deathEventHandler线程=threading.Thread(target=lambda:self.deathEventHandler(self.dynamicHealthBarCoord))
deathEventHandlerThread.setDaemon(True)
deathEventHandlerThread.start()
#m=线程。线程(目标=lambda:manarecoord(dynamicManaBarCoord))
#m、 开始()
def冲程(自我、健康合作列表):
healthCoordList[2],healthCoordList[4]=healthCoordList[2]-20,healthCoordList[4]-20
self.ennemyInfo.coords(self.ennemyDynamicHealthBar,healthCoordList)
def Heal(自我、健康合作列表):
healthCoordList[2],healthCoordList[4]=214195
self.playerInfo.coords(self.dynamicHealthBar、healthCoordList)
def FireBall(自我、健康合作列表、管理合作列表):
healthCoordList[2],healthCoordList[4]=healthCoordList[2]-20,healthCoordList[4]-20
self.ennemyInfo.coords(self.ennemyDynamicHealthBar,healthCoordList)
manaCoordList[2],manaCoordLis
Spell_Heal = tk.Button(mainWindowFrame, text='healIcon',
command=lambda: self.Heal(dynamicManaBarCoord), cursor="hand1", state="disabled")
def Heal(self, healthCoordList) :
healthCoordList[2], healthCoordList[4] = 214, 195
self.playerInfo.coords(self.dynamicManaBar, healthCoordList)