Warcaby dla 2 osób

0

Witam,
Muszę napisać warcaby w języku C. Napisałem już sporą część i zatrzymałem się w jednym momencie. Chodzi o damki...
Kompletnie nie wiem jak to ugryźć, jak napisać warunki na damki... Program opiera się na tablicy tekstowej.
Załączam kod:

#include<stdio.h>
int main()
{
    int i,j,m,n,k,w;
    int g=1;    /* zmienna gracza*/
    char ruch;
    char plansza[8][8]={
           {' ','O',' ','O',' ','O',' ','O'},
           {'O',' ','O',' ','O',' ','O',' '},
           {' ','O',' ','O',' ','O',' ','O'},
           {' ',' ',' ',' ',' ',' ',' ',' '},
           {' ',' ',' ',' ',' ',' ',' ',' '},
           {'X',' ','X',' ','X',' ','X',' '},
           {' ','X',' ','X',' ','X',' ','X'},
           {'X',' ','X',' ','X',' ','X',' '}
           };
        
    printf("\tWARCABY DLA 2 OSOB.\n");
    printf("Jestes graczem numer %d\n",g);
    printf("Twoje pionki to X. Pionki gracza 2 to O\n");
       
    printf("\n\t  12345678 ");
    printf("\n	 ==========\n\t");
    for(i=0;i<8;i++)
        {
    	printf("%d%c",i+1,124);                
        for(j=0;j<8;j++) 
          {
        	printf("%c",plansza[i][j]);
          }
	printf("%c ",124);
	printf("\n\t");
        }
    printf(" ==========\n");
    while(1)                      /* główna pętla wykonująca program */
    {         /*-------------------------------------------------------------------- gracz 1 */
    while(g==1)
    { 
               k=7; w=0;
               if(plansza[k][w]=='O' ) 
               plansza[k][w]='G';
               if(plansza[k][w|+2]=='O' )                                     /* zamiana pionka O na damkę G*/
               plansza[k][w+2]='G';
               if(plansza[k][w+4]=='O' ) 
               plansza[k][w+4]='G';
               if(plansza[k][w+6]=='O')
               plansza[k][w+6]='G';
               
    printf("Ruch gracza 1\n"); 
    g=g+1;
    printf("Wprowadz wspolrzedne pionka (np. 1 1, 2 7 \nnajpierw wspolrzedna pozioma, pozniej pionowa) \ni w ktora strone przesunac pionek (l-lewo, p-prawo):\n");
    fflush(stdin);
    scanf("%d%d",&n, &m);
    n=n-1;
    m=m-1;
    getchar();
    ruch=getchar();
    switch(ruch)
              {
                  case 'l':
                          if(n>0 && m>0 && n<8 && m<8) {
                                   if(plansza[m][n]!='X') {             /* spr czy to twój pionek*/
                                             g=g-1;
                                             printf("Nie twoj pionek!\n");
                                             break; }
                                   else {
                                        plansza[m][n]=' '; 
                                              if(plansza[m-2][n-2]==' ' && plansza[m-1][n-1]=='O') {     /* bicie w lewo*/
                                                    plansza[m-1][n-1]=' ';
                                                    plansza[m-2][n-2]='X'; }
                                              else {
                                              if(plansza[--m][--n]!=' ') {   /*sprawdza czy docelowe miejsce jest wolne*/
                                                     g=g-1;
                                                     printf("Pole zajete\n");
                                                     plansza[++m][++n]='X';
                                                     break; }
                                               else plansza[m][n]='X'; }
                                                         }
                                              }
                          else {
                          g=g-1;
                          printf("Zly ruch"); }
                          
                           printf("\n\t  12345678 ");
                           printf("\n	 ==========\n");
                           printf("\t");
                           for(i=0;i<8;i++)
                           {
                            	printf("%d%c",i+1,124);                
                                for(j=0;j<8;j++) 
                                 {
                                	printf("%c",plansza[i][j]);
                                  }
	                       printf("%c ",124);
	                       printf("\n\t");
                          }
                          printf(" ==========\n");
                          break;
                     case 'p':
                          if(n>-1 && m>-1 && n<7 && m<8) {
                                         if(plansza[m][n]!='X') {
                                              g=g-1;
                                              printf("Nie twoj pionek!\n");
                                              break; }
                                         else {
                                              plansza[m][n]=' ';
                                              if(plansza[m-2][n+2]==' ' && plansza[m-1][n+1]=='O') {
                                              plansza[m-1][n+1]=' ';              /*bicie w prawo*/
                                              plansza[m-2][n+2]='X'; }
                                              else {
                                              if(plansza[--m][++n]!=' ') {
                                                 g=g-1;
                                                 printf("Pole zajete\n");
                                                 plansza[++m][--n]='X';
                                                 break; }
                                              else plansza[m][n]='X'; }
                                                        }
                                                   }
                          else {
                          g=g-1;
                          printf("Zly ruch"); }
                          
                           printf("\n\t  12345678 ");
                           printf("\n	 ==========\n");
                           printf("\t");
                           for(i=0;i<8;i++)
                           {
                            	printf("%d%c",i+1,124);                
                                for(j=0;j<8;j++) 
                                {
                                	printf("%c",plansza[i][j]);
                                }
                            	printf("%c ",124);
                            	printf("\n\t");
                          }
                          printf(" ==========\n");
                          break;
                     default: 
                          g=g-1;
                          printf("Wpisz poprawne polecenie\n");
                          break;            
              }
    }
/*-------------------------------------------------------------------- gracz 2 */    
    while(g==2)
    {
               k=0; w=1;
                if(plansza[k][w]=='X')
                plansza[k][w]='Z';                                           /* zamiana pionka X na damkę Z*/
                if(plansza[k][w+2]=='X')
                plansza[k][w+2]='Z';
                if(plansza[k][w+4]=='X')
                plansza[k][w+4]='Z';
                if(plansza[k][w+6]=='X')
                plansza[k][w+6]='Z';
                        
    printf("Ruch gracza 2\n"); 
    g=g-1;
    printf("Wprowadz wspolrzedne pionka (np. 1 1, 2 7 \nnajpierw wspolrzedna pozioma, pozniej pionowa) \ni w ktora strone przesunac pionek (l-lewo, p-prawo):\n");
    fflush(stdin);
    scanf("%d%d",&n, &m);
    n=n-1;
    m=m-1;
    getchar();
    ruch=getchar();
    switch(ruch)
              {
                     case 'l':
                          if(n>0 && m>-1 && n<8 && m<8) 
                          {
                                
                                       if(plansza[m][n]!='O') {
                                          g=g+1;
                                          printf("Nie twoj pionek!\n");
                                          break; }
                                       else {       
                                          plansza[m][n]=' ';
                                          if(plansza[m+2][n-2]==' ' && plansza[m+1][n-1]=='X') {
                                          plansza[m+1][n-1]=' ';             /*bicie w lewo*/
                                          plansza[m+2][n-2]='O'; }
                                          else {
                                          if(plansza[++m][--n]!=' ') {
                                             g=g+1;
                                             printf("Pole zajete\n");
                                             plansza[--m][++n]='O';
                                             break; } 
                                          else 
                                             plansza[m][n]='O'; }
                                             }      
                          }
                          else { 
                          g=g+1;
                          printf("Zly ruch"); }
                          
                           printf("\n\t  12345678 ");
                           printf("\n	 ==========\n");
                           printf("\t");
                           for(i=0;i<8;i++)
                           {
                            	printf("%d%c",i+1,124);                
                                for(j=0;j<8;j++) 
                                 {
                                	printf("%c",plansza[i][j]);
                                  }
	                       printf("%c ",124);
	                       printf("\n\t");
                          }
                          printf(" ==========\n");
                          break;
                     case 'p':
                          if(n>-1 && m>-1 && n<7 && m<8) 
                          {
                                      if(plansza[m][n]!='O') {
                                         g=g+1;
                                         printf("Nie twoj pionek!\n");
                                         break; }
                                      else {
                                         plansza[m][n]=' ';
                                         if(plansza[m+2][n+2]==' ' && plansza[m+1][n+1]=='X') {
                                         plansza[m+1][n+1]=' ';                 /*bicie w prawo*/
                                         plansza[m+2][n+2]='O';
                                         }
                                         else {
                                         if(plansza[++m][++n]!=' ') {
                                             g=g+1; 
                                             printf("Pole zajete\n");
                                             plansza[--m][--n]='O';
                                             break; }
                                        else plansza[m][n]='O';
                                            }
                                            }
                          }
                          else {
                          g=g+1;
                          printf("Zly ruch"); }
                          
                           printf("\n\t  12345678 ");
                           printf("\n	 ==========\n");
                           printf("\t");
                           for(i=0;i<8;i++)
                           {
                            	printf("%d%c",i+1,124);                
                                for(j=0;j<8;j++) 
                                {
                                	printf("%c",plansza[i][j]);
                                }
                            	printf("%c ",124);
                            	printf("\n\t");
                          }
                          printf(" ==========\n");
                          break;
                     default: 
                          g=g+1;
                          printf("Wpisz poprawne polecenie\n");
                          break;            
              }
          }
          
       }
       }   

