Last active
August 3, 2017 15:11
-
-
Save bluemyria/43f8e9581496def757fa7e3b2d062ecf to your computer and use it in GitHub Desktop.
Python Ball-Paddle Spiel
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from tkinter import * | |
import random | |
import time | |
#für unseren Ball brauchen wir eine Klasse | |
class Ball: | |
def __init__(self, canvas, paddle, color): | |
#der Ball muss unser Canvas kennen | |
self.canvas = canvas | |
#Der Ball soll den Paddel auch kennen | |
self.paddle = paddle | |
# wir malen den Ball und bringen ihn auf x=245 und y=100 | |
self.id = canvas.create_oval(10, 10, 25, 25, fill=color) | |
self.canvas.move(self.id, 245, 100) | |
#wir nehmen 6 mögliche startpunkte | |
starts = [-3, -2, -1, 1, 2, 3] | |
#vermischen sie | |
random.shuffle(starts) | |
#und nehmen den ersten punkt als start für x | |
self.x = starts[0] | |
self.y = -3 | |
self.canvas_height = self.canvas.winfo_height() | |
self.canvas_width = self.canvas.winfo_width() | |
self.hit_bottom = False | |
def draw(self): | |
self.canvas.move(self.id, self.x, self.y) | |
pos = self.canvas.coords(self.id) | |
if pos[1] <= 0: | |
#ball verschwindet am obersten Rand! | |
#deswegen setzen wir seine y Richtung auf 1 (abwärts) | |
self.y = 1 | |
if pos[3] >= self.canvas_height: | |
#das Spiel endet falls der Ball | |
#den untersten Rand erreicht | |
self.hit_bottom = True | |
if pos[0] <= 0: | |
#ball verschwindet am linken Rand! | |
#deswegen setzen wir seine x Richtung auf 1 (nach rechts) | |
self.x = 1 | |
if pos[2] >= self.canvas_width: | |
#ball verschwindet am rechten Rand! | |
#deswegen setzen wir seine x Richtung auf -1 (nach links) | |
self.x = -1 | |
#hat der Ball den Paddel erwischt? Dann ändert er seine Richtung | |
#auf -1 (aufwärts) | |
if self.hit_paddle(pos) == True: | |
self.y = -1 | |
def hit_paddle(self, pos): | |
#pos[] hat die Ball-Koordinaten und paddle_pos[] die Paddel-Koordinaten | |
paddle_pos = self.canvas.coords(self.paddle.id) | |
#Nur wenn die Ball Position pos[2] ist zwischen paddle_pos[0] | |
#und paddle_pos[2] kommt eine Kollision in Frage | |
if pos[2]> paddle_pos[0] and pos[0] <= paddle_pos[2]: | |
#und dann, nur wenn die Ball Position pos[3] ist zwischen paddle_pos[1] | |
#und paddle_pos[2] gab es tatsächlich eine Kollision! | |
if pos[3]> paddle_pos[1] and pos[3] <= paddle_pos[3]: | |
return True | |
return False | |
#für unseren Paddel brauchen wir auch eine Klasse | |
class Paddle: | |
def __init__(self, canvas, color): | |
self.canvas = canvas | |
self.id = canvas.create_rectangle(0, 0, 100, 10, fill=color) | |
self.canvas.move(self.id, 200, 300) | |
self.x = 0 | |
self.canvas_width = self.canvas.winfo_width() | |
#die Funktionen turn_left und turn_right werden gebunden | |
#mit den Ereignissen KeyPress-Left, KeyPress-Left (Pfeile) | |
self.canvas.bind_all('<KeyPress-Left>', self.turn_left) | |
self.canvas.bind_all('<KeyPress-Right>', self.turn_right) | |
def turn_left(self, evt): | |
self.x = -2 | |
def turn_right(self, evt): | |
self.x = 2 | |
def draw(self): | |
self.canvas.move(self.id, self.x, 0) | |
pos = self.canvas.coords(self.id) | |
#genau wie beim Ball, darf der Paddel nicht weiter | |
#als der rechte oder der linke Rand | |
if pos[0] <= 0: | |
self.x = 1 | |
elif pos[2] >= self.canvas_width: | |
self.x = -1 | |
tk = Tk() | |
tk.title("Mein 1. cooles Python Spiel") | |
tk.resizable(0, 0) | |
tk.wm_attributes("-topmost", 1) | |
canvas = Canvas(tk, width=500, height=400, bd=0, highlightthickness=0) | |
canvas.pack() | |
tk.update() | |
#so wird das Objekt paddle erzeugt | |
paddle=Paddle(canvas, 'blue') | |
#so wird das Objekt ball erzeugt (beachtet die Gross- und Kleinschreibung :) ) | |
ball=Ball(canvas, paddle, 'red') | |
#damit wir die Änderungen sehen können wird der Ball und der Paddel mit draw() bewegt | |
#und das tkinter Fenster wird immer wieder aktualisiert (100 mal pro Sekunde) | |
#aber nur solange der Ball den untersten Rand nicht erreicht hat | |
while True: | |
if ball.hit_bottom == False: | |
ball.draw() | |
paddle.draw() | |
tk.update_idletasks() | |
tk.update() | |
time.sleep(0.01) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment