所以我正在开发一个像tkinter中的游戏一样的地牢爬虫而不是pygame。我发现它非常困难,因为网格在代码中不起作用,我找不到在画布上创建可以通过键输入移动的形状的方法。我已经尝试过多次修复,但是无法实现这一目标。如果我能找到一些关于制作网格的帮助,也可以通过玩家的输入来移动形状,这在大多数情况下会有所帮助。这段代码有很多错误,因为我还是一个非常新的初学者,这对于第一场比赛来说可能过于雄心勃勃。
from tkinter import*
import random
tk = Tk()
photo = PhotoImage(file="dungeon-wallpaper-1920x720.png")
label = Label(tk, image=photo)
label.pack()
def start(): #Starting Title
print("You are a lone human who has ventured into a dangerous dungeon. "
"The hallway is packed with monsters and is the only way out")
print("Can your escape the Necromaner's Dungeon?")
print("Developer's Note: Use python console for battle system and to check the introduction")
start = Button(text = "Start", command = start, bg = "Red", fg = "White")
start.pack()
def __init__(self, *args, **kwargs):
tk.__init__(self, *args, **kwargs)
self.canvas = tk.Canvas(self, width=500, height=500, borderwidth=0, highlightthickness=0)
self.canvas.pack(side="top", fill="both", expand="true")
self.rows = 100
self.columns = 100
self.cellwidth = 25
self.cellheight = 25
self.rect = {}
self.oval = {}
for column in range(20):
for row in range(20):
x1 = column*self.cellwidth
y1 = row * self.cellheight
x2 = x1 + self.cellwidth
y2 = y1 + self.cellheight
self.rect[row,column] = self.canvas.create_rectangle(x1,y1,x2,y2, fill="blue", tags="rect")
self.oval[row,column] = self.canvas.create_oval(x1+2,y1+2,x2-2,y2-2, fill="blue", tags="oval")
self.redraw(1000)
def redraw(self, delay):
self.canvas.itemconfig("rect", fill="blue")
self.canvas.itemconfig("oval", fill="blue")
for i in range(10):
row = random.randint(0,19)
col = random.randint(0,19)
item_id = self.oval[row,col]
self.canvas.itemconfig(item_id, fill="green")
self.after(delay, lambda: self.redraw(delay))
def rightKey(event):
print("Up key pressed")
def leftKey(event):
print("Up key pressed")
def upKey(event):
print("Up key pressed")
def downKey(event):
print("Down key pressed")
tk.bind('<Up>', upKey)
tk.bind('<Down>', downKey)
tk.bind('<Left>', leftKey)
tk.bind('<Right>', rightKey)
def lootSys(): #LootSystem
playerMoney = 0
playerAttack = 10
playerHealth = 100
print("Input anything to take a turn. Input 1 to quit.")
for i in range(0, 10):
i += 1
turn = input()
if turn == str(1):
break
else:
chance = random.randint(1, 100)
if chance <= 5:
playerMoney += 20
print("Gold = " + str(playerMoney))
print("Attack Damage = " + str(playerAttack))
print("Health = " + str(playerHealth))
elif chance <= 15:
playerMoney += 10
print("Gold = " + str(playerMoney))
print("Attack Damage = " + str(playerAttack))
print("Health = " + str(playerHealth))
elif chance <= 30:
playerMoney += 5
print("Gold = " + str(playerMoney))
print("Attack Damage = " + str(playerAttack))
print("Health = " + str(playerHealth))
elif chance <= 50:
playerMoney += 1
print("Gold = " + str(playerMoney))
print("Attack Damage = " + str(playerAttack))
print("Health = " + str(playerHealth))
elif chance <= 70:
playerAttack += 10
print("Gold = " + str(playerMoney))
print("Attack Damage = " + str(playerAttack))
print("Health = " + str(playerHealth))
elif chance <= 80:
playerAttack += 20
print("Gold = " + str(playerMoney))
print("Attack Damage = " + str(playerAttack))
print("Health = " + str(playerHealth))
elif chance <= 100:
playerHealth += 20
print("Gold = " + str(playerMoney))
print("Attack Damage = " + str(playerAttack))
print("Health = " + str(playerHealth))
print("Gold = " + str(playerMoney)) #L00T
print("Attack Damage = " + str(playerAttack))
print("Health = " + str(playerHealth))
def battleSys(): #Battle System
playerHealth = 100
print("Input anything to take a turn, or input 1 to stop.")
for i in range(0, 10):
i += 1
turn = input()
if turn == str(1):
break
else:
chance = random.randint(1, 4)
if chance == 1:
playerHealth -= 10
print("Health = " + str(playerHealth))
elif chance == 2:
playerHealth -= 20
print("Health = " + str(playerHealth))
elif chance == 3:
playerHealth -= 40
print("Health = " + str(playerHealth))
else:
playerHealth += 5
print("Health = " + str(playerHealth))
if playerHealth <= 0:
print("Game Over")
break
else:
continue
if playerHealth > 0:
print("Congratulations! You win!")
lootSys()
battleSysAct = Button(text = "Battle System", command = battleSys, bg = "Blue", fg = "White")
battleSysAct.pack()
tk.mainloop()
答案 0 :(得分:0)
正如Bryan所说,你可以使用画布的move
方法。下面是一个简单的示例,其中播放器是一个红色圆圈,您可以使用键盘箭头在画布上移动。您可以向move_player
功能添加其他键,以在游戏中实施其他操作。
import tkinter as tk
class Game(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.can = tk.Canvas(self, width=200, height=200)
self.can.pack(fill="both", expand=True)
self.player = self.can.create_oval(50,50,70,70, fill="red")
self.bind("<Key>", self.move_player)
def move_player(self, event):
key = event.keysym
if key == "Left":
self.can.move(self.player, -20, 0)
elif key == "Right":
self.can.move(self.player, 20, 0)
elif key == "Up":
self.can.move(self.player, 0, -20)
elif key == "Down":
self.can.move(self.player, 0, 20)
if __name__ == '__main__':
game = Game()
game.mainloop()