   Why does it loose?
  Hello, I read a tutorial on a site about AI's. So I thought I could try to make an AI for my pong game. So I did a try, and it worked or well it didn't since to cpu looses all the time. The code for the AI is this:// kontrollerna för spelare    if ( keys[SDLK_UP] ) { spelare1paddle.y -= 2; }    if ( keys[SDLK_DOWN] ) { spelare1paddle.y += 2; }   // kontrollerna för datan if (boll.x && boll.y < spelare2paddle.y && spelare2paddle.x){    spelare2paddle.y -= 2;}    if (boll.x && boll.y  > spelare2paddle.y && spelare2paddle.x ) {spelare2paddle.y += 2;}Ignore the comments, if this code isn't enough please tell me and I post the hole code.Kind Regard,Jepalano   
  The ball can move at a speed greater then 2 pixels or whatever? Try predicting where it will hit and going directly there.   ;if (boll.x && boll.y < spelare2paddle.y && spelare2paddle.x){    spelare2paddle.y -= 2; }if (boll.x && boll.y  > spelare2paddle.y && spelare2paddle.x ) {    spelare2paddle.y += 2;}im pretty sure that should beif ( boll.y < spelare2paddle.y){    spelare2paddle.y -= 2; }else if (boll.y  > spelare2paddle.y ){    spelare2paddle.y += 2;}unless the x values are important;  Anonymous Poster: Dosn't matter what speed I change to, he loose anyways ;(Rip-off: He lost even if I use your code ;(But thanks for the fast answers, I hope someone knows whats wrong :)// Jepalano   ;  can you give more details?does the AI move in the direction you expect or the other way?does the AI not move fast enough?does the AI move too fast?is the paddle.y the center of the paddle or the top of the paddle?is the ball.y the center of the ball?if you want it to never loose you can try: spelare2paddle.y = ball.yIftah.   ;  I give you the hole source code, maybe it's easier to help me then. The code:#include &lt;iostream&gt;#include &lt;SDL/SDL.h&gt;struct saker // Saker = sprites, denna strukturen håller ordning på alla sprites, allt som rör sig.{  int x;  int y;  int xpad;  int ypad;  int bredd;  int hojd;    };    // lite globala variabler nu    SDL_Surface *screen, *black, *surfBoll, *surfspelare1paddle, *surfspelare2paddle, *surfspelare1poang,   *surfspelare2poang, *s1vann, *s2vann;   saker boll, spelare1paddle, spelare2paddle;    int spelare1poang, spelare2poang;   // slut på globala variabler ;(    // tur att det kommer lite roliga funktioner nu iallafall ;)    SDL_Surface * ImageLoad(char *file){  SDL_Surface *temp1, *temp2;  temp1 = SDL_LoadBMP(file);  temp2 = SDL_DisplayFormat(temp1);  SDL_FreeSurface(temp1);  return temp2;}void DrawIMG(SDL_Surface *img, int x, int y){  SDL_Rect dest;  dest.x = x;  dest.y = y;  SDL_BlitSurface(img, NULL, screen, &dest);}// vi visar bara en bit av bilden, då slipper vi jobbiga spår som det lätt kan bli annars.void DrawIMG(SDL_Surface *img, int x, int y, int w, int h, int x2, int y2){  SDL_Rect babild;  babild.x = x;  babild.y = y;  SDL_Rect babild2;  babild2.x = x2;  babild2.y = y2;  babild2.w = w;  babild2.h = h;  SDL_BlitSurface(img, &babild2, screen, &babild);}// ny bild , då måste vi ta bort den gamla void draw(SDL_Surface *surf, int x, int y, int bredd, int hojd){    DrawIMG(black,x-20,y-20,bredd+80,hojd+80,x-20,y-20);    DrawIMG(surf,x,y);  SDL_Flip(screen);}// Nu till poängen ;Pvoid drawscore(){    if(spelare1poang==0) { surfspelare1poang=ImageLoad("0.bmp"); }    if(spelare1poang==1) { surfspelare1poang=ImageLoad("1.bmp"); }    if(spelare1poang==2) { surfspelare1poang=ImageLoad("2.bmp"); }    if(spelare1poang==3) { surfspelare1poang=ImageLoad("3.bmp"); }    if(spelare1poang==4) { surfspelare1poang=ImageLoad("4.bmp"); }    if(spelare1poang==5) { surfspelare1poang=ImageLoad("5.bmp"); }    if(spelare1poang==6) { surfspelare1poang=ImageLoad("6.bmp"); }    if(spelare1poang==7) { surfspelare1poang=ImageLoad("7.bmp"); }    if(spelare1poang==8) { surfspelare1poang=ImageLoad("8.bmp"); }    if(spelare2poang==9) { surfspelare1poang=ImageLoad("9.bmp"); }  if(spelare2poang==0) { surfspelare2poang=ImageLoad("0.bmp"); }    if(spelare2poang==1) { surfspelare2poang=ImageLoad("1.bmp"); }    if(spelare2poang==2) { surfspelare2poang=ImageLoad("2.bmp"); }    if(spelare2poang==3) { surfspelare2poang=ImageLoad("3.bmp"); }    if(spelare2poang==4) { surfspelare2poang=ImageLoad("4.bmp"); }    if(spelare2poang==5) { surfspelare2poang=ImageLoad("5.bmp"); }    if(spelare2poang==6) { surfspelare2poang=ImageLoad("6.bmp"); }    if(spelare2poang==7) { surfspelare2poang=ImageLoad("7.bmp"); }    if(spelare2poang==8) { surfspelare2poang=ImageLoad("8.bmp"); }    if(spelare2poang==9) { surfspelare2poang=ImageLoad("9.bmp"); }DrawIMG(surfspelare1poang,200,30);    DrawIMG(surfspelare2poang,600,30);   }   //visar allt som ska visasvoid DrawAll(){    draw(surfBoll, boll.x, boll.y, boll.bredd, boll.hojd);    draw(surfspelare1paddle, spelare1paddle.x, spelare1paddle.y, spelare1paddle.bredd, spelare1paddle.hojd);    draw(surfspelare2paddle, spelare2paddle.x, spelare2paddle.y, spelare2paddle.bredd, spelare2paddle.hojd);  drawscore();}// Nu blev det mål!!! Dags att ta bort bollen.void startaom(){    DrawIMG(black,0,0);  boll.x=395;    boll.y=295;    boll.xpad=2;    boll.ypad=2;    boll.bredd=10;    boll.hojd=10;  spelare1paddle.x=40;    spelare1paddle.y=260;    spelare1paddle.xpad=0;    spelare1paddle.ypad=0;    spelare1paddle.bredd=10;    spelare1paddle.hojd=80;  spelare2paddle.x=760;    spelare2paddle.y=260;    spelare2paddle.xpad=0;    spelare2paddle.ypad=0;    spelare2paddle.bredd=10;    spelare2paddle.hojd=80;} // Ställer tillbaka poängenvoid nytt(){    spelare1poang=0;    spelare2poang=0;  startaom();}   void CheckForCollision(){   if(boll.y &lt;= 0) { boll.ypad = -boll.ypad; }    if(boll.y+boll.hojd &gt;= 600) { boll.ypad = -boll.ypad; } if(spelare1paddle.y &lt;= 0) { spelare1paddle.y = 0; }    if(spelare1paddle.y+spelare1paddle.hojd &gt;= 600) { spelare1paddle.y = 600-spelare1paddle.hojd; }if(spelare2paddle.y &lt;= 0) { spelare2paddle.y = 0; }    if(spelare2paddle.y+spelare2paddle.hojd &gt;= 600) { spelare2paddle.y = 600-spelare2paddle.hojd; } if(boll.x &lt;= spelare1paddle.x+spelare1paddle.bredd & boll.y &gt;= spelare1paddle.y & boll.y &lt;= spelare1paddle.y+spelare1paddle.hojd)    {   boll.xpad = -boll.xpad;   boll.xpad++;   boll.ypad++;    } if(boll.x+boll.bredd &gt;= spelare2paddle.x & boll.y &gt;= spelare2paddle.y & boll.y &lt;= spelare2paddle.y+spelare2paddle.hojd)    {   boll.xpad = -boll.xpad;   boll.xpad--;   boll.ypad--;    }//kolla om spelare1 vinner    if(boll.x &gt;= 800-boll.bredd)    {   spelare1poang++;   if(spelare1poang==10)    {   int i=0;   while(i!=500)   {   DrawIMG(s1vann,0,0);   SDL_Flip(screen);   i++;   } nytt();    }   SDL_Delay(500);   startaom();    }  //kolla om spelare 2 vinner    if(boll.x &lt;= 0)    {   spelare2poang++;   if(spelare2poang==10)    {   int i=0;   while(i!=500)   {   DrawIMG(s2vann,0,0);   SDL_Flip(screen);   i++;   } nytt();    } SDL_Delay(500);   startaom();    }}// här flyttar vi lite på bollen ;Pvoid uppdboll(){    boll.x+=boll.xpad;    boll.y+=boll.ypad;}int main( int argc, char *arcv[]){    if( SDL_Init(SDL_INIT_AUDIO | SDL_INIT_VIDEO) &lt; 0 )    {   std::cout&lt;&lt;"SDL FEL!" &lt;&lt;std::endl&lt;&lt;"Fel Meddelande: "&lt;&lt;SDL_GetError();   exit(1);    }    atexit(SDL_Quit);  screen=SDL_SetVideoMode(800,600,32,SDL_SWSURFACE|SDL_HWPALETTE);    if(screen == NULL)    {   std::cout&lt;&lt;"FEL INSTÄLLNING! 800x600x32"&lt;&lt;std::endl&lt;&lt;"Fel Meddelande: "&lt;&lt;SDL_GetError();   exit(1);    }    black=ImageLoad("bg.bmp");    surfBoll=ImageLoad("boll.bmp");    surfspelare1paddle=ImageLoad("pad.bmp");    surfspelare2paddle=ImageLoad("pad.bmp");    s1vann=ImageLoad("s1vann.bmp");    s2vann=ImageLoad("s2vann.bmp");  boll.x=395;    boll.y=295;    boll.xpad=2;    boll.ypad=2;    boll.bredd=10;    boll.hojd=10;  spelare1paddle.x=40;    spelare1paddle.y=260;    spelare1paddle.xpad=0;    spelare1paddle.ypad=0;    spelare1paddle.bredd=10;    spelare1paddle.hojd=80;  spelare2paddle.x=760;    spelare2paddle.y=260;    spelare2paddle.xpad=0;    spelare2paddle.ypad=0;    spelare2paddle.bredd=10;    spelare2paddle.hojd=80;    SDL_WM_SetCaption("Jepalano's Pong","Jepalano's Pong");  // Yay, Titlen är Jepalano's Pong!SDL_WM_SetIcon(SDL_LoadBMP("ikon.bmp"),NULL);    SDL_ShowCursor(0);  // Tar bort musen. Det kan störa ganska mycket.while(1)    {   DrawAll();   uppdboll();   CheckForCollision();  SDL_Event event;   Uint8* keys;  while( SDL_PollEvent(&event) ){    if(event.type == SDL_QUIT) { return 0; }    if(event.type == SDL_KEYDOWN)    {   if(event.key.keysym.sym==SDLK_ESCAPE) { return 0; }  // ESC = Exit    }}keys = SDL_GetKeyState(NULL);    //    if ( keys[SDLK_UP] ) { spelare1paddle.y -= 2; }    if ( keys[SDLK_DOWN] ) { spelare1paddle.y += 2; }  // kontrollerna för datanif (boll.x && boll.y &lt; spelare2paddle.y && spelare2paddle.x){spelare2paddle.y -= 2;}if (boll.x && boll.y &gt; spelare2paddle.y && spelare2paddle.x ) {spelare2paddle.y += 2;}   }   return 0;   // ~ The End ~}// Jepalano[Edited by - jepalano on December 26, 2005 3:08:09 PM];  first up, post your code using the [ source ] and [ /source] tags, without spaces. this will make your code neat and readable...also, as many of us here dont share the same first language as you, your code is quite off-putting.try:paddle.y = (ball.y-ballSurface->h) + paddleSurface->h;substitute boll for ball, spelare2paddle for paddle, and their SDL_Surface*s for the Surface variables...   ;  I'd do this:Simply interpolate the paddle.y towards ball.y with a speed corresponding to the difficulty of the "AI" :)if (paddle.y > ball.y) paddle.y -= allowedspeed;if (paddle.y < ball.y) paddle.y += allowedspeed;also, unless you want your paddle to "flicker", I'd suggest doing some further checking so you don't "overshoot" the ball position.Edit: inline float Lerp(float ValueA, float ValueB, float &Percentage,float LerpLimit=0.0001){  if (ValueA > ValueB)  {  if (ValueA - ValueB < LerpLimit)  return ValueB;  else  return ValueA - (ValueA*Percentage) + (ValueB*Percentage);  }  else  {  if (ValueB - ValueA < LerpLimit)  return ValueB;  else  return ValueA - (ValueA*Percentage) + (ValueB*Percentage);  }}Above is a generic linear-interpolation which I use A LOT in my games.. hehe. it's a gods gift! ;) Can be speeded up quite a bit, if you skip the "Lerp Limit" thing, but I keep it so that values become exactly ValueB :)Peace!   ;Quote:Original post by jepalanoHello, I read a tutorial on a site about AI's. So I thought I could try to make an AI    if (boll.x && boll.y < spelare2paddle.y && spelare2paddle.x){    spelare2paddle.y -= 2; Your problem is that this doesn't actually work the way you'd expect if ( boll.x && boll.y  < spelare2paddle.y && spelare2paddle.x) { }If you unwrap the logic, it's actually saying if ( boll.x != 0 &&  boll.y  < spelare2paddle.y &&  spelare2paddle.x != 0)  { }Which I suspect wasn't what you had in mind.Try this instead if ( boll.x  < spelare2paddle.x &&  boll.y  < spelare2paddle.y)  { }