Myślałem nad tym żeby pobierać współrzędne damki i współrzędne docelowe i przesuwać. Ale jak napisać warunek żeby program sprawdzał czy na "torze ruchu" damki nie ma pionków własnych, przeciwnika, czy pionki przeciwnika nie są przy sobie aby można było wykonać bicie 'na dwa' itd. ?
Proszę pomóżcie, bo siedzę nad tym 2 dni i nic mi nie wychodzi...

1

Użyj pętli. Możesz sobie zrobić dodatkowe tablice, np:

int x[8]={-1,-1,-1,0,0,1,1,1} 
int y[8]={-1,0,1,-1,1,-1,0,1}

każda para np. x[0] i y[0] odpowiada jednemu ruchowi. Zauważ, że takie długie skoki damy to złożenie wielu małych skoków. Musisz więc sprawdzić który to ruch z tych ośmiu w tablicy i w pętli wykonać go tyle razy, żeby dama dotarła na docelowe miejsce.

0

Ok, już się rozjaśniło. Tylko teraz nie wiem co zrobić żeby program poprosił o podanie współrzędnych docelowych jeśli użytkownik wskaże damkę, zamiast standardowego przesunięcia zwykłego pionka. Nie wiem gdzie wstawić warunek..

1

Wydaje mi się, że ten warunek powinieneś wstawić po tym jak użytkownik wybierze pionka. Jeśli wybrał zwykłego pionka, wykonuje zwykły ruch, a jeśli damkę prosi o podanie współrzędnych ruchu.

