Erstellen eines Ping Pong Spiels mittels Python unter Verwendung einer grafischen Benutzeroberfläche

pingpong.py 7.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. # Programmierung 2 - Ping Pong Spiel
  2. # Willi Schlegel, Francine Theil, Kristin Weber
  3. # letzte Aenderung: 25.07.2017
  4. # -------------------------------------------------------------------------------
  5. # Import der einzelnen Module
  6. import random
  7. import time
  8. from Tkinter import *
  9. import os
  10. import sys
  11. # -------------------------------------------------------------------------------
  12. # Funktion fuer den Neustart des Programms
  13. def restart_program():
  14. python = sys.executable
  15. os.execl(python, python, * sys.argv)
  16. # -------------------------------------------------------------------------------
  17. # Eigenschaften des Balles definieren
  18. class Ball():
  19. def __init__(self, canvas, color, size, paddle):
  20. self.canvas = canvas
  21. self.paddle = paddle
  22. self.id = canvas.create_oval(15, 15, size, size, fill=color) # Groesse des Balles und Farbe
  23. self.canvas.move(self.id, 245, 100) # Bewegung des Balles im Spielfeld definieren
  24. self.xspeed = random.randrange(-4,4) # waagerechte Geschwindigkeit des Balles - links und rechts Wert 3
  25. self.yspeed = -2 # senkrechte Geschwindigkeit des Balles - Wert 1
  26. self.hit_bottom = False # Definition Ball beruehrt nicht den Boden
  27. self.score = 0 # Punkte starten bei Null
  28. def draw(self):
  29. self.canvas.move(self.id, self.xspeed, self.yspeed)
  30. pos = self.canvas.coords(self.id)
  31. if pos[0] <= 0:
  32. self.xspeed = 4 # Ball beruehrt den linken Rand und hat danach v = 3
  33. if pos[1] <= 0:
  34. self.yspeed = 4 # Ball beruehrt den oberen Rand und hat danach v = 3
  35. if pos[2] >= 500:
  36. self.xspeed = -4 # Ball beruehrt den rechten Rand und hat danach v = (-)3 (wegen Bewegungsrichtung nach links)
  37. if pos[3] >= 400:
  38. self.hit_bottom = True # Ball beruehrt den unteren - Switch zum definierten Ereignis
  39. if self.hit_paddle(pos) == True: # Ball trifft auf das Paddle
  40. self.yspeed = -4 # senkrechte Geschwindigkeit ist (-)3 (wegen Bewegungsrichtung nach oben)
  41. self.xspeed = random.randrange(-4,4) # waagerechte Geschwindigkeit ist 3 oder -3 (ja nach Bewegungsrichtung)
  42. self.score += 1 # Erhoehung des Punktestandes um 1 bei Auftreffen auf das Paddle
  43. def hit_paddle(self, pos): # Definition Auftreffen des Balles auf das Paddle
  44. paddle_pos = self.canvas.coords(self.paddle.id)
  45. if pos[2] >= paddle_pos[0] and pos[0] <= paddle_pos[2]: #
  46. if pos[3] >= paddle_pos[1] and pos[3] <= paddle_pos[3]: #
  47. return True # wenn Ball und Paddle sich Koordinaten teilen (Ball beruehrt nicht den Boden), verfahre nach while-Schleife (ganz unten)
  48. return False # wenn Ball und Paddle sich keine Koordinaten teilen (Ball beruehrt den Boden), verfahre nach while-Schleife (ganz unten)
  49. # -------------------------------------------------------------------------------
  50. # Eigenschaften des Paddles definieren
  51. class Paddle:
  52. def __init__(self, canvas, color):
  53. self.canvas = canvas
  54. self.id = canvas.create_rectangle(0, 0, 100, 10, fill=color) # Groesse und Farbe des Paddles
  55. self.canvas.move(self.id, 200, 300) # Startposition des Paddles
  56. self.xspeed = 0 # Startgeschwindigkeit ist Null
  57. self.canvas.bind_all('<KeyPress-Left>', self.move_left) # linke Pfeiltaste - Bewegung nach links
  58. self.canvas.bind_all('<KeyPress-Right>', self.move_right) # rechte Pfeiltaste - Bewegung nach rechts
  59. def draw(self):
  60. self.canvas.move(self.id, self.xspeed, 0)
  61. pos = self.canvas.coords(self.id)
  62. if pos[0] <= 0:
  63. self.xspeed = 0 # Paddle beruehrt linken Rand - v = 0
  64. if pos[2] >= 500:
  65. self.xspeed = 0 # Paddle beruehrt rechten Rand - v = 0
  66. def move_left(self, evt):
  67. self.xspeed = -7 # Paddle bewegt sich nach links mit v = 5
  68. def move_right(self, evt):
  69. self.xspeed = 7 # Paddle bewegt sich nach rechts mit v = 5
  70. # -------------------------------------------------------------------------------
  71. # Spieloberflaeche
  72. tk = Tk()
  73. tk.title("Superfantastisches Pink-Pong-Spiel") # Titel des Spiels
  74. canvas = Canvas(tk, width=500, height=400, bd=3, bg='pink') # Erstellen der Spieloberflaeche - Masse, Rand und Farbe
  75. canvas.pack()
  76. label = canvas.create_text(10, 10, anchor=NW, text="Punktestand: 0") # Label Punktestand oben links einfuegen
  77. tk.update() # Punktestand wird aktualisiert
  78. paddle = Paddle(canvas, 'black') # Paddle-Farbe
  79. ball = Ball(canvas, 'white', 25, paddle) # Groesse und Farbe des Balles
  80. neustart_button = Button(tk, text="Neues Spiel", command=restart_program) # Button Neues Spiel erstellen
  81. neustart_button.pack()
  82. start_button = Button(tk, text="Spiel starten", command=tk.quit) # Button Spiel starten erstellen
  83. start_button.pack()
  84. exit_button = Button(tk, text='Spiel beenden', command=tk.destroy) # Button Spiel beenden erstellen
  85. exit_button.pack()
  86. tk.mainloop()
  87. # -------------------------------------------------------------------------------
  88. def button_action():
  89. anweisungs_label.config()
  90. # -------------------------------------------------------------------------------
  91. # Namenseingabe
  92. def anzeige():
  93. def show_entry_fields():
  94. a = e1.get() # Neudefinition der Variable - einfacher
  95. print("Name: ", a) # Anzeigen des Namens in Python
  96. tupel = [a, str(ball.score)] # Tupel mit Name und Punktzahl erstellen
  97. tupel = str(tupel) # Tupel in String umwandeln
  98. hsin = open("highscore.txt", "a") # Textdatei oeffnen
  99. hsout = hsin.write(tupel + "\n") # Tupel zeilenweise in Textdatei schreiben
  100. hsin.close # Textdatei schliessen
  101. def highscore():
  102. master = Tk()
  103. master.title("Highscore-Liste") # Titel des Highscore-Fensters
  104. canvas = Canvas(master, width=200, height=400, bd=2, bg='white') # Groesse und Farbe des Fensters
  105. canvas.pack()
  106. zeige = "Name Punkte" # Definition des Inhalts eines Labels
  107. lese = open("highscore.txt", "r") # Textdatei oeffnen
  108. ausgeben = lese.read() # Textdatei lesen
  109. lese.close() # Textdatei schliessen
  110. label = canvas.create_text(5, 5, anchor=NW, text=zeige) # Label einfuegen
  111. tk.update()
  112. label = canvas.create_text(5, 5, anchor=NW, text=ausgeben) # Label mit Inhalt der Textdatei einfuegen
  113. master = Tk()
  114. master.title("Namen eingeben") # Fenster zur Namenseingabe
  115. e1 = Entry(master) # Feld, um Namen einzutippen
  116. e1.grid(row=0, column=1) # Formation des Feldes
  117. Button(master, text='Ok', command=show_entry_fields).grid(row=3, column=1, sticky=W, pady=4) # Button Ok definieren, der den Namen unter dem angezeigten Punktestand in Python anzeigt
  118. Button(master, text='Zurueck', command=master.destroy).grid(row=3, column=3, sticky=W, pady=4) # Button Zurueck definieren, der das Namenseingabe-Fenster schliesst
  119. Button(master, text='Highscore', command=highscore).grid(row=3, column=2, sticky=W, pady=4) # Button Highscore definieren, wo die Highscore-Liste angezeigt wird
  120. mainloop()
  121. # -------------------------------------------------------------------------------
  122. # Schleife fuer das fortlaufende Bewegen des Balles
  123. while ball.hit_bottom == False: # Schleife: solange der Ball nicht den Boden beruehrt
  124. ball.draw() # Zugriff auf obige Definition
  125. paddle.draw() # Zugriff auf obige Definition
  126. canvas.itemconfig(label, text="Punktestand: "+str(ball.score)) # Label mit Punktestand einfuegen, dahinter aktualisierter Punktestand
  127. tk.update_idletasks()
  128. tk.update()
  129. time.sleep(0.01) # Verzoegerung des Balles
  130. print "Punktestand: ", ball.score # Punktestand in Python printen
  131. if ball.hit_bottom == True:
  132. anzeige() # wenn der Ball den Boden beruehrt, Inhalt der Definition Anzeige ausfuehren