尝试使用tkinter通过播放器输入使对象在网格中移动

时间:2016-12-09 18:57:56

标签: python tkinter

所以我正在开发一个像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()

1 个答案:

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