123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 |
- # Programmierung 2 - Ping Pong Spiel
- # Willi Schlegel, Francine Theil, Kristin Weber
- # letzte Aenderung: 25.07.2017
- # -------------------------------------------------------------------------------
- # Import der einzelnen Module
- import random
- import time
- from Tkinter import *
- import os
- import sys
- # -------------------------------------------------------------------------------
- # Funktion fuer den Neustart des Programms
- def restart_program():
- python = sys.executable
- os.execl(python, python, * sys.argv)
- # -------------------------------------------------------------------------------
- # Eigenschaften des Balles definieren
- class Ball():
- def __init__(self, canvas, color, size, paddle):
- self.canvas = canvas
- self.paddle = paddle
- self.id = canvas.create_oval(15, 15, size, size, fill=color) # Groesse des Balles und Farbe
- self.canvas.move(self.id, 245, 100) # Bewegung des Balles im Spielfeld definieren
- self.xspeed = random.randrange(-4,4) # waagerechte Geschwindigkeit des Balles - links und rechts Wert 3
- self.yspeed = -2 # senkrechte Geschwindigkeit des Balles - Wert 1
- self.hit_bottom = False # Definition Ball beruehrt nicht den Boden
- self.score = 0 # Punkte starten bei Null
- def draw(self):
- self.canvas.move(self.id, self.xspeed, self.yspeed)
- pos = self.canvas.coords(self.id)
- if pos[0] <= 0:
- self.xspeed = 4 # Ball beruehrt den linken Rand und hat danach v = 3
- if pos[1] <= 0:
- self.yspeed = 4 # Ball beruehrt den oberen Rand und hat danach v = 3
- if pos[2] >= 500:
- self.xspeed = -4 # Ball beruehrt den rechten Rand und hat danach v = (-)3 (wegen Bewegungsrichtung nach links)
- if pos[3] >= 400:
- self.hit_bottom = True # Ball beruehrt den unteren - Switch zum definierten Ereignis
- if self.hit_paddle(pos) == True: # Ball trifft auf das Paddle
- self.yspeed = -4 # senkrechte Geschwindigkeit ist (-)3 (wegen Bewegungsrichtung nach oben)
- self.xspeed = random.randrange(-4,4) # waagerechte Geschwindigkeit ist 3 oder -3 (ja nach Bewegungsrichtung)
- self.score += 1 # Erhoehung des Punktestandes um 1 bei Auftreffen auf das Paddle
- def hit_paddle(self, pos): # Definition Auftreffen des Balles auf das Paddle
- paddle_pos = self.canvas.coords(self.paddle.id)
- if pos[2] >= paddle_pos[0] and pos[0] <= paddle_pos[2]: #
- if pos[3] >= paddle_pos[1] and pos[3] <= paddle_pos[3]: #
- return True # wenn Ball und Paddle sich Koordinaten teilen (Ball beruehrt nicht den Boden), verfahre nach while-Schleife (ganz unten)
- return False # wenn Ball und Paddle sich keine Koordinaten teilen (Ball beruehrt den Boden), verfahre nach while-Schleife (ganz unten)
- # -------------------------------------------------------------------------------
- # Eigenschaften des Paddles definieren
- class Paddle:
- def __init__(self, canvas, color):
- self.canvas = canvas
- self.id = canvas.create_rectangle(0, 0, 100, 10, fill=color) # Groesse und Farbe des Paddles
- self.canvas.move(self.id, 200, 300) # Startposition des Paddles
- self.xspeed = 0 # Startgeschwindigkeit ist Null
- self.canvas.bind_all('<KeyPress-Left>', self.move_left) # linke Pfeiltaste - Bewegung nach links
- self.canvas.bind_all('<KeyPress-Right>', self.move_right) # rechte Pfeiltaste - Bewegung nach rechts
- def draw(self):
- self.canvas.move(self.id, self.xspeed, 0)
- pos = self.canvas.coords(self.id)
- if pos[0] <= 0:
- self.xspeed = 0 # Paddle beruehrt linken Rand - v = 0
- if pos[2] >= 500:
- self.xspeed = 0 # Paddle beruehrt rechten Rand - v = 0
- def move_left(self, evt):
- self.xspeed = -7 # Paddle bewegt sich nach links mit v = 5
- def move_right(self, evt):
- self.xspeed = 7 # Paddle bewegt sich nach rechts mit v = 5
- # -------------------------------------------------------------------------------
- # Spieloberflaeche
- tk = Tk()
- tk.title("Superfantastisches Pink-Pong-Spiel") # Titel des Spiels
- canvas = Canvas(tk, width=500, height=400, bd=3, bg='pink') # Erstellen der Spieloberflaeche - Masse, Rand und Farbe
- canvas.pack()
- label = canvas.create_text(10, 10, anchor=NW, text="Punktestand: 0") # Label Punktestand oben links einfuegen
- tk.update() # Punktestand wird aktualisiert
- paddle = Paddle(canvas, 'black') # Paddle-Farbe
- ball = Ball(canvas, 'white', 25, paddle) # Groesse und Farbe des Balles
- neustart_button = Button(tk, text="Neues Spiel", command=restart_program) # Button Neues Spiel erstellen
- neustart_button.pack()
- start_button = Button(tk, text="Spiel starten", command=tk.quit) # Button Spiel starten erstellen
- start_button.pack()
- exit_button = Button(tk, text='Spiel beenden', command=tk.destroy) # Button Spiel beenden erstellen
- exit_button.pack()
- tk.mainloop()
- # -------------------------------------------------------------------------------
- def button_action():
- anweisungs_label.config()
- # -------------------------------------------------------------------------------
- # Namenseingabe
- def anzeige():
- def show_entry_fields():
- a = e1.get() # Neudefinition der Variable - einfacher
- print("Name: ", a) # Anzeigen des Namens in Python
- tupel = [a, str(ball.score)] # Tupel mit Name und Punktzahl erstellen
- tupel = str(tupel) # Tupel in String umwandeln
- hsin = open("highscore.txt", "a") # Textdatei oeffnen
- hsout = hsin.write(tupel + "\n") # Tupel zeilenweise in Textdatei schreiben
- hsin.close # Textdatei schliessen
- def highscore():
- master = Tk()
- master.title("Highscore-Liste") # Titel des Highscore-Fensters
- canvas = Canvas(master, width=200, height=400, bd=2, bg='white') # Groesse und Farbe des Fensters
- canvas.pack()
- zeige = "Name Punkte" # Definition des Inhalts eines Labels
- lese = open("highscore.txt", "r") # Textdatei oeffnen
- ausgeben = lese.read() # Textdatei lesen
- lese.close() # Textdatei schliessen
- label = canvas.create_text(5, 5, anchor=NW, text=zeige) # Label einfuegen
- tk.update()
- label = canvas.create_text(5, 5, anchor=NW, text=ausgeben) # Label mit Inhalt der Textdatei einfuegen
- master = Tk()
- master.title("Namen eingeben") # Fenster zur Namenseingabe
- e1 = Entry(master) # Feld, um Namen einzutippen
- e1.grid(row=0, column=1) # Formation des Feldes
- 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
- Button(master, text='Zurueck', command=master.destroy).grid(row=3, column=3, sticky=W, pady=4) # Button Zurueck definieren, der das Namenseingabe-Fenster schliesst
- Button(master, text='Highscore', command=highscore).grid(row=3, column=2, sticky=W, pady=4) # Button Highscore definieren, wo die Highscore-Liste angezeigt wird
- mainloop()
- # -------------------------------------------------------------------------------
- # Schleife fuer das fortlaufende Bewegen des Balles
- while ball.hit_bottom == False: # Schleife: solange der Ball nicht den Boden beruehrt
- ball.draw() # Zugriff auf obige Definition
- paddle.draw() # Zugriff auf obige Definition
- canvas.itemconfig(label, text="Punktestand: "+str(ball.score)) # Label mit Punktestand einfuegen, dahinter aktualisierter Punktestand
- tk.update_idletasks()
- tk.update()
- time.sleep(0.01) # Verzoegerung des Balles
- print "Punktestand: ", ball.score # Punktestand in Python printen
- if ball.hit_bottom == True:
- anzeige() # wenn der Ball den Boden beruehrt, Inhalt der Definition Anzeige ausfuehren
|