Шахматы в C - Некоторые фигуры не движутся - PullRequest
0 голосов
/ 01 января 2019

Я играю в шахматы на C. Это должно быть странно. C.Но мои шахматные фигуры не реагируют на движение так, как должны.Движение кусков определяется координатами.

Я думаю, что проблема должна быть в этой функции:

// função mover peça com problema encontrar
int moverPeca(int linOri, int linDes, int colOri, int colDes) {
    int mover = 0;
    char peca;
    //deslocamento vertical e deslocamento horizontal (nº linhas que avança)
    int dV = abs(linDes - linOri);
    int dH = abs(colDes - colOri);

    if ((linOri >= 0 && linOri < 8 && colOri >= 0 && colOri < 8) &&
        (linDes >= 0 && linDes < 8 && colDes >= 0 && colDes < 8)) {
        peca = xadrez[linOri][colOri];

        // definição do movimento apropriado da peça Torre - mexe na vertical e na horizontal quantas casas quiseres
        if ((peca == 'T' || peca == 't') && (dV == 0 || dH == 0)) {

            mover = 1;
        }

        // definição do movimento apropriado da peça Bispo - só mexe na diagonal quantas casas quiseres
        if ((peca == 'B' || peca == 'b') && (dV == dH)) {

            mover = 1;
        }

        // definição do movimento apropriado da peça Cavalo mexe em L 2/3 ou 3/2
        if ( (peca == 'C' || peca == 'c') && 
            ( (dV == 1 && dH == 2) || (dV == 2 && dH == 1) ) ) {

            mover = 1;
        }

        // definição do movimento apropriado da peça Q Rainha anda de todas as formas H e V
        if ( (peca == 'Q' || peca == 'q') && 
            ( (dV == dH) || (dV == 0) || (dH == 0) ) ) {

            mover = 1;
        }

        // definição do movimento apropriado da peça K REi só anda 1 casa na V ou H ou Diagonal
        if ( (peca == 'K' || peca == 'k') && 
            ( (dV >= 0 && dV <= 1) && (dH >= 0 && dH <= 1 ) ) ) {

            mover = 1;
        }

        // definição do movimento apropriado da peça p peão pode andar 2 casas a 1 vez e depois anda sempre só uma e come na diagonal
        if ((peca == 'p') && ( (linOri - linDes) == 1) && (dH == 0) ) {

            mover = 1;
        }

        // definição do movimento apropriado da peça p peão pode andar 2 casas a 1 vez e depois anda sempre só uma e come na diagonal

        if ((peca == 'P') && ( (linDes - linOri) == 1) && (dH == 0) ) {

            mover = 1;
        }


        if (mover) {
            xadrez[linDes][colDes] = xadrez[linOri][colOri];
            xadrez[linOri][colOri] = ' ';
        }
        return 1;
    }
    else {
        return 0;
    }
}

Это код, который я до сих пор:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

