2016-12-09 40 views
0

因此,我正在開發一個類似tkinter遊戲的地牢爬行器,而不是pygame。我發現它非常困難,因爲網格不能在代碼中工作,並且我無法找到在畫布上創建可通過鍵輸入移動的形狀的方法。我已經嘗試了多種修復方法,但無法實現這種方式。如果我能找到一些幫助製作一個網格,也可以通過玩家的輸入來移動形狀,這對大多數人都有幫助。這段代碼有很多錯誤,因爲我仍然是一個非常新的初學者,這可能對第一場比賽來說太過雄心勃勃。試圖讓一個對象通過玩家輸入與tkinter移動

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

您的代碼的縮進不一致,很難理解。 – sirfz

+0

_「我找不到在畫布上創建可通過按鍵輸入移動的形狀的方法」_ - 每個畫布項都有一個「移動」方法。您還可以通過使用「coords」方法調整項目的座標來移動它。 –

+0

你嘗試移動什麼?我沒有看到任何可以移動的「玩家」和「敵人」。 – furas

回答

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) 
     self.mainloop() 

    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() 
+0

謝謝,但現在我也遇到了問題,因爲我導入tkinter的方式不適用於課程設置。有關如何解決這個問題的任何建議? – Skymaster23

+0

如果你從'tkinter import *'做',只需在我的代碼中刪除'tk.'。 –

相關問題