Skip to content

Instantly share code, notes, and snippets.

@bluemyria
Last active August 3, 2017 15:11
Show Gist options
  • Save bluemyria/43f8e9581496def757fa7e3b2d062ecf to your computer and use it in GitHub Desktop.
Save bluemyria/43f8e9581496def757fa7e3b2d062ecf to your computer and use it in GitHub Desktop.
Python Ball-Paddle Spiel
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