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