2017-03-14 1 views
0

TKINTER DANS PYTHONComment réparer un problème de double mouvement?

Ok, donc j'essaye de faire un jeu de pong à 2 joueurs, et jusqu'ici, j'ai rencontré 3 problèmes. C'est le 3ème que je ne peux honnêtement obtenir ma tête autour (si vous voulez voir où la question se pose, trouver la logique de mouvement #Ball )

#Setting up the window 

from tkinter import * 

HEIGHT=500 
WIDTH=800 
window=Tk() 

window.title('PONG!') 
c=Canvas(window,width=WIDTH,height=HEIGHT,bg='black') 
c.pack() 

MID_X=WIDTH/2 
MID_Y=HEIGHT/2 
def pongstick(): 
    return c.create_polygon(0,0, 10,0, 10,70, 0,70, fill='white') 
def ball(): 
    return c.create_oval(MID_X-10,MID_Y-10, MID_X+10,MID_Y+10, fill='white') 

pong1=pongstick() 
pong2=pongstick() 
ballplay=ball() 
MID_Y=MID_Y-35 
c.move(pong1, 40, MID_Y) 
c.move(pong2, WIDTH-40, MID_Y) 

#Scores 
player1p=0 
player2p=0 

#Movement of the paddles 
stickspeed=10 
def move_stick(event): 
    if event.keysym == 'w': 
     c.move(pong1, 0, -stickspeed) 
    elif event.keysym == 's': 
     c.move(pong1, 0, stickspeed) 
    if event.keysym == 'Up': 
     c.move(pong2, 0, -stickspeed) 
    elif event.keysym == 'Down': 
     c.move(pong2, 0, stickspeed) 

#Ball movement logic 
ballspeed=10 
ballY=ballspeed 
ballX=ballspeed 
ballXadd=WIDTH/2 
ballYadd=HEIGHT/2 
def move_ball(): 
    c.move(ballplay, ballX, ballY) 
    ballXadd=ballXadd+ballX 
    ballYadd=ballYadd+ballY 
    if ballXadd > WIDTH: 
     player2p=player2p+1 
     c.move(ball,MID_X-10,MID_Y-10) 
     ballXadd=0 
     ballYadd=0 

    elif ballXadd < WIDTH: 
     player1p=player1p+1 
     c.move(ball,MID_X-10,MID_Y-10) 
     ballXadd=0 
     ballYadd=0 

    elif ballYadd > HEIGHT: 
     if ballX == ballspeed: 
      ballY = -ballspeed 
     elif ballX == -ballspeed: 
      ballY = ballspeed 

    elif ballYadd < HEIGHT: 
     if ballX == ballspeed: 
      ballY = ballspeed 
     elif ballX == -ballspeed: 
      ballY = -ballspeed 

#GAME! 
c.bind_all('<Key>',move_stick) 
move_ball() 

problème est, je reçois le message d'erreur suivant chaque fois que je exécutez ceci:

Traceback (most recent call last): 
    File "/Users/jackstrange/Documents/Untitled.py", line 79, in <module> 
    move_ball() 
    File "/Users/jackstrange/Documents/Untitled.py", line 50, in move_ball 
    c.move(ballplay, ballX, ballY) 
UnboundLocalError: local variable 'ballY' referenced before assignment 

Il y a probablement quelque chose que je suis absent qui est sérieusement base que tout l'enfer, comme l'aide d'une commande de retour ou quelque chose, mais ce qui me confond pourquoi fonctionne ballX mais BALLY ne fonctionne pas. Une aide serait bien: D

Répondre

0

Le problème est que c.move va changement les valeurs de ballX et BALLY. Si vous voulez changer une variable globale, vous devez le déclarer global dans la fonction. Tu n'as pas fait ça. par conséquent, les variables ballX/Y dans votre fonction sont des variables locales.

Étant donné que, l'erreur est plus facile à comprendre: vous n'avez pas défini les variables locales ballX/Y.

Ceci est juste l'un des nombreux dangers de dépendre de variables globales.

Pour résoudre le problème, je pense que tout ce que vous devez faire est d'ajouter une ligne à Teh haut de votre fonction:

global ballX, ballY 
+0

Pouvez-vous me donner quelques conseils pour le régler? Est-ce que je le mets juste littéralement dans la fonction? Cuz c'est irritant – gamegladiator123

+0

Juste découvert que c'était correct. Maintenant, j'ai rencontré un autre problème: comment est-ce que je boucle une partie de la fonction sans boucler l'autre tout en gardant tout le reste mobile? Fondamentalement, comment faire bouger la balle, avec détection de coup, tout en permettant aux pagaies de bouger? – gamegladiator123

+0

(1) C'est un problème distinct; veuillez poster une nouvelle question, selon les directives de StackOverflow. (2) Comme donnée, cette question est beaucoup trop large pour être qualifiée sur StackOverflow; c'est essentiellement nous demander de concevoir une grande partie de votre jeu. – Prune

0

changer votre déclaration def move_ball()-def move_ball(ballX, ballY) et l'appeler à l'aide move_ball(ballX, ballY)