# 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('', self.move_left) # linke Pfeiltaste - Bewegung nach links self.canvas.bind_all('', 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