업데이트 : 멋진 답변을 많이 주셔서 감사합니다, 정말 많이 도와 줬어. 구조 이동이 정말 도움이되고, 아직 수업에서 공부하지 않았습니다. 임 자신의 것을 프로그램 스켈레톤에 뼈대로 추가하는 내 코드의 완전한 솔루션을 연구 중입니다. 이미 당신과 davidc가 지적한대로 문자가 아니기 때문에 필라와 칼럼, 임의 선택과 '0'에서 '7'로 전환하는 문제를 수정했습니다. 내 프로그램에는 아직 완전히 작동하는 프로그램을 게시하기 전에 작업중인 몇 가지 문제가 있습니다. 나는 오늘 코드가 아니라면 내일 코드를 업데이트 할 것이다. 귀하의 의견과 해결책에 대해 모두 감사 드리며 훌륭한 대답을하시는 동안 M oehm에게 감사드립니다.
------------------------------------------------ -------------------------------------------------- ----------------------------------
업데이트 2 : Finnished, 약간 변경했습니다. M Oehm 코드를 사용하고 수동으로 말의 첫 번째 위치를 입력하는 대신 이전 PosicionCaballo()를 사용했습니다. 스위치를 가지고 있던 MoverCaballo()의 코드를 삭제해야만했기 때문에 무작위로 설정할 수있는 8 가지 동작이 가능했습니다. 왜냐하면 나는 작동하지 않을 수 있었기 때문입니다 (주요 문제는 이미 엉망 이었기 때문에 그 부분이었습니다).
아래의 코드를 가진 프로그램은 사용자에게 말의 초기 위치를 물어봐야합니다. 그 다음에는 화면에 0 (여유 공간)이 채워진 10x10 테이블이 인쇄되고 1로 채워집니다 (말 이동을 한 공간 무작위로) 그리고 그것이 finnishes 때 얼마나 많은 위치에 걸릴 메시지를 표시합니다.체스 테이블에서 말의 가능한 모든 움직임을 수행 할 수 없습니다
COORD cxy;
#define posicion(x,y) {(cxy.X)= (x);(cxy.Y)= (y); SetConsoleCursorPosition((GetStdHandle(STD_OUTPUT_HANDLE)), (cxy));}
int ajedrez[10][10];
int fila, columna;
void GenerarTablero(int m[10][10]){
int i, j;
for (i = 0; i < 10; i++){
for (j = 0; j < 10; j++){
m[i][j] = 0;
}
}
}
GenerarTablero는 체스 보드를 만들고 0으로 채 웁니다.
ajedrez [10] [10]
ajedrez [10] [10]의 일부는 10x10 크기의 체스 테이블입니다.
void PosicionCaballo(int m[10][10]){
printf("Fila: ");
scanf_s("%d", &fila);
printf("Columna: ");
scanf_s("%d", &columna);
printf("\n");
m[fila][columna] = 2;
system("cls");
}
PosicionCaballo는 사용자에게 말의 초기 위치를 묻고 말을 테이블에 올려 놓습니다.
예 : 행 : 5 열은 : 5
int horse(int y, int x)
{
int visited[SIZE][SIZE] = { { 0 } };
int count = 0;
if (on_board(y, x) == 0) return -1;
/* Set starting position */
visited[y][x] = 1;
while (1) { /* Infinite loop - must use break */
int poss[8]; /* Possible moves */
int nposs = 0; /* Actual length of poss */
int i, k = 1;
for (i = 0; i < 8; i++) {
int xx = x + moves[i].x;
int yy = y + moves[i].y;
if (on_board(yy, xx) && visited[yy][xx] == 0) {
poss[nposs++] = i;
}
}
/* No more valid moves: return */
if (nposs == 0){
posicion(0, 11);
printf("El tablero se ha bloqueado con ");
return count;
}
/* pick one of the valid moves */
i = poss[rand() % nposs];
x = x + moves[i].x;
y = y + moves[i].y;
/* update horse's position */
visited[y][x] = 1;
count++;
/* print position */
posicion(y, x);
printf("1");
}
return -1; /* Should never be reached */
}
void MostrarMapa(int m[10][10]){
int i, j;
for (i = 0; i < 10; i++){
for (j = 0; j < 10; j++){
printf("%d", ajedrez[i][j]);
}
printf("\n");
}
}
MostrarMapa 만 화면에 체스 테이블을 인쇄합니다. 거꾸로 언급 한 모든 기능을 사용하여 메신저
int main(void){
int n;
srand(time(NULL));
GenerarTablero(ajedrez);
PosicionCaballo(ajedrez);
MostrarMapa(ajedrez);
n = horse(fila, columna);
posicion(31, 11);
printf("%d movimientos\n", n);
getch();
return 0;
}
다음 내 주요있다.
도움 주셔서 대단히 감사드립니다. :).
movimientoAleatorio를 생성하면 주요 문제뿐만 아니라 0과 8 사이의 숫자가됩니다. % 8을 시도하고 케이스 라벨을 0에서 7로 지정하십시오. – davidc
David는 이미 말했지만, 아마도 명확하지 않습니다. 'movimientoAleatorio'는 숫자이므로, 케이스 라벨은 문자가 아닌 숫자 여야합니다.'case 1 '대신'case 1 ' 1''. –
영어 기호 (변수, 함수, 매크로 등)를 높이 평가할 것입니다. –