gpt4 book ai didi

C 语言国际象棋游戏 - 有些棋子不动

转载 作者:行者123 更新时间:2023-11-30 20:53:01 24 4
gpt4 key购买 nike

我正在用 C 语言制作一个国际象棋游戏。它需要严格的 c 语言。但我的棋子没有对移动做出应有的 react 。棋子的移动由坐标定义。

我认为问题应该出在这个函数上:

// 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);

结果是 colOrilinDes 在函数调用中交换。因此,代码不会尝试将 pawn 从 [6,4] 移动到 [5,4],而是尝试将 pawn 从 [6,4] 移动到 [4,4]。

简单的解决方法是像这样声明 moverPeca:

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

关于C 语言国际象棋游戏 - 有些棋子不动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53997720/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com