#체스

게스라게스라· 5개월

질문체스를 만들고 있는데 기물이 옮겨지지 않습니다

현재 만드는 중인 체스인데, 기물을 옮기는 과정에서 기물이 사라지기만 하고 옮겨지지가 않습니다 도와주세요 #include <stdio.h> char X; int Y; char mX; int mY; char piece; void boardprint(char board[8][8]); int Pawn(char X,int Y,char mX,int mY); int Rook(char X,int Y,char mX,int mY); int Knight(char X,int Y,char mX,int mY); int Bishop(char X,int Y,char mX,int mY); int King(char X,int Y,char mX,int mY); int Queen(char X,int Y,char mX,int mY); int main(){ char board[8][8]; for(int y=0;y<8;y++){ for(int x=0;x<8;x++){ board[y][x]=' '; } } for(int x=0;x<8;x++){ board[1][x]='p'; board[6][x]='P'; } board[0][0]='r'; board[0][7]='r'; board[7][0]='R'; board[7][7]='R'; board[0][1]='n'; board[0][6]='n'; board[7][1]='N'; board[7][6]='N'; board[0][2]='b'; board[0][5]='b'; board[7][2]='B'; board[7][5]='B'; board[0][4]='k'; board[7][4]='K'; board[0][3]='q'; board[7][3]='Q'; int cnt=0; printf("체스 게임에 오신 것을 환영합니다. 알파 버전이며 오류가 발생할 수도 있습니다.\n"); printf("움직일 기물을 선택하는 형식은 (기물이름) (x좌표) (y좌표) 입니다.\n"); printf("움직일 위치를 선택하는 형식은 (x좌표) (y좌표) 입니다. \n"); printf("대문자가 백이자 아랫쪽 플레이어의 기물, 소문자가 흑이자 윗쪽 플레이어의 기물입니다. \n"); while(1){ cnt++; boardprint(board); printf("%d번째 아랫쪽 플레이어 턴입니다.",cnt); printf("움직일 기물을 선택해주세요:"); scanf("%c %c %d",&piece,&X,&Y); printf("움직일 위치를 정해주세요:"); scanf("%c %d",&mX,&mY); X=X-'a'; mX=mX-'a'; Y=8-Y; mY=8-mY; switch (piece){ case 'P': if(Pawn(X,Y,mX,mY)){ board[Y][X]=' '; board[mY][mX]='P'; } break; case 'R': if(Rook(X,Y,mX,mY)){ board[Y][X]=' '; board[mY][mX]='R'; } break; case 'N': if(Knight(X,Y,mX,mY)){ board[Y][X]=' '; board[mY][mX]='N'; } break; case 'B': if(Bishop(X,Y,mX,mY)){ board[Y][X]=' '; board[mY][mX]='B'; } break; case 'K': if(King(X,Y,mX,mY)){ board[Y][X]=' '; board[mY][mX]='K'; } break; case 'Q': if(Queen(X,Y,mX,mY)){ board[Y][X]=' '; board[mY][mX]='Q'; } break; } } } void boardprint(char board[8][8]){ printf("해당 라운드의 체스 보드입니다.\n"); for(int a=0;a<8;a++){ for(int b=0;b<8;b++){ if(b==0) printf("%d",8-a); printf(" %c ",board[a][b]); } printf("\n"); } printf(" "); for(int b=0;b<8;b++){ printf(" %c ",'a'+b); } printf("\n"); } int Pawn(char X,int Y,char mX,int mY){ if(Y==1||Y==6){ if(Y-mY==2||Y-mY==-2) return 1; else if(Y-mY==1||Y-mY==-1) return 1; else return 0; } else if(Y-mY==1||Y-mY==-1) return 1; else return 0; } int Rook(char X,int Y,char mX,int mY){ if(X!=mX&&Y==mY){ return 1; } else if(Y!=mY&&X!=mY){ return 1; } else{ return 0; } } int Knight(char X,int Y,char mX,int mY){ switch (mX-X){ case 1: if(Y-mY==2||mY-Y==2) return 1; else return 0; break; case 2: if(Y-mY==1||mY-Y==1) return 1; else return 0; break; case -1: if(Y-mY==2||mY-Y==2) return 1; else return 0; break; case -2: if(Y-mY==1||mY-Y==1) return 1; else return 0; break; default: return 0; } } int Bishop(char X,int Y,char mX,int mY){ if(X-mX==Y-mY) return 1; else if(X-mX==mY-Y) return 1; else return 0; } int King(char X,int Y,char mX,int mY){ if(X==mX){ if(Y-mY==1) return 1; else if(mY-Y==1) return 1; else return 0; } else if(X-mX==1){ if(Y-mY==1) return 1; else if(mY-Y==1) return 1; else if(mY==Y) return 1; else return 0; } else if(mX-X==1){ if(Y-mY==1) return 1; else if(mY-Y==1) return 1; else if(mY==Y) return 1; else return 0; } else return 0; } int Queen(char X,int Y,char mX,int mY){ if(Bishop(X,Y,mX,mY)||Rook(X,Y,mX,mY)){ return 1; } else return 0; }
177
2
0
윈비
윈비·2024-11-20
먼저 입력 문자의 개행 문자가 버퍼에 남아있어서 영향을 줄 수 있으니 scanf의 앞에 공백을 추가해보세요. scanf(" %c %c %d", &piece, &X, &Y); // 공백추가 scanf(" %c %d", &mX, &mY); // 공백추가 그리고 Y와 mY 범위가 배열을 넘지않도록 검증하는 코드를 추가해보세요....