// Matriz de 8 por 8 para fazer os quadrados do jogo
char xadrez[8][8] = {
    { 'T', 'C', 'B', 'Q', 'K', 'B', 'C', 'T'}, //Pretas em maiúsculas
    { 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P'},
    { ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '},
    { ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '},
    { ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '},
    { ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '},
    { 'p', 'p', 'p', 'p', 'p', 'p', 'p', 'p'},//Brancas em minúsculas
    { 't', 'c', 'b', 'q', 'k', 'b', 'c', 't'}

};

// Função para pintar a tela e o texto dentro dos quadrados
void pintarTelaTexto() {
    system("CLS");// serve para limpar a tela
    //linha - coluna e r para controle da casa central onde vamos por a letra
    int lin, col, r;

    for (lin=0; lin < 8; lin++) {

        for (r=0; r < 3; r++) {
            for (col=0; col < 8; col++) {
                //char letra com problema nao aparece na casa central apa

                char peca = xadrez[lin][col];
                char letra = ((lin + col) % 2 == 0) ? '\xB2' : ' ';
                letra = (r == 1 && peca != ' ') ? peca : letra; // operador ternário
                    if ((lin + col ) % 2 == 0) {
                        printf("\xB2\xB2%c\xB2\xB2", letra);
                    }
                    else {
                        // %c para inserção da letra
                        printf("  %c  ", letra);
                    }
            }
            printf("\n");
        }
    }
}

// função mover peça com problema encontrar
int moverPeca(int linOri, int linDes, int colOri, int colDes) {
    int mover = 0;
    char peca;
    //deslocamento vertical e deslocamento horizontal (nº linhas que avança)
    int dV = abs(linDes - linOri);
    int dH = abs(colDes - colOri);

    if ((linOri >= 0 && linOri < 8 && colOri >= 0 && colOri < 8) &&
        (linDes >= 0 && linDes < 8 && colDes >= 0 && colDes < 8)) {
        peca = xadrez[linOri][colOri];

        // definição do movimento apropriado da peça Torre - mexe na vertical e na horizontal quantas casas quiseres
        if ((peca == 'T' || peca == 't') && (dV == 0 || dH == 0)) {

            mover = 1;
        }

        // definição do movimento apropriado da peça Bispo - só mexe na diagonal quantas casas quiseres
        if ((peca == 'B' || peca == 'b') && (dV == dH)) {

            mover = 1;
        }

        // definição do movimento apropriado da peça Cavalo mexe em L 2/3 ou 3/2
        if ( (peca == 'C' || peca == 'c') && 
            ( (dV == 1 && dH == 2) || (dV == 2 && dH == 1) ) ) {

            mover = 1;
        }

        // definição do movimento apropriado da peça Q Rainha anda de todas as formas H e V
        if ( (peca == 'Q' || peca == 'q') && 
            ( (dV == dH) || (dV == 0) || (dH == 0) ) ) {

            mover = 1;
        }

        // definição do movimento apropriado da peça K REi só anda 1 casa na V ou H ou Diagonal
        if ( (peca == 'K' || peca == 'k') && 
            ( (dV >= 0 && dV <= 1) && (dH >= 0 && dH <= 1 ) ) ) {

            mover = 1;
        }

        // definição do movimento apropriado da peça p peão pode andar 2 casas a 1 vez e depois anda sempre só uma e come na diagonal
        if ((peca == 'p') && ( (linOri - linDes) == 1) && (dH == 0) ) {

            mover = 1;
        }

        // definição do movimento apropriado da peça p peão pode andar 2 casas a 1 vez e depois anda sempre só uma e come na diagonal

        if ((peca == 'P') && ( (linDes - linOri) == 1) && (dH == 0) ) {

            mover = 1;
        }


        if (mover) {
            xadrez[linDes][colDes] = xadrez[linOri][colOri];
            xadrez[linOri][colOri] = ' ';
        }
        return 1;
    }
    else {
        return 0;
    }
}

// MAIN
int main() {
    int linOri, linDes, colOri, colDes;
    while (1) {
        pintarTelaTexto();
        printf("Informe a linha e coluna de origem: ");
        scanf("%d %d", &linOri, &colOri );
        printf("\nInforme a linha e coluna de destino: ");
        scanf("%d %d", &linDes, &colDes );
        int resultado = moverPeca(linOri, colOri, linDes, colDes);
        if (resultado != 1) {
            switch (resultado) {
            case 9: printf("A peça não pode ser usada assim"); getch(); break;
            case 0: printf("\nERRO : Coordenadas Inválidas"); getch(); break;
            case 1: break;
            }
        }

    }
    getch();
    return 0;

}

1 Ответ

0 голосов
/ 01 января 2019

Ваша функция moverPeca ожидает параметры в следующем порядке:

int moverPeca(int linOri, int linDes, int colOri, int colDes)

Это начало строки, назначение строки, начало столбца и назначение столбца в этом порядке.

Но вы вызываете его с помощью:

int resultado = moverPeca(linOri, colOri, linDes, colDes);

В результате colOri и linDes меняются местами в вызове функции.Таким образом, вместо попытки переместить пешку с [6,4] на [5,4], код пытается переместить пешку с [6,4] на [4,4].

Простое исправлениеобъявить moverPeca следующим образом:

int moverPeca(int linOri, int colOri, int linDes, int colDes)
...