Question

I want to that this function after than player 1 puts position program chack where on the left is player's 1 pawn and all of opponent's paws between player's 1 two pawns turning on 'X', like in reversi games.

This is whole unfinished code:

#include<stdio.h>


#define SIZE 7

char board[SIZE][SIZE];
char letter;
int number;

void make_board(char tab[SIZE][SIZE]){
    int w,k;

for(w=0; w < SIZE; w++){

    for(k=0; k < SIZE; k++){
        tab[w][k] = '.';
    }
}

tab[0][0] = 'X';
tab[1][0] = '1';    
tab[2][0] = '2';
tab[3][0] = '3';
tab[4][0] = '4';
    tab[5][0] = '5';
    tab[6][0] = '6';    

tab[0][1] = 'A';    
tab[0][2] = 'B';
tab[0][3] = 'C';
tab[0][4] = 'D';
tab[0][5] = 'E';
tab[0][6] = 'F';

tab[4][4] = 'X';
tab[4][3] = 'O';
tab[3][4] = 'O';
tab[3][3] = 'X';

}

char draw_board(char tab[SIZE][SIZE]){
    int w, k;
    for(w=0; w < SIZE; w++){
        for(k=0; k < SIZE; k++){
            printf("%2c", tab[w][k]);
        }
        printf("\n");
    }   
}

int translate(char letter){
int letter_to_number;
switch(letter){
    case 'A':
    case 'a':
        letter_to_number = 1;
        break;
        
    case 'B':
    case 'b':
        letter_to_number = 2;
        break;
        
    case 'C':
    case 'c':
        letter_to_number = 3;
        break;
        
    case 'D':
    case 'd':
        letter_to_number = 4;   
        break;      
    case 'E':
    case 'e':
        letter_to_number = 5;   
        break;
}
return letter_to_number;
}
int finished(char tab[SIZE][SIZE]){ // looking '.' in array  
  int i,j;
   for(i=1;i<=SIZE;i++){
      for(j=1;j<=SIZE;j++){
        if(tab[i][j]=='.'){
          return 1; 
      }else{
          return 0; // if don't find any '.' game is finish
      }
     }    
   }
}

void hit(char tab[SIZE][SIZE], int player ){
int i,j;

int *poz1, *poz2;   
printf("Call out a letter and a number of a row and column on the grid:\n");
     scanf(" %c %d", &letter, &number);
     i=translate(letter);
     poz1=&tab[number][i];
     if(tab[number][i]=='.'){
        if(player==1){
          *poz1='X';   
           for(poz1-1;*poz1=='X';poz1--){
              poz2=&poz1;}
           poz1=&tab[number][i];
           for(poz2;poz2<=poz1;poz2++){
              *poz2='X';}
        }else{
          *poz1='O';   
           for(poz1-1;*poz1=='O';poz1--){
              poz2=&poz1;}
           poz1=&tab[number][i];
           for(poz2;poz2<=poz1;poz2++){
              poz2='O';}
        }       
     }else{
       printf("On this place already is pawn\n");
     }
     draw_board(board);
     getchar();
}

int main(){
int i,j,k, pg1=0, pg2=0, player=1;
make_board(board);
draw_board(board);

 do{
    if(player==1){
     printf("Player 1\n");
     hit(board, gracz);
     k=finished(board);
     gracz=2;
    }else{
     printf("Player 2\n");
     hit(board, gracz);
     k=finished(board);
     player=1;
   }
 }while(k==1);

   for(i=1;i<=SIZE;i++){
      for(j=1;j<=SIZE;j++){
         if(board[i][j]=='X'){
           pg1++;
         }else{
           pg2++;
         }
     }
  }

  if(pg1>pg2){
    printf("Player 1 wins");
 }else{
   printf("Player 2 wins");
}
return 0;
}
Was it helpful?

Solution

Bit buggy code:

 poz1=&tab[number][i];
 if(tab[number][i]=='.'){
    if(player==1){
      *poz1='X';   
       for(poz1-1;*poz1=='X';poz1--){
          poz2=&poz1;}
       poz1=&tab[number][i];
       for(poz2;poz2<=poz1;poz2++){
          *poz2='X';}

How can you asgn &pos1 to pos2. For this you need pointer to a pointer, i.e, pos 2 should be declared as **pos2.

Also, what do you want to achieve by looping over poz1 (set 'X' earlier)?

Anyhow, some cleanup to your code:

 if(tab[number][i]=='.'){
    if(player==1){    //considering player 1 is 'X'  
       // Loop to the left till you find opponent's piece or come to edge.
       for(j=i-1;tab[number][j]=='O' && j!=0 ;j--)
           ;
       // Validation check
       if(i-j <=1 || tab[number][j] != 'X');
       //Invalid move
          return 1; 
       else
           // convert all the opponents pieces between two of yours piece
           for(k=i;k>j;k--)
               tab[number][k] = 'X';

The above part of code is informative only..this will check if the move is valid for left side..and if valid convert the opponents pieces.. you need to understand this and put similar logic for "Right", "Diagonal" etc to complete the reversi game.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top