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
}
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
}
Vastaukset 3
Vanhimmat
Etsi debuggerilla missä kohtaa (rivi) kaatuu. (Jos ei oo debuggeria niin pistä printf:iä koodin sekaan sopivasti jotta tiedät kaatumiskohdan.)
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.)
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;
}