bishop’s move on chess

Asked

Viewed 64 times

1

I set up this code but as we know the bishop moves on the diagonals, but in my code he is moving straight... the "x" represents the houses that the bishop can pass. Can you tell me how to put the house on the diagonals?

#include <stdio.h>

int main(){

int linha, coluna, l, c;

printf("Movimento de um bispo no xadrez\n");;
printf("Digite a linha que o bispo se encontra: ");
scanf("%d", &linha);
printf("Digite a coluna que o bispo se encontra: ");
scanf("%d", &coluna);

printf("\nMovimentos possiveis:\n\n");
printf("      1  2  3  4  5  6  7  8  \n");
printf("   -------------------------\n");

l = 1;
while(l <= 8){
    printf("%3d |", l);
    l++;
    
    c = 1;
    while(c <= 8){
        if(l == linha && c == coluna){
            printf(" o ");
        }
        if(l == linha || c == coluna){
            printf(" x ");
        }
        else{
            printf(" - ");
        }
        c++;
    }
    printf("\n");
}
return 0;

}

  • The most intuitive is to start from the position where the bishop is and navigate in each direction with a for. This is done only by modifying the increments in x and y or l and c if you want. In this case it would be +1 +1, +1 -1, -1 +1, -1 -1, for each direction respectively.

  • But as I was going to implement it in the code, I tried it here and I couldn’t

2 answers

1

For you to be able to move the bishop diagonally, it would be ideal for you to use an array to visualize the movement on the board, knowing the line and the column and also for you to store the house where the bishop is

       1    2    3    4    5    6    7    8  
   -----------------------------------------
  1 | 1,1  1,2  1,3  1,4  1,5  1,6  1,7  1,8 
  2 | 2,1  2,2  2,3  2,4  2,5  2,6  2,7  2,8 
  3 | 3,1  3,2  3,3  3,4  3,5  3,6  3,7  3,8 
  4 | 4,1  4,2  4,3  4,4  4,5  4,6  4,7  4,8 
  5 | 5,1  5,2  5,3  5,4  5,5  5,6  5,7  5,8 
  6 | 6,1  6,2  6,3  6,4  6,5  6,6  6,7  6,8 
  7 | 7,1  7,2  7,3  7,4  7,5  7,6  7,7  7,8 
  8 | 8,1  8,2  8,3  8,4  8,5  8,6  8,7  8,8 

using the matrix as a map, you can see that there are patterns based on the column and row you choose, which would be:

to the upper left diagonal of the number you have chosen, will always be:

linha-1 e coluna-1

to the upper right diagonal:

linha-1 e coluna+1

left lower diagonal:

linha+1 e coluna-1

right lower diagonal:

linha+1 e coluna+1

Code of each for:

    // usando 2 para definir casa disponível, 7 para posição atual e 0 para casa não possível de ir
   // separando cada for, para que fique mais fácil o entendimento do código.

// -------      DIAGONAL ESQUERDA CIMA    ---------
           for(i=linha;i>0;i--){
            for(j=coluna;j>0;j--){
                if(i == flagx - 1 && j == flagy - 1){
                    flagx=i; flagy=j;
                    tabuleiro[i][j]=2;
                }
          }
        }
// -------      DIAGONAL DIREITA BAIXO    ---------
          for(i=linha;i<=8;i++){
            for(j=coluna;j<=8;j++){
                if(i == flagx + 1 && j == flagy + 1){
                    flagx=i; flagy=j;
                    tabuleiro[i][j]=2;
                }
          }
    }
// -------      DIAGONAL DIREITA CIMA    ---------
        for(i=8;i>0;i--){
            for(j=8;j>0;j--){
                if(i == flagx - 1 && j == flagy + 1){
                    flagx = i;
                    flagy = j;
                    tabuleiro[i][j]=2;
                }
            }
        }
// -------      DIAGONAL ESQUERDA BAIXO    ---------
        for(i=0;i<=8;i++){
            for(j=0;j<=8;j++){

                if(i == flagx + 1 && j == flagy - 1){
                    flagx = i;
                    flagy = j;
                    tabuleiro[i][j]=2;
                }
            }
        }
  • https://onlinegdb.com/HBAo7XtB6 full code for you to test if you want

  • Got it, thank you very much :)

1

Another Member has already answered the question when he was already here. Anyway I answer in the same that gets two ways to apply the same logic I mentioned.

My example:

#include <stdio.h>
#include <string.h>
#define MAX_CASAS 8

void gera_movimentos_bispo(int casas_bispo[MAX_CASAS][MAX_CASAS], int linha_bispo, int coluna_bispo) {
    int i, j;
    for (i = linha_bispo + 1, j = coluna_bispo + 1; i < MAX_CASAS && j < MAX_CASAS; i++, j++) {
        casas_bispo[i][j] = 1;
    }
    for (i = linha_bispo - 1, j = coluna_bispo - 1; i >= 0 && j >= 0; i--, j--) {
        casas_bispo[i][j] = 1;
    }
    for (i = linha_bispo - 1, j = coluna_bispo + 1; i >= 0 && j < MAX_CASAS; i--, j++) {
        casas_bispo[i][j] = 1;
    }
    for (i = linha_bispo + 1, j = coluna_bispo - 1; i < MAX_CASAS && j >= 0; i++, j--) {
        casas_bispo[i][j] = 1;
    }
}

void mostra_movimentos_bispo(int casas_bispo[MAX_CASAS][MAX_CASAS], int linha_bispo, int coluna_bispo) {
    int i, j;
    for (i = 0; i < MAX_CASAS; i++) {
        printf("%3d |", i + 1);
        for (j = 0; j < MAX_CASAS; j++) {
            if(i == linha_bispo && j == coluna_bispo) {
                printf(" o ");
            } else {
                printf(" %c ", casas_bispo[i][j] == 1 ? 'x' : '-');
            }
        }
        printf("\n");
    }
}

int main() {
    int linha, coluna;

    printf("Movimento de um bispo no xadrez\n");;
    printf("Digite a linha que o bispo se encontra: ");
    scanf("%d", &linha);
    printf("Digite a coluna que o bispo se encontra: ");
    scanf("%d", &coluna);

    printf("\nMovimentos possiveis:\n\n");
    printf("      1  2  3  4  5  6  7  8  \n");
    printf("   -------------------------\n");

    int casas_bispo[MAX_CASAS][MAX_CASAS];
    memset(casas_bispo, 0, sizeof(casas_bispo)); //inicializa a zeros
    linha--; //ajusta para array que começa em 0
    coluna--; //ajusta para array que começa em 0

    gera_movimentos_bispo(casas_bispo, linha, coluna);
    mostra_movimentos_bispo(casas_bispo, linha, coluna);
    return 0;
}

Running with row 4 and column 4 gives you the following:

Movimentos possiveis:

      1  2  3  4  5  6  7  8  
   -------------------------
  1 | x  -  -  -  -  -  x  - 
  2 | -  x  -  -  -  x  -  - 
  3 | -  -  x  -  x  -  -  - 
  4 | -  -  -  o  -  -  -  - 
  5 | -  -  x  -  x  -  -  - 
  6 | -  x  -  -  -  x  -  - 
  7 | x  -  -  -  -  -  x  - 
  8 | -  -  -  -  -  -  -  x 

The function gera_movimentos_bispo has such a logic that I mentioned in comment to start from the place where the bishop is and generate the movements.

I also used an additional tray to mark the boxes where the bishop can go, with the value 1, in the optics of simplifying.

You can also see the result in Ideone if you prefer

  • Got it, thank you very much :)

Browser other questions tagged

You are not signed in. Login or sign up in order to post.