2016-12-09 35 views
0

Also ich entwickle ein Dungeon Crawler wie Spiel in Tkinter und nicht Pygame. Ich finde es sehr schwierig, weil das Gitter im Code nicht funktioniert und ich keine Möglichkeit finde, eine Form auf der Leinwand zu erstellen, die durch Tasteneingaben verschoben wird. Ich habe mehrere Fixes ausprobiert, kann aber keinen Weg finden, dies alles zusammen zu bringen. Wenn ich etwas Hilfe beim Erstellen eines Rasters finden könnte, das es auch ermöglicht, dass eine Form durch die Eingabe eines Spielers bewegt wird, würde das größtenteils helfen. Dieser Code hat viele Fehler, weil ich immer noch ein sehr neuer Anfänger bin und dies könnte für ein erstes Spiel zu ehrgeizig gewesen sein.Versuchen, ein Objekt in einem Gitter mit tkinter durch Spielereingaben bewegen

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

Die Einrückung Ihres Codes ist nicht konsistent und erschwert das Verständnis. – sirfz

+0

_ "Ich kann keinen Weg finden, um eine Form auf der Leinwand zu erstellen, die durch Tasteneingaben verschoben werden würde" _ - Jeder Canvas-Eintrag hat eine 'move'-Methode. Sie können es auch verschieben, indem Sie die Koordinaten des Objekts mit der Methode 'coords' anpassen. –

+0

was versuchst du zu bewegen? Ich sehe keinen "Spieler" und "Feind", den du bewegen könntest. – furas

Antwort

0

Als Bryan sagte, können Sie die move Methode der Leinwand verwenden können. Unten ist ein einfaches Beispiel, bei dem der Spieler ein roter Kreis ist, mit dem Sie sich mit den Pfeiltasten auf der Leinwand bewegen können. Sie können der Funktion move_player zusätzliche Schlüssel hinzufügen, um andere Aktionen im Spiel zu implementieren.

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

Danke, aber jetzt habe ich auch ein Problem, da die Art und Weise, wie ich tkinter importiere, nicht mit dem Aufbau des Klassenspiels funktioniert. Irgendwelche Ratschläge, wie das zu beheben ist? – Skymaster23

+0

Wenn Sie 'von tkinter import *' tun, entfernen Sie einfach die 'tk.' in meinem Code. –

Verwandte Themen