0

Zrobiłem już coś takiego. Dlaczego ta pętla sprawdzająca tor ruchu damki źle działa??
oto kod:

 
#include<stdio.h>
int main()
{
    int i,j,m,n,k,w,x,y,a=0,b=0;
    int g=1;    /* zmienna gracza*/
    char ruch;
    char plansza[8][8]={
           {' ','O',' ','O',' ','O',' ','O'},
           {'O',' ','O',' ','O',' ','O',' '},
           {' ','O',' ','O',' ','O',' ','O'},
           {' ',' ',' ',' ',' ',' ',' ',' '},
           {' ',' ',' ',' ',' ',' ',' ',' '},
           {'X',' ','X',' ','X',' ','X',' '},
           {' ','X',' ','X',' ','X',' ','X'},
           {'X',' ','X',' ','X',' ','X',' '}
           };
    int pozx[4]={-1,-1,1,1};
    int pozy[4]={-1,1,-1,1};
        
    printf("\tWARCABY DLA 2 OSOB.\n");
    printf("Jestes graczem numer %d\n",g);
    printf("Twoje pionki to X. Pionki gracza 2 to O\n");
       
    printf("\n\t  12345678 ");
    printf("\n	 ==========\n\t");
    for(i=0;i<8;i++)
        {
    	printf("%d%c",i+1,124);                
        for(j=0;j<8;j++) 
          {
        	printf("%c",plansza[i][j]);
          }
	printf("%c ",124);
	printf("\n\t");
        }
    printf(" ==========\n");
    while(1)                      /* główna pętla wykonująca program */
    {         /*-------------------------------------------------------------------- gracz 1 */
    while(g==1)
    {          
               k=7; w=0;
               if(plansza[k][w]=='O' ) 
               plansza[k][w]='G';
               if(plansza[k][w|+2]=='O' )                                     /* zamiana pionka O na damkę G*/
               plansza[k][w+2]='G';
               if(plansza[k][w+4]=='O' ) 
               plansza[k][w+4]='G';
               if(plansza[k][w+6]=='O')
               plansza[k][w+6]='G';
    printf("Ruch gracza 1\n"); 
    g=g+1;
    printf("Wprowadz wspolrzedne pionka (np. 1 1, 2 7 \nnajpierw wspolrzedna pozioma, pozniej pionowa) \ni w ktora strone przesunac pionek (l-lewo, p-prawo):\n");
    fflush(stdin);
    scanf("%d%d",&n, &m);
    n=n-1;
    m=m-1;
    if(plansza[m][n]=='Z') {
           printf("Wprowadz wspolrzedne docelowe damki:\n");
           fflush(stdin);
           scanf("%d%d",&y,&x); 
           x=x-1;
           y=y-1;
           if(plansza[x][y]!=' ') {
                  g=g-1; 
                   printf("Pole zajete\n");
                   break; }
           else {
                   if(x>m && y>n) 
                   {
                  for(a=m,b=n;a<=x,b<=y;++a,++b)
                   {  
                   if(plansza[x][y]==' ') 
                   {
                                 printf("Zly ruch\n");
                                 g=g-1;
                                 break; }  
                                 else 
                                 plansza[x][y]='Z';
                   }
                 }
                 if(x>m && y<n)
                 {
                        for(a=m,b=n;a<=x,b>=y;++a,--b)
                   {  
                        if(plansza[x][y]!=' ') {
                             printf("Zly ruch\n");
                             g=g-1;
                             break; }
                         else {
                             plansza[x][y]='Z';
                                 }  
                   }
                   }
                 if(x<m && y<n)
                 {
                        for(a=m,b=n;a>=x,b>=y;--a,--b)
                         {  
                         if(plansza[x][y]!=' ') {
                                 printf("Zly ruch\n");
                                 g=g-1;
                                 break; }
                                 else {
                                 plansza[x][y]='Z';
                                 }  
                         }
                 }
                 if(x<m && y>n)
                 {
                        for(a=m,b=n;a>=x,b<=y;--a,++b)
                   {  
                   if(plansza[x][y]!=' ') {
                                 printf("Zly ruch\n");
                                 g=g-1;
                                 break; }
                                 else {
                                 plansza[x][y]='Z';
                                 }  
                   }
                 }       
                } 
                } 
                   
    else {
    getchar();
    ruch=getchar();
    switch(ruch)
              {
                  case 'l':
                          if(n>0 && m>0 && n<8 && m<8) {
                                 if(plansza[m][n]=='X'){
                                        plansza[m][n]=' '; 
                                              if(plansza[m-2][n-2]==' ' && plansza[m-1][n-1]=='O') {     /* bicie w lewo*/
                                                    plansza[m-1][n-1]=' ';
                                                    plansza[m-2][n-2]='X'; }
                                              else {
                                              if(plansza[--m][--n]!=' ') {   /*sprawdza czy docelowe miejsce jest wolne*/
                                                     g=g-1;
                                                     printf("Pole zajete\n");
                                                     plansza[++m][++n]='X';
                                                     break; }
                                               else plansza[m][n]='X'; }
                                                         }
                                   else {            /* spr czy to twój pionek*/
                                             g=g-1;
                                             printf("Nie twoj pionek!\n");
                                             break; }
                                              }    
                          else {
                          g=g-1;
                          printf("Zly ruch"); }
                          
                           printf("\n\t  12345678 ");
                           printf("\n	 ==========\n");
                           printf("\t");
                           for(i=0;i<8;i++)
                           {
                            	printf("%d%c",i+1,124);                
                                for(j=0;j<8;j++) 
                                 {
                                	printf("%c",plansza[i][j]);
                                  }
	                       printf("%c ",124);
	                       printf("\n\t");
                          }
                          printf(" ==========\n");
                          break;
                     case 'p':
                          if(n>-1 && m>-1 && n<7 && m<8) {
                                  if(plansza[m][n]=='X') {
                                              plansza[m][n]=' ';
                                              if(plansza[m-2][n+2]==' ' && plansza[m-1][n+1]=='O') {
                                              plansza[m-1][n+1]=' ';              /*bicie w prawo*/
                                              plansza[m-2][n+2]='X'; }
                                              else {
                                              if(plansza[--m][++n]!=' ') {
                                                 g=g-1;
                                                 printf("Pole zajete\n");
                                                 plansza[++m][--n]='X';
                                                 break; }
                                              else plansza[m][n]='X'; }
                                                        }
                                         else {
                                              g=g-1;
                                              printf("Nie twoj pionek!\n");
                                              break; }
                                          }        
                          else {
                          g=g-1;
                          printf("Zly ruch"); }
                          
                           printf("\n\t  12345678 ");
                           printf("\n	 ==========\n");
                           printf("\t");
                           for(i=0;i<8;i++)
                           {
                            	printf("%d%c",i+1,124);                
                                for(j=0;j<8;j++) 
                                {
                                	printf("%c",plansza[i][j]);
                                }
                            	printf("%c ",124);
                            	printf("\n\t");
                          }
                          printf(" ==========\n");
                          break;
                     default: 
                          g=g-1;
                          printf("Wpisz poprawne polecenie\n");
                          break;            
              }
              }
    }
/*-------------------------------------------------------------------- gracz 2 */    
    while(g==2)
    {
               k=0; w=1;
                if(plansza[k][w]=='X')
                plansza[k][w]='Z';                                           /* zamiana pionka X na damkę Z*/
                if(plansza[k][w+2]=='X')
                plansza[k][w+2]='Z';
                if(plansza[k][w+4]=='X')
                plansza[k][w+4]='Z';
                if(plansza[k][w+6]=='X')
                plansza[k][w+6]='Z';
                        
    printf("Ruch gracza 2\n"); 
    g=g-1;
    printf("Wprowadz wspolrzedne pionka (np. 1 1, 2 7 \nnajpierw wspolrzedna pozioma, pozniej pionowa) \ni w ktora strone przesunac pionek (l-lewo, p-prawo):\n");
    fflush(stdin);
    scanf("%d%d",&n, &m);
    n=n-1;
    m=m-1;
    if(plansza[m][n]=='G') {
    printf("Wprowadz wspolrzedne docelowe damki:\n");
    scanf("%d%d",&x,&y); 
    x=x-1;
    y=y-1;
    if(plansza[x][y]!=' ')
    printf("Pole zajete\n");
    }
    else {
    getchar();
    ruch=getchar();
    switch(ruch)
              {
                     case 'l':
                          if(n>0 && m>-1 && n<8 && m<8) 
                          {
                                       if(plansza[m][n]=='O') {       
                                          plansza[m][n]=' ';
                                          if(plansza[m+2][n-2]==' ' && plansza[m+1][n-1]=='X') {
                                          plansza[m+1][n-1]=' ';             /*bicie w lewo*/
                                          plansza[m+2][n-2]='O'; }
                                          else {
                                          if(plansza[++m][--n]!=' ') {
                                             g=g+1;
                                             printf("Pole zajete\n");
                                             plansza[--m][++n]='O';
                                             break; } 
                                          else 
                                             plansza[m][n]='O'; }
                                             }     
                                       else {
                                          g=g+1;
                                          printf("Nie twoj pionek!\n");
                                          break; }
                          }
                          else { 
                          g=g+1;
                          printf("Zly ruch"); }
                          
                           printf("\n\t  12345678 ");
                           printf("\n	 ==========\n");
                           printf("\t");
                           for(i=0;i<8;i++)
                           {
                            	printf("%d%c",i+1,124);                
                                for(j=0;j<8;j++) 
                                 {
                                	printf("%c",plansza[i][j]);
                                  }
	                       printf("%c ",124);
	                       printf("\n\t");
                          }
                          printf(" ==========\n");
                          break;
                     case 'p':
                          if(n>-1 && m>-1 && n<7 && m<8) 
                          { 
                                  if(plansza[m][n]=='O') {
                                         plansza[m][n]=' ';
                                         if(plansza[m+2][n+2]==' ' && plansza[m+1][n+1]=='X') {
                                         plansza[m+1][n+1]=' ';                 /*bicie w prawo*/
                                         plansza[m+2][n+2]='O';
                                         }
                                         else {
                                         if(plansza[++m][++n]!=' ') {
                                             g=g+1; 
                                             printf("Pole zajete\n");
                                             plansza[--m][--n]='O';
                                             break; }
                                        else plansza[m][n]='O';}
                                            }
                                        else {
                                         g=g+1;
                                         printf("Nie twoj pionek!\n");
                                         break; }
                                    
                                           
                          }
                          else {
                          g=g+1;
                          printf("Zly ruch"); }
                          
                           printf("\n\t  12345678 ");
                           printf("\n	 ==========\n");
                           printf("\t");
                           for(i=0;i<8;i++)
                           {
                            	printf("%d%c",i+1,124);                
                                for(j=0;j<8;j++) 
                                {
                                	printf("%c",plansza[i][j]);
                                }
                            	printf("%c ",124);
                            	printf("\n\t");
                          }
                          printf(" ==========\n");
                          break;
                     default: 
                          g=g+1;
                          printf("Wpisz poprawne polecenie\n");
                          break;            
              }
              }
          }
          
       }
       }   

1 użytkowników online, w tym zalogowanych: 0, gości: 1