Ciao a tutti!
Intanto, se servisse, per programmare uso c++ builder dell'Embarcadero (una versione successiva a borland c++ builder ma con lo stesso funzionamento).

Il mio progetto era quello di fare una specie di ping pong in cui due rettangoli (le racchette) posti ai lati dello schermo e comandati da due giocatori colpissero un quadratino (la pallina) che rimbalza ogni volta che incontra le sponde o le racchette.

Il problema è che se la pallina colpisce la racchetta in alto, spesso entra letteralmente dentro la racchetta e inizia a rimbalzarci dentro finché non esce. Come posso fare a risolvere questo problema?

Tutti i movimenti della pallina sono comandati da un timer che ogni 50 millisecondi sfrutta questo codice:
(Considerate che panel2 e 3 sono le racchette, panel5 è la pallina e panel1 lo sfondo verde.
Se aiuta nell'immagine in fondo sono segnati i vari Panel e qui potete scaricare l'eseguibile per rendervi un'idea di cosa succede)

codice:
void __fastcall TForm1::Timer1Timer(TObject *Sender) 
{ 
// movimento
Panel5->Left=floor(Panel5->Left+x);
Panel5->Top=floor(Panel5->Top+y);

// sponde
if(Panel5->Top < 0){y=-y;}
if(Panel5->Top > Panel1->Height-18){y=-y;}

// racchette
if(fabs(Panel5->Left-Panel2->Left) < Panel2->Width+2){
     if((Panel5->Top > Panel2->Top)&&(Panel5->Top < Panel2->Top+Panel2->Height)){ x=-x;}
                                                                            }
if(fabs(Panel5->Left-Panel3->Left) < Panel3->Width-2){
    if((Panel5->Top > Panel3->Top)&&(Panel5->Top < Panel3->Top+Panel3->Height))){ x=-x;}
			                                                  }

// goal
if(Panel5->Left < 8){ punteggio2++;
                             Label2->Caption=IntToStr(punteggio2);  //calcolo del punteggio
                             Panel5->Top=rand()%Panel1->Height;    //calcolo del punteggio
                             Panel5->Left=Panel4->Left;                  //calcolo del punteggio
                             srand(time(NULL));                             //rimessa in campo della palla
                             if(rand()&2!=0){x=5;}                         //rimessa in campo della palla
                             else {x=-5;}                                     //rimessa in campo della palla
                             srand(time(NULL));                             //rimessa in campo della palla
                             if(rand()&2!=0){y=5;}                         //rimessa in campo della palla
                             else {y=-5;}                                      //rimessa in campo della palla
                            }
else{ if(Panel5->Left > Panel1->Width-8){ 
                                                          punteggio1++;                                     
                                                          Label1->Caption=IntToStr(punteggio1);
                                                          Panel5->Top=rand()%Panel1->Height;
                                                          Panel5->Left=Panel4->Left;
                                                          srand(time(NULL));
                                                          if(rand()&2!=0){x=5;}
                                                          else {x=-5;}
                                                          srand(time(NULL));
                                                          if(rand()&2!=0){y=5;} 
                                                          else {y=-5;} 
                                                         }
     }

}