Intentar hacer que un objeto se mueva en una cuadrícula con tkinter a través de las entradas del jugador

Así que estoy desarrollando un juego de rastreo de mazmorras en tkinter y no en pygame. Me resulta muy difícil porque la cuadrícula no funciona dentro del código y no puedo encontrar una forma de crear una forma en el canvas que se movería con las entradas clave. He intentado varios arreglos, pero no puedo lograr una manera para que todos se unan. Si pudiera encontrar alguna ayuda para hacer una cuadrícula que también permita que una forma sea movida por la entrada de un jugador que ayudaría en su mayor parte. Este código tiene muchos errores porque todavía soy un principiante muy nuevo y esto podría haber sido demasiado ambicioso para un primer juego.

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('', upKey) tk.bind('', downKey) tk.bind('', leftKey) tk.bind('', 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("Congratulations! You win!") lootSys() battleSysAct = Button(text = "Battle System", command = battleSys, bg = "Blue", fg = "White") battleSysAct.pack() tk.mainloop() 

Como dijo Bryan, puedes usar el método de move del canvas. A continuación se muestra un ejemplo simple en el que el jugador es un círculo rojo que puede moverse por el canvas con las flechas del teclado. Puedes agregar claves adicionales a la función move_player para implementar otras acciones en el juego.

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