pitkästä aikaa

taas täällä vaivaamassa teitä.

Miks homma kaatuu kun TarkistaMatti funkiossa?


#include
#include
#include

#define MUSTA 567
#define VALKOINEN 83

//Tarkista matti kaatuu.
//tarkista siirt bugittaa kans

int syoty[2][16]={0};

void PiirraKuva(SDL_Surface *kuva, SDL_Surface *naytto, int x, int y);
void PiirraKuvaAlue(SDL_Surface *kuva, SDL_Surface *naytto, int kuvax, int kuvay, int leveys, int korkeus, int nayttox, int nayttoy);
int PiirraNappulat(int ruudut[8][8], SDL_Surface * kuva, SDL_Surface * naytto);
int TarkistaSiirto(int nappula, int sx, int sy, int nsx, int nsy, int ruudut[8][8], int vuoro);
int Oma(int vuoro, int tar);
int TarkistaMatti(int ruudut[8][8]);

int main(int argc, char *argv[])
{
   SDL_Init(SDL_INIT_VIDEO);

SDL_WM_SetCaption("SudokuGame", NULL);

   SDL_Surface * naytto;
   SDL_Surface * nappulat;
   SDL_Surface * tausta;
   SDL_Surface * merkki;

   naytto = SDL_SetVideoMode(1024, 768, 32, SDL_HWSURFACE|SDL_FULLSCREEN|SDL_DOUBLEBUF);
   tausta = SDL_LoadBMP("Art\\Ctausta.bmp");
   nappulat = SDL_LoadBMP("Art\\Cnappulat.bmp");
   merkki = SDL_LoadBMP("Art\\Cmerkki.bmp");

   int hiiri=0,x=0,y=0;
   Uint8* nappi;
   SDL_Event tapahtuma;

   int sx=0, sy=0;
   int nsx=0, nsy=0;

   int vuorossa=1, voittaja=0;
   bool peli = true;

   int ruudut[8][8]={
      {206,201,205,204,203,205,201,206},
      {202,202,202,202,202,202,202,202},
      { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
      { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
      { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
      { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
      {102,102,102,102,102,102,102,102},
      {106,101,105,103,104,105,101,106}
   };

   //valkoiset 101-106
   //mustat 201-206

   //hevonen.......1
   //sotilas.......2
   //kuningatar....3
   //kuningas......4
   //lähetti.......5
   //torni.........6

   //62x62px
   //44x44px
   //9px

   int si=1;

   while(peli == true)
   {
   
      SDL_PollEvent(&tapahtuma);
      if ( tapahtuma.type == SDL_QUIT ){ break; }
      if ( tapahtuma.type == SDL_KEYDOWN )
      {
         if ( tapahtuma.key.keysym.sym == SDLK_ESCAPE ){ break; }
      }

      hiiri = SDL_GetMouseState(&x,&y);

      nappi = SDL_GetKeyState(NULL);

      //400,143
      //900,640
      
      if(hiiri == 1)
      {
         if(x > 400 && x < 903 && y > 143 && y < 643)
         {
            nsx = (x-400)/63;
            nsy = (y-143)/63;

            if(ruudut[nsx][nsy] > vuorossa*100 && ruudut[nsx][nsy] < vuorossa*100 7)
            {
               sx = nsx;
               sy = nsy;
               si = 2;
            }
            else if(Oma(vuorossa, ruudut[nsx][nsy])!= 0 && ruudut[sx][sy] > vuorossa*100 && ruudut[sx][sy] < vuorossa*100 7 && si == 2)
            {
               //MATTI PÄÄLLÄ JO voittaja on 11 tai 12!! TARKISTUS TARVITAAN
               fprintf(stdout, "sx %i, sy %i, nsx %i, nsy %i, si %i, vuoro %i\n", sx, sy, nsx, nsy, si, vuorossa);
               if(TarkistaSiirto(ruudut[sx][sy], sx, sy, nsx, nsy, ruudut, vuorossa) != 0)
               {
                  ruudut[nsx][nsy] = ruudut[sx][sy];
                  ruudut[sx][sy] = 0;

                  sx = nsx;
                  sy = nsy;

                  if(vuorossa == 1) vuorossa = 2;
                  else if(vuorossa == 2) vuorossa = 1;
                  si = 1;
               }
            }
         }
      }
      
      //voittaja = TarkistaMatti(ruudut);
      //if(voittaja == 21 || voittaja == 22){ peli = false; }

      PiirraKuva(tausta, naytto, 0, 0);
      PiirraKuva(merkki, naytto, 400 sx*63, 142 sy*63);
      PiirraNappulat(ruudut, nappulat, naytto);

      SDL_Flip(naytto);
      SDL_Delay(10);
   }

   SDL_FreeSurface(tausta);
   SDL_FreeSurface(nappulat);

   SDL_Quit();

   return 0;

}

void PiirraKuva(SDL_Surface *kuva, SDL_Surface *naytto, int x, int y)
{

   if( kuva == NULL ){ fprintf(stderr, "EI KUVAA: %s", SDL_GetError()); }

   SDL_SetColorKey(kuva, SDL_SRCCOLORKEY, SDL_MapRGB(kuva->format,128,0,128));

// mihin näytöllä
SDL_Rect alue;
alue.x = x;
alue.y = y;

// näytölle
SDL_BlitSurface(kuva, NULL, naytto, &alue); // koska toinen parametri on NULL, piirretään koko kuva
   
}

void PiirraKuvaAlue(SDL_Surface *kuva, SDL_Surface *naytto, int kuvax, int kuvay, int leveys, int korkeus, int nayttox, int nayttoy)
{
   SDL_SetColorKey(kuva, SDL_SRCCOLORKEY, SDL_MapRGB(kuva->format,128,0,128));

SDL_Rect kuvaalue; // alue, mikä kuvasta piirretään
kuvaalue.x = kuvax;
kuvaalue.y = kuvay;
kuvaalue.h = korkeus;
kuvaalue.w = leveys;

SDL_Rect nayttoalue; // alue näytöllä, jolle kuva piirretään
nayttoalue.x = nayttox;
nayttoalue.y = nayttoy;

SDL_BlitSurface(kuva, &kuvaalue, naytto, &nayttoalue);
}

int PiirraNappulat(int ruudut[8][8], SDL_Surface * kuva, SDL_Surface * naytto)
{

   int x = 0;
   int y = 0;

   while(x < 8)
   {
      while(y < 8)
      {
         if(ruudut[x][y] > 100 && ruudut[x][y] < 107)
         {
            PiirraKuvaAlue(kuva, naytto, (ruudut[x][y]-101)*44, 0, 44, 44, x*63 409, y*63 152);
         }
         else if(ruudut[x][y] > 200 && ruudut[x][y] < 207)
         {
            PiirraKuvaAlue(kuva, naytto, (ruudut[x][y]-201)*44 264, 0, 44, 44, x*63 409, y*63 152);
         }

         y ;
      }
      
      y = 0;
      x ;
   }

   return 0;

}
int TarkistaSiirto(int nappula, int sx, int sy, int nsx, int nsy, int ruudut[8][8], int vuoro)
{
   //PALAUTUS ARVOT
   // 0 - laiton siirto
   // 1 - normaali siirto
   // 2 - syönti

   while(nappula > 100){ nappula -= 100; }

   int dx, dy;

   dx = nsx-sx;
   dy = nsy-sy;

   //VAATII TARKASTUKSEN ET ONKO TOISIA UKKOJA TIELLÄ

   if(nappula == 1) //ratsu
   {
      int s=1;
      
      if(Oma(vuoro, ruudut[nsx][nsy]) == 1) s=2;
      
      if(dx == 2 && dy == 1) return s;
      else if(dx == 1 && dy == 2) return s;
      else if(dx == -2 && dy == -1) return s;
      else if(dx == -1 && dy == -2) return s;
      else if(dx == -2 && dy == 1) return s;
      else if(dx == -1 && dy == 2) return s;
      else if(dx == 2 && dy == -1) return s;
      else if(dx == 1 && dy == -2) return s;
   }
   else if(nappula == 2) //sotilas
   {
      if(vuoro == 1)
      {
         if(dy == 0 && dx == -1 ) return 1;
         else if(sx == 6 && dy == 0 && dx == -2 && Oma(vuoro, ruudut[nsx 1][nsy]) == 2) return 1;
         else if(dx == -1 && dy == 1 && ruudut[nsx][nsy]>200 && ruudut[nsx][nsy]200 && ruudut[nsx][nsy] 100 && ruudut[nsx][nsy] < 107) return 2;
         else if(dx == 1 && dy == -1 && ruudut[nsx][nsy] > 100 && ruudut[nsx][nsy] < 107) return 2;
      }
   }
   else if(nappula == 3) //kuningatar
   {
      if(dx == 0 || dy == 0 || dx == dy || dx == -1*dy)
      {
         int ax, ay;

         if( dx != 0 ) ax = dx/abs(dx);
         else ax = 0;

         if( dy != 0 ) ay = dy/abs(dx);
         else ay = 0;

         int fx = sx ax;
         int fy = sy ay;

         while(fx != nsx && fy != nsy)
         {
            if(ruudut[fx][fy] != 0){ return 0; }
         
            fx = ax;
            fy = ay;
         }


         if(Oma(vuoro, ruudut[nsx][nsy]) == 1) return 2;
         else return 1;
      }
   }
   else if(nappula == 4) //kunkku
   {
      if(dx > -2 && dx < 2 && dy > -2 && dy < 2)
      {
         if(Oma(vuoro, ruudut[nsx][nsy]) == 1) return 2;
         else return 1;
      }
   }
   else if(nappula == 5) //lähetti
   {
      if(dx == dy || dx == -1*dy)
      {
         int ax, ay;

         if( dx != 0 ) ax = dx/abs(dx);
         else ax = 0;

         if( dy != 0 ) ay = dy/abs(dx);
         else ay = 0;

         int fx = sx ax;
         int fy = sy ay;

         while(fx != nsx && fy != nsy)
         {
            if(ruudut[fx][fy] != 0){ return 0; }
         
            fx = ax;
            fy = ay;
         }


         if(Oma(vuoro, ruudut[nsx][nsy]) == 1) return 2;
         else return 1;
      }
   }
   else if(nappula == 6) //torni
   {
      if(dx == 0 || dy == 0)
      {
         int ax, ay;

         if( dx != 0 ) ax = dx/abs(dx);
         else ax = 0;

         if( dy != 0 ) ay = dy/abs(dx);
         else ay = 0;

         int fx = sx ax;
         int fy = sy ay;

         while(fx != nsx && fy != nsy)
         {
            if(ruudut[fx][fy] != 0){ return 0; }
         
            fx = ax;
            fy = ay;
         }

         if(Oma(vuoro, ruudut[nsx][nsy]) == 1) return 2;
         else return 1;
      }
   }

   return 0;

}

int Oma(int vuoro, int tar)
{
   // 0 - on oma
   // 1 - ei oma
   // 2 - tyhjä
   if(tar == 0) return 2;

   tar = tar-vuoro*100;

   if(tar> 0 && tar < 7) return 0;

   return 1;
}
int TarkistaMatti(int ruudut[8][8])
{
   fprintf(stdout, "tarkistetaan mattia...");
   //Palauttaa...
   // 0 - ei mattia
   // -1 - virhe
   //matti...
   // 11 - pelaajan 1 kunkku uhattu
   // 12 - pelaajan 2 kunkku uhattu
   //shakkimatti...
   // 21 - shakkimatti pelaaja 1 voitti
   // 22 - shakkimatti pelaaja 2 voitti

   int r=0; //palautus arvo

   //kunkun 1 sijainti
   int k1x;
   int k1y;
   
   //kunkun 2 sijainti
   int k2x;
   int k2y;

   //apulukuja
   int y=0;
   int x=0;
   int i=0;

   while(x < 8)//etitään kunkut
   {
      while(y < 8)
      {
         if(ruudut[x][y] == 104){ k1x = x; k1y = y; i ; }
         else if(ruudut[x][y] == 204){ k2x = x; k2y = y; i ; }

         y ;
      }
      x ;
      y=0;

      if(i == 2) break;
   }

   x=0;
   y=0;
   i=0;

   while(x < 8)// etitään jos kunkut uhattuna
   {
      while(y < 8)
      {
         if(Oma(1, ruudut[x][y] == 0))
         {
            if(TarkistaSiirto(ruudut[x][y], x, y, k2x, k2y, ruudut, 1) == 2)
            {
               r=12;
               x = 10;
            }
         }
         else if(Oma(2, ruudut[x][y] == 0))
         {
            if(TarkistaSiirto(ruudut[x][y], x, y, k2x, k2y, ruudut, 2) == 2)
            {
               r=11;
               x = 10;
            }
         }

         y ;
      }
      x ;
      y=0;
   }

   x=0;
   y=0;

   fprintf(stdout, "puoliväli matis: %i", r);

   if( r == 0) return r;
   else if( r == 11) // kunkku 1 on uhattuna
   { //tarkistetaan onko shakkimatti
      while(x < 8)
      {
         while(y < 8)
         {
            if(Oma(2, ruudut[x][y]) == 0)
            {
               int cx=-1;
               int cy=-1;

               while(cx < 2)
               {
                  while(cy < 2)
                  {
                     if(TarkistaSiirto(ruudut[x][y], x, y, k1x cx, k1y cx, ruudut, 2) != 0)
                     {
                        return 22; //pelaaja 2 voitti
                     }
                     cy ;
                  }
                  cy = 0;
                  cx ;
               }
            }
            y ;
         }
         x ;
         y=0;
      }
   }
   else if( r == 11) // kunkku 2 on uhattuna
   { //tarkistetaan onko shakkimatti
      while(x < 8)
      {
         while(y < 8)
         {
            if(Oma(1, ruudut[x][y]) == 0)
            {
               int cx=-1;
               int cy=-1;

               while(cx < 2)
               {
                  while(cy < 2)
                  {
                     if(TarkistaSiirto(ruudut[x][y], x, y, k1x cx, k1y cx, ruudut, 1) != 0)
                     {
                        return 21; //pelaaj 1 voitti
                     }
                     cy ;
                  }
                  cy = 0;
                  cx ;
               }
            }
            y ;
         }
         x ;
         y=0;
      }
   }
   else return -1; //virhe

   return -1; //virhe

}
3289
Äänestä

Muut lukivat myös

Vastaukset 3

Vanhimmat

Etsi debuggerilla missä kohtaa (rivi) kaatuu. (Jos ei oo debuggeria niin pistä printf:iä koodin sekaan sopivasti jotta tiedät kaatumiskohdan.)

Äänestä

else if( r == 11) // kunkku 1 on uhattuna
else if( r == 11) // kunkku 2 on uhattuna

Alemmassa rivissä pitää olla r == 12 testinä. Käytä vakioita.

#define KNG_YKSI_UHATTU 12
#define KNG_KAKSI_UHATTU 12

Ei tarvi olla noin pitkä, mutta noista ei erehdy ja ne parantavat luettavuutta. Varo taikalukuja. Määritä kaikki vakioiksi. (Myös const int käy.)

Kaatuminen tullee tästä:

if(TarkistaSiirto(ruudut[x][y], x, y, k1x cx, k1y cx, ruudut, 2) != 0)

k1x cx voi mennä taulukon ohi. Jos k1x on seitsemän ja cx on yksi, niin summa 8 on liian iso, esimerkiksi. Moinen saattaa aiheuttaa kaatumatautia tai huomaamattomampia virheitä. Näin äkkiä katsottuna vaikuttaa tältä ainakin. (Kerro enemmän virheestä kun kysyt ensin kerran.)

Äänestä
  • se oli TarkistaSiirto funktiossa joka tuli kun yrititeen siirtää jotain suora ylös päin.

    korjasin sen. Jos joku viittis siel ihmetellä tuossa samaisessa funktiossa tuota viritelmää joka tarkistaa että onko ukkoja tielläm koska se ei tunnu pelaavaan vaan ukot hypii toistens yli surutta

    Tässä viel tämä funktion korjattu versio

    int TarkistaSiirto(int nappula, int sx, int sy, int nsx, int nsy, int ruudut[8][8], int vuoro)
    {
       //PALAUTUS ARVOT
       // 0 - laiton siirto
       // 1 - normaali siirto
       // 2 - syönti

       while(nappula > 100){ nappula -= 100; }

       if(nsx < 0)nsx=0;
       else if(nsx > 7) nsx=7;

       if(nsy < 0)nsy=0;
       else if(nsy > 7) nsy=7;


       int dx, dy;

       dx = nsx-sx;
       dy = nsy-sy;

       if(nappula == 1) //ratsu
       {
          int s=1;
          
          if(Oma(vuoro, ruudut[nsx][nsy]) == 1) s=2;
          
          if(dx == 2 && dy == 1) return s;
          else if(dx == 1 && dy == 2) return s;
          else if(dx == -2 && dy == -1) return s;
          else if(dx == -1 && dy == -2) return s;
          else if(dx == -2 && dy == 1) return s;
          else if(dx == -1 && dy == 2) return s;
          else if(dx == 2 && dy == -1) return s;
          else if(dx == 1 && dy == -2) return s;
       }
       else if(nappula == 2) //sotilas
       {
          if(vuoro == 1)
          {
             if(dy == 0 && dx == -1 ) return 1;
             else if(sx == 6 && dy == 0 && dx == -2 && Oma(vuoro, ruudut[nsx 1][nsy]) == 2) return 1;
             else if(dx == -1 && dy == 1 && ruudut[nsx][nsy]>200 && ruudut[nsx][nsy]200 && ruudut[nsx][nsy] 100 && ruudut[nsx][nsy] < 107) return 2;
             else if(dx == 1 && dy == -1 && ruudut[nsx][nsy] > 100 && ruudut[nsx][nsy] < 107) return 2;
          }
       }
       else if(nappula == 3) //kuningatar
       {
          if(dx == 0 || dy == 0 || dx == dy || dx == -1*dy)
          {
             int ax, ay;

             if( dx != 0 ) ax = dx/abs(dx);
             else ax = 0;

             if( dy != 0 ) ay = dy/abs(dy);
             else ay = 0;

             int fx = sx ax;
             int fy = sy ay;

             while(fx != nsx && fy != nsy)
             {
                if(ruudut[fx][fy] != 0){ return 0; }
             
                fx = ax;
                fy = ay;
             }


             if(Oma(vuoro, ruudut[nsx][nsy]) == 1) return 2;
             else return 1;
          }
       }
       else if(nappula == 4) //kunkku
       {
          if(dx > -2 && dx < 2 && dy > -2 && dy < 2)
          {
             if(Oma(vuoro, ruudut[nsx][nsy]) == 1) return 2;
             else return 1;
          }
       }
       else if(nappula == 5) //lähetti
       {
          if(dx == dy || dx == -1*dy)
          {
             int ax, ay;

             if( dx != 0 ) ax = dx/abs(dx);
             else ax = 0;

             if( dy != 0 ) ay = dy/abs(dy);
             else ay = 0;

             int fx = sx ax;
             int fy = sy ay;

             while(fx != nsx && fy != nsy)
             {
                if(ruudut[fx][fy] != 0){ return 0; }
             
                fx = ax;
                fy = ay;
             }


             if(Oma(vuoro, ruudut[nsx][nsy]) == 1) return 2;
             else return 1;
          }
       }
       else if(nappula == 6) //torni
       {
          if(dx == 0 || dy == 0)
          {
             int ax, ay;

             if( dx != 0 )ax = dx/abs(dx);
             else ax = 0;

             if( dy != 0 ) ay = dy/abs(dy);
             else ay = 0;

             int fx = sx ax;
             int fy = sy ay;

             while(fx != nsx && fy != nsy)
             {
                if(ruudut[fx][fy] != 0){ return 0; }
             
                fx = ax;
                fy = ay;
             }

             if(Oma(vuoro, ruudut[nsx][nsy]) == 1) return 2;
             else return 1;
          }
       }

       return 0;

    }

    Äänestä

Kommentoi aloitusta


koodari kirjoitti:

taas täällä vaivaamassa teitä.

Miks homma kaatuu kun TarkistaMatti funkiossa?


#include
#include
#include

#define MUSTA 567
#define VALKOINEN 83

//Tarkista matti kaatuu.
//tarkista siirt bugittaa kans

int syoty[2][16]={0};

void PiirraKuva(SDL_Surface *kuva, SDL_Surface *naytto, int x, int y);
void PiirraKuvaAlue(SDL_Surface *kuva, SDL_Surface *naytto, int kuvax, int kuvay, int leveys, int korkeus, int nayttox, int nayttoy);
int PiirraNappulat(int ruudut[8][8], SDL_Surface * kuva, SDL_Surface * naytto);
int TarkistaSiirto(int nappula, int sx, int sy, int nsx, int nsy, int ruudut[8][8], int vuoro);
int Oma(int vuoro, int tar);
int TarkistaMatti(int ruudut[8][8]);

int main(int argc, char *argv[])
{
   SDL_Init(SDL_INIT_VIDEO);

SDL_WM_SetCaption("SudokuGame", NULL);

   SDL_Surface * naytto;
   SDL_Surface * nappulat;
   SDL_Surface * tausta;
   SDL_Surface * merkki;

   naytto = SDL_SetVideoMode(1024, 768, 32, SDL_HWSURFACE|SDL_FULLSCREEN|SDL_DOUBLEBUF);
   tausta = SDL_LoadBMP("Art\\Ctausta.bmp");
   nappulat = SDL_LoadBMP("Art\\Cnappulat.bmp");
   merkki = SDL_LoadBMP("Art\\Cmerkki.bmp");

   int hiiri=0,x=0,y=0;
   Uint8* nappi;
   SDL_Event tapahtuma;

   int sx=0, sy=0;
   int nsx=0, nsy=0;

   int vuorossa=1, voittaja=0;
   bool peli = true;

   int ruudut[8][8]={
      {206,201,205,204,203,205,201,206},
      {202,202,202,202,202,202,202,202},
      { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
      { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
      { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
      { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
      {102,102,102,102,102,102,102,102},
      {106,101,105,103,104,105,101,106}
   };

   //valkoiset 101-106
   //mustat 201-206

   //hevonen.......1
   //sotilas.......2
   //kuningatar....3
   //kuningas......4
   //lähetti.......5
   //torni.........6

   //62x62px
   //44x44px
   //9px

   int si=1;

   while(peli == true)
   {
   
      SDL_PollEvent(&tapahtuma);
      if ( tapahtuma.type == SDL_QUIT ){ break; }
      if ( tapahtuma.type == SDL_KEYDOWN )
      {
         if ( tapahtuma.key.keysym.sym == SDLK_ESCAPE ){ break; }
      }

      hiiri = SDL_GetMouseState(&x,&y);

      nappi = SDL_GetKeyState(NULL);

      //400,143
      //900,640
      
      if(hiiri == 1)
      {
         if(x > 400 && x < 903 && y > 143 && y < 643)
         {
            nsx = (x-400)/63;
            nsy = (y-143)/63;

            if(ruudut[nsx][nsy] > vuorossa*100 && ruudut[nsx][nsy] < vuorossa*100 7)
            {
               sx = nsx;
               sy = nsy;
               si = 2;
            }
            else if(Oma(vuorossa, ruudut[nsx][nsy])!= 0 && ruudut[sx][sy] > vuorossa*100 && ruudut[sx][sy] < vuorossa*100 7 && si == 2)
            {
               //MATTI PÄÄLLÄ JO voittaja on 11 tai 12!! TARKISTUS TARVITAAN
               fprintf(stdout, "sx %i, sy %i, nsx %i, nsy %i, si %i, vuoro %i\n", sx, sy, nsx, nsy, si, vuorossa);
               if(TarkistaSiirto(ruudut[sx][sy], sx, sy, nsx, nsy, ruudut, vuorossa) != 0)
               {
                  ruudut[nsx][nsy] = ruudut[sx][sy];
                  ruudut[sx][sy] = 0;

                  sx = nsx;
                  sy = nsy;

                  if(vuorossa == 1) vuorossa = 2;
                  else if(vuorossa == 2) vuorossa = 1;
                  si = 1;
               }
            }
         }
      }
      
      //voittaja = TarkistaMatti(ruudut);
      //if(voittaja == 21 || voittaja == 22){ peli = false; }

      PiirraKuva(tausta, naytto, 0, 0);
      PiirraKuva(merkki, naytto, 400 sx*63, 142 sy*63);
      PiirraNappulat(ruudut, nappulat, naytto);

      SDL_Flip(naytto);
      SDL_Delay(10);
   }

   SDL_FreeSurface(tausta);
   SDL_FreeSurface(nappulat);

   SDL_Quit();

   return 0;

}

void PiirraKuva(SDL_Surface *kuva, SDL_Surface *naytto, int x, int y)
{

   if( kuva == NULL ){ fprintf(stderr, "EI KUVAA: %s", SDL_GetError()); }

   SDL_SetColorKey(kuva, SDL_SRCCOLORKEY, SDL_MapRGB(kuva->format,128,0,128));

// mihin näytöllä
SDL_Rect alue;
alue.x = x;
alue.y = y;

// näytölle
SDL_BlitSurface(kuva, NULL, naytto, &alue); // koska toinen parametri on NULL, piirretään koko kuva
   
}

void PiirraKuvaAlue(SDL_Surface *kuva, SDL_Surface *naytto, int kuvax, int kuvay, int leveys, int korkeus, int nayttox, int nayttoy)
{
   SDL_SetColorKey(kuva, SDL_SRCCOLORKEY, SDL_MapRGB(kuva->format,128,0,128));

SDL_Rect kuvaalue; // alue, mikä kuvasta piirretään
kuvaalue.x = kuvax;
kuvaalue.y = kuvay;
kuvaalue.h = korkeus;
kuvaalue.w = leveys;

SDL_Rect nayttoalue; // alue näytöllä, jolle kuva piirretään
nayttoalue.x = nayttox;
nayttoalue.y = nayttoy;

SDL_BlitSurface(kuva, &kuvaalue, naytto, &nayttoalue);
}

int PiirraNappulat(int ruudut[8][8], SDL_Surface * kuva, SDL_Surface * naytto)
{

   int x = 0;
   int y = 0;

   while(x < 8)
   {
      while(y < 8)
      {
         if(ruudut[x][y] > 100 && ruudut[x][y] < 107)
         {
            PiirraKuvaAlue(kuva, naytto, (ruudut[x][y]-101)*44, 0, 44, 44, x*63 409, y*63 152);
         }
         else if(ruudut[x][y] > 200 && ruudut[x][y] < 207)
         {
            PiirraKuvaAlue(kuva, naytto, (ruudut[x][y]-201)*44 264, 0, 44, 44, x*63 409, y*63 152);
         }

         y ;
      }
      
      y = 0;
      x ;
   }

   return 0;

}
int TarkistaSiirto(int nappula, int sx, int sy, int nsx, int nsy, int ruudut[8][8], int vuoro)
{
   //PALAUTUS ARVOT
   // 0 - laiton siirto
   // 1 - normaali siirto
   // 2 - syönti

   while(nappula > 100){ nappula -= 100; }

   int dx, dy;

   dx = nsx-sx;
   dy = nsy-sy;

   //VAATII TARKASTUKSEN ET ONKO TOISIA UKKOJA TIELLÄ

   if(nappula == 1) //ratsu
   {
      int s=1;
      
      if(Oma(vuoro, ruudut[nsx][nsy]) == 1) s=2;
      
      if(dx == 2 && dy == 1) return s;
      else if(dx == 1 && dy == 2) return s;
      else if(dx == -2 && dy == -1) return s;
      else if(dx == -1 && dy == -2) return s;
      else if(dx == -2 && dy == 1) return s;
      else if(dx == -1 && dy == 2) return s;
      else if(dx == 2 && dy == -1) return s;
      else if(dx == 1 && dy == -2) return s;
   }
   else if(nappula == 2) //sotilas
   {
      if(vuoro == 1)
      {
         if(dy == 0 && dx == -1 ) return 1;
         else if(sx == 6 && dy == 0 && dx == -2 && Oma(vuoro, ruudut[nsx 1][nsy]) == 2) return 1;
         else if(dx == -1 && dy == 1 && ruudut[nsx][nsy]>200 && ruudut[nsx][nsy]200 && ruudut[nsx][nsy] 100 && ruudut[nsx][nsy] < 107) return 2;
         else if(dx == 1 && dy == -1 && ruudut[nsx][nsy] > 100 && ruudut[nsx][nsy] < 107) return 2;
      }
   }
   else if(nappula == 3) //kuningatar
   {
      if(dx == 0 || dy == 0 || dx == dy || dx == -1*dy)
      {
         int ax, ay;

         if( dx != 0 ) ax = dx/abs(dx);
         else ax = 0;

         if( dy != 0 ) ay = dy/abs(dx);
         else ay = 0;

         int fx = sx ax;
         int fy = sy ay;

         while(fx != nsx && fy != nsy)
         {
            if(ruudut[fx][fy] != 0){ return 0; }
         
            fx = ax;
            fy = ay;
         }


         if(Oma(vuoro, ruudut[nsx][nsy]) == 1) return 2;
         else return 1;
      }
   }
   else if(nappula == 4) //kunkku
   {
      if(dx > -2 && dx < 2 && dy > -2 && dy < 2)
      {
         if(Oma(vuoro, ruudut[nsx][nsy]) == 1) return 2;
         else return 1;
      }
   }
   else if(nappula == 5) //lähetti
   {
      if(dx == dy || dx == -1*dy)
      {
         int ax, ay;

         if( dx != 0 ) ax = dx/abs(dx);
         else ax = 0;

         if( dy != 0 ) ay = dy/abs(dx);
         else ay = 0;

         int fx = sx ax;
         int fy = sy ay;

         while(fx != nsx && fy != nsy)
         {
            if(ruudut[fx][fy] != 0){ return 0; }
         
            fx = ax;
            fy = ay;
         }


         if(Oma(vuoro, ruudut[nsx][nsy]) == 1) return 2;
         else return 1;
      }
   }
   else if(nappula == 6) //torni
   {
      if(dx == 0 || dy == 0)
      {
         int ax, ay;

         if( dx != 0 ) ax = dx/abs(dx);
         else ax = 0;

         if( dy != 0 ) ay = dy/abs(dx);
         else ay = 0;

         int fx = sx ax;
         int fy = sy ay;

         while(fx != nsx && fy != nsy)
         {
            if(ruudut[fx][fy] != 0){ return 0; }
         
            fx = ax;
            fy = ay;
         }

         if(Oma(vuoro, ruudut[nsx][nsy]) == 1) return 2;
         else return 1;
      }
   }

   return 0;

}

int Oma(int vuoro, int tar)
{
   // 0 - on oma
   // 1 - ei oma
   // 2 - tyhjä
   if(tar == 0) return 2;

   tar = tar-vuoro*100;

   if(tar> 0 && tar < 7) return 0;

   return 1;
}
int TarkistaMatti(int ruudut[8][8])
{
   fprintf(stdout, "tarkistetaan mattia...");
   //Palauttaa...
   // 0 - ei mattia
   // -1 - virhe
   //matti...
   // 11 - pelaajan 1 kunkku uhattu
   // 12 - pelaajan 2 kunkku uhattu
   //shakkimatti...
   // 21 - shakkimatti pelaaja 1 voitti
   // 22 - shakkimatti pelaaja 2 voitti

   int r=0; //palautus arvo

   //kunkun 1 sijainti
   int k1x;
   int k1y;
   
   //kunkun 2 sijainti
   int k2x;
   int k2y;

   //apulukuja
   int y=0;
   int x=0;
   int i=0;

   while(x < 8)//etitään kunkut
   {
      while(y < 8)
      {
         if(ruudut[x][y] == 104){ k1x = x; k1y = y; i ; }
         else if(ruudut[x][y] == 204){ k2x = x; k2y = y; i ; }

         y ;
      }
      x ;
      y=0;

      if(i == 2) break;
   }

   x=0;
   y=0;
   i=0;

   while(x < 8)// etitään jos kunkut uhattuna
   {
      while(y < 8)
      {
         if(Oma(1, ruudut[x][y] == 0))
         {
            if(TarkistaSiirto(ruudut[x][y], x, y, k2x, k2y, ruudut, 1) == 2)
            {
               r=12;
               x = 10;
            }
         }
         else if(Oma(2, ruudut[x][y] == 0))
         {
            if(TarkistaSiirto(ruudut[x][y], x, y, k2x, k2y, ruudut, 2) == 2)
            {
               r=11;
               x = 10;
            }
         }

         y ;
      }
      x ;
      y=0;
   }

   x=0;
   y=0;

   fprintf(stdout, "puoliväli matis: %i", r);

   if( r == 0) return r;
   else if( r == 11) // kunkku 1 on uhattuna
   { //tarkistetaan onko shakkimatti
      while(x < 8)
      {
         while(y < 8)
         {
            if(Oma(2, ruudut[x][y]) == 0)
            {
               int cx=-1;
               int cy=-1;

               while(cx < 2)
               {
                  while(cy < 2)
                  {
                     if(TarkistaSiirto(ruudut[x][y], x, y, k1x cx, k1y cx, ruudut, 2) != 0)
                     {
                        return 22; //pelaaja 2 voitti
                     }
                     cy ;
                  }
                  cy = 0;
                  cx ;
               }
            }
            y ;
         }
         x ;
         y=0;
      }
   }
   else if( r == 11) // kunkku 2 on uhattuna
   { //tarkistetaan onko shakkimatti
      while(x < 8)
      {
         while(y < 8)
         {
            if(Oma(1, ruudut[x][y]) == 0)
            {
               int cx=-1;
               int cy=-1;

               while(cx < 2)
               {
                  while(cy < 2)
                  {
                     if(TarkistaSiirto(ruudut[x][y], x, y, k1x cx, k1y cx, ruudut, 1) != 0)
                     {
                        return 21; //pelaaj 1 voitti
                     }
                     cy ;
                  }
                  cy = 0;
                  cx ;
               }
            }
            y ;
         }
         x ;
         y=0;
      }
   }
   else return -1; //virhe

   return -1; //virhe

}

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu