zunächst das Programm soll den Wert der globalen Variablen int_choice
jedes Mal, wenn ein Spieler Partitur aktualisieren (es ist ein Pong-Spiel)Ausgabe mit einer globalen Variablen
int_choice
kann nur einen Wert von 1 oder 0. Wenn es 1, die Funktion left_or_right
"erzählt" der Ball nach rechts gehen, wenn es 0 ist, geht der Ball nach links.
int_choice
ist an einigen Stellen aktualisiert: am Anfang ist es initialisiert, dann in der left_or_right()
Funktion, dann in der draw()
Funktion.
Jedes Mal, wenn der Benutzer ein Tor erzielt, sollte der Ball von der Mitte des Tisches zu diesem Benutzer neu gespawnt werden, aber der Ball erscheint immer zweimal in die gleiche Richtung und dann zweimal in die entgegengesetzte Richtung und so weiter, egal wer war der Letzte, der zählt.
Hier ist der Code:
import random
int_choice = random.randint(0,1)
direc = None
def left_or_right():
global direc, int_choice
if int_choice == 0:
direc = "LEFT"
elif int_choice == 1:
direc = "RIGHT"
return direc
def spawn_ball(direction):
left_or_right()
global ball_pos, ball_vel # these are vectors stored as lists
ball_pos = [WIDTH/2, HEIGHT/2]
if direction == "LEFT":
ball_vel[0] = (random.randrange(12, 25)*(-0.1))
print "Velocity[0]: ", ball_vel[0]
ball_vel[1] = (random.randrange(6, 19)*(-0.1))
elif direction == "RIGHT":
ball_vel[0] = (random.randrange(12, 25)*(0.1))
print "Velocity[0]: ", ball_vel[0]
ball_vel[1] = (random.randrange(6, 19)*(-0.1))
print "Velocity[1]: ", ball_vel[1]
def new_game():
global paddle1_pos, paddle2_pos, paddle1_vel, paddle2_vel, direc
global score1, score2,
spawn_ball(direc)
score1 = 0
score2 = 0
def draw(canvas):
global remaining_names, score1, score2, paddle1_pos, paddle2_pos, ball_pos, ball_vel, BALL_RADIUS, direc
global int_choice
# update ball
ball_pos[0] += ball_vel[0]
ball_pos[1] += ball_vel[1]
if ball_pos[1] - BALL_RADIUS <= 0:
ball_vel[1] = ball_vel[1] + (ball_vel[1] * (-2))
elif ball_pos[1] + BALL_RADIUS >= HEIGHT:
ball_vel[1] = ball_vel[1] + (ball_vel[1] * (-2))
elif ball_pos[0] - BALL_RADIUS <= (0 + PAD_WIDTH):
if (ball_pos[1] > paddle1_pos) and (ball_pos[1] < (paddle1_pos + PAD_HEIGHT)):
ball_vel[0] = ball_vel[0] + (ball_vel[0] * (-2.1))
else:
int_choice = 1
spawn_ball(direc)
score2 = score2 + 1
elif (ball_pos[0] + BALL_RADIUS) >= (WIDTH - PAD_WIDTH):
if (ball_pos[1] > paddle2_pos) and (ball_pos[1] < (paddle2_pos + PAD_HEIGHT)):
ball_vel[0] = ball_vel[0] + (ball_vel[0] * (-2.1))
else:
int_choice = 0
spawn_ball(direc)
score1 = score1 + 1
'random.randint (0,1)' ist ein Alias für 'random.randrange (2)'. Erwäge, das Spätere zu verwenden. –
Warum verwenden Sie überhaupt * zwei * globals, die dasselbe bedeuten? Und Ihre 'left_or_right()' Funktion könnte einfach durch eine Liste ersetzt werden: 'directions = ['LINKS', 'RECHTS']', und 'directions [int_choice]' würden die ganze Zahl jedes Mal in Text umwandeln, wenn Sie den Text benötigen. –
Sie übergeben auch die Richtung in 'spawn_ball()', die dann * auch 'left_or_right()' * * aufruft. Warum in die Richtung gehen, dann eine Funktion aufrufen, um sie erneut einzustellen? Die Funktion gibt auch die Richtung zurück, aber Sie ignorieren den Rückgabewert überall. –