尝试通过玩家输入使物体在网格中移动

2024-06-23 18:37:14 发布

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

所以我在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()

Tags: selfdeftkcanvasprinthealthelifdamage
1条回答
网友
1楼 · 发布于 2024-06-23 18:37:14

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

相关问题 更多 >

    热门问题