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.