我正在用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;
}
最佳答案
您的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)