Das Programm ist doch einwandfrei
Verfasst: Sonntag 3. September 2017, 12:15
Andere Benennungen gemacht (search replace). Eine Funktion außen rum, damit sich keiner beschwert und übersichtlicher umsortiert, nämlich Konstanten, Variablen, Widgets, Bindings und Spiel Ablauf und alles sieht doch gut aus:
Ich meine, das macht man eben so. Zum Schluß benennt man besser und kopiert übersichtlicher um. Aber es dass man es wegwirft, weil es noch nicht übersichtlich geordnet ist, ist Krampf. Also, so ein Programm ist kein Pfusch es fehlten nur noch abschließende Verschönerungsarbeiten.
Allerdings RACKET_WIDTH habe ich nicht richtig benannt. Es handelt sich hierbei um den Abstand vom Spielrand. Die Breite ist 10.
Code: Alles auswählen
import tkinter as tk
class Var: pass
def main():
# constants ====================
FIELD_WIDTH = 800
FIELD_HEIGHT = 400
BALL_SIZE = 20
RACKET_SPEEED = 20
RACKET_HEIGHT = 60
RACKET_WIDTH = 20
# variables =====================
score = Var()
racket_ypos = Var()
ball = Var()
score.left = score.right = 0
racket_ypos.left = racket_ypos.right = (FIELD_HEIGHT - RACKET_HEIGHT)/2
ball.x , ball.y = RACKET_WIDTH , (FIELD_HEIGHT - BALL_SIZE)/2
ball.dx = ball.dy = 15
ball.playing = 0
# widgets =======================
win = tk.Tk();
win.title("Pong")
playing_field = tk.Canvas(win, bg='black',height=FIELD_HEIGHT, width=FIELD_WIDTH)
playing_field.pack()
ping_pong_ball = playing_field.create_oval(ball.x, ball.y, ball.x+BALL_SIZE, ball.y+BALL_SIZE, width=2, fill='white')
line = playing_field.create_line(FIELD_WIDTH/2, 0, FIELD_WIDTH/2, FIELD_HEIGHT, width=4, fill="white", dash=(4, 8 ))
left_racket = playing_field.create_line(RACKET_WIDTH, racket_ypos.left, RACKET_WIDTH, racket_ypos.left+RACKET_HEIGHT, width=10, fill="white")
right_racket = playing_field.create_line(FIELD_WIDTH-RACKET_WIDTH, racket_ypos.right, FIELD_WIDTH-RACKET_WIDTH, racket_ypos.right+RACKET_HEIGHT, width=10, fill="white")
# Create the score text
counter=playing_field.create_text(FIELD_WIDTH/2, 20, text='0:0', font=('courier', 20), fill="white")
# bindings ======================
def lup(event):
if racket_ypos.left > RACKET_SPEEED:
racket_ypos.left=racket_ypos.left-RACKET_SPEEED
def ldown(event):
if racket_ypos.left < (FIELD_HEIGHT-RACKET_HEIGHT-RACKET_SPEEED):
racket_ypos.left=racket_ypos.left+RACKET_SPEEED
def rmove(event):
ypos = event.y
if ypos > 0 and ypos < (FIELD_HEIGHT-RACKET_HEIGHT): # if in range
racket_ypos.right = ypos
def startit(event):
ball.playing = 1
# Use the following keys to move the racket
win.bind('q', lup)
win.bind('a', ldown)
win.bind('<B1-Motion>', rmove)
win.bind('<space>', startit) # start game by hitting space
# game sequence ===============================================
def move():
if wenn_die_runde_nicht_zu_ende_ist():
bewegt_sich_der_ball_ueber_das_spielfeld()
if wenn_der_ball_am_oberen_rand_anstoesst():
dann_soll_der_ball_sich_wieder_nach_unten_bewegen()
elif wenn_der_ball_am_unteren_rand_anstoesst():
dann_soll_der_ball_sich_wieder_nach_oben_bewegen()
if wenn_der_ball_auf_den_linken_schlaeger_knallt():
dann_soll_er_vom_linken_schlaeger_zurueckprallen()
elif wenn_der_ball_auf_den_rechten_schlaeger_knallt():
dann_soll_er_vom_rechten_schlaeger_zurueckprallen()
if wenn_der_ball_ins_rechte_aus_geht():
dann_erhoehe_die_trefferzahl_fuer_den_linken_spieler()
positioniere_den_ball_auf_der_startposition_fuer_den_rechten_spieler()
und_die_runde_ist_zu_ende()
elif wenn_der_ball_ins_linke_aus_geht():
dann_erhoehe_die_trefferzahl_fuer_den_rechten_spieler()
positioniere_den_ball_auf_der_startposition_fuer_den_linken_spieler()
und_die_runde_ist_zu_ende()
schlaeger_ball_und_treffer_darstellen()
win.after(50, move)
def wenn_die_runde_nicht_zu_ende_ist():
return ball.playing
def bewegt_sich_der_ball_ueber_das_spielfeld():
ball.x, ball.y = ball.x +ball.dx, (ball.y+ball.dy)
def positioniere_den_ball_auf_der_startposition_fuer_den_linken_spieler():
ball.x,ball.y,ball.dx = RACKET_WIDTH+10, racket_ypos.left+(RACKET_HEIGHT-BALL_SIZE)/2, abs(ball.dx)
def positioniere_den_ball_auf_der_startposition_fuer_den_rechten_spieler():
ball.x,ball.y,ball.dx = FIELD_WIDTH-RACKET_WIDTH-10, racket_ypos.right+(RACKET_HEIGHT-BALL_SIZE)/2,-abs(ball.dx)
def wenn_der_ball_am_oberen_rand_anstoesst():
return ball.y > (FIELD_HEIGHT-BALL_SIZE)
def dann_soll_der_ball_sich_wieder_nach_unten_bewegen():
ball.y, ball.dy = FIELD_HEIGHT-BALL_SIZE, -ball.dy
def wenn_der_ball_am_unteren_rand_anstoesst():
return ball.y < 0
def dann_soll_der_ball_sich_wieder_nach_oben_bewegen():
ball.y, ball.dy= 0, -ball.dy
def wenn_der_ball_ins_rechte_aus_geht():
return ball.x > (FIELD_WIDTH-BALL_SIZE)
def wenn_der_ball_ins_linke_aus_geht():
return ball.x < 0
def dann_erhoehe_die_trefferzahl_fuer_den_linken_spieler():
score.left=score.left+1 # increment score for left player
def dann_erhoehe_die_trefferzahl_fuer_den_rechten_spieler():
score.right=score.right+1 # increment score for right player
def wenn_der_ball_auf_den_linken_schlaeger_knallt():
return ball.x <= RACKET_WIDTH and ball.y>racket_ypos.left and ball.y < (racket_ypos.left+RACKET_HEIGHT)
def dann_soll_er_vom_linken_schlaeger_zurueckprallen():
ball.x, ball.dx = RACKET_WIDTH+5, -ball.dx
def und_die_runde_ist_zu_ende():
ball.playing = 0 # stop the game
def wenn_der_ball_auf_den_rechten_schlaeger_knallt():
return ball.x >= (FIELD_WIDTH-RACKET_WIDTH-BALL_SIZE) and ball.y >= racket_ypos.right and ball.y <= (racket_ypos.right+RACKET_HEIGHT)
def dann_soll_er_vom_rechten_schlaeger_zurueckprallen():
ball.x, ball.dx = (FIELD_WIDTH-RACKET_WIDTH-BALL_SIZE-5), -ball.dx
def schlaeger_ball_und_treffer_darstellen():
playing_field.coords(ping_pong_ball, ball.x, ball.y, ball.x+BALL_SIZE, ball.y+BALL_SIZE)
# draw current score
playing_field.itemconfigure(counter, text=str(score.left) + ":" + str(score.right))
# Change the positon of the two rackets
playing_field.coords(right_racket, FIELD_WIDTH-RACKET_WIDTH, racket_ypos.right, FIELD_WIDTH-RACKET_WIDTH, racket_ypos.right+RACKET_HEIGHT)
playing_field.coords(left_racket, RACKET_WIDTH, racket_ypos.left, RACKET_WIDTH, racket_ypos.left+RACKET_HEIGHT)
# == start game ======================
move() # draw next sequence
win.mainloop()
main()
Allerdings RACKET_WIDTH habe ich nicht richtig benannt. Es handelt sich hierbei um den Abstand vom Spielrand. Die Breite ist 10.