2014-11-16 7 views
0

업데이트 : 멋진 답변을 많이 주셔서 감사합니다, 정말 많이 도와 줬어. 구조 이동이 정말 도움이되고, 아직 수업에서 공부하지 않았습니다. 임 자신의 것을 프로그램 스켈레톤에 뼈대로 추가하는 내 코드의 완전한 솔루션을 연구 중입니다. 이미 당신과 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; 
} 

다음 내 주요있다.
도움 주셔서 대단히 감사드립니다. :).

+0

movimientoAleatorio를 생성하면 주요 문제뿐만 아니라 0과 8 사이의 숫자가됩니다. % 8을 시도하고 케이스 라벨을 0에서 7로 지정하십시오. – davidc

+0

David는 이미 말했지만, 아마도 명확하지 않습니다. 'movimientoAleatorio'는 숫자이므로, 케이스 라벨은 문자가 아닌 숫자 여야합니다.'case 1 '대신'case 1 ' 1''. –

+0

영어 기호 (변수, 함수, 매크로 등)를 높이 평가할 것입니다. –

답변

1

나는 당신의 임무는 모든 사각형을 방문하는 유효한 경로를 찾는 관한 추측을 업데이트 위치하여 posicion()를 업데이트 아닌 것 같다. 코드에서 하나의 임의 경로를 찾습니다. 당신이 ajedrez[fila - 2][columna - 1] 테스트 할 때

  • , 당신은 fila - 2 또는 columna - 1 당신의 체스 보드의 정말 유효한 인덱스가 있는지 여부를 확인하지 않습니다

    코드는 몇 가지 오류가 있습니다. 잘못된 인덱스, -1 또는 11에 액세스하면 정의되지 않은 동작이 호출됩니다.

  • filacolumna을 업데이트하지 마십시오. 말을 움직이지 마십시오.
  • 보드를 두 번 덮어 씁니다. 오류는 아니지만 코드가 두 가지 의무를 수행해서는 안됩니다.
  • 임의 선택이 해제되었습니다. 8 가지 가능한 동작이 있으므로 rand() % 8을 사용하면 0에서 7까지의 숫자를 얻을 수 있습니다. (David은 이미 주석에서 이것을 지적했습니다.)
  • 사례 라벨은 숫자가 아닌 charater 상수입니다. case 0:을 사용하십시오 (case '0': 아님).
  • 잘못된 동작은 건너 뜁니다. 더 이상 유효한 동작이 없으면 무한 루프가 발생합니다. 이 조건을 점검하고 루프가 발생하면 종료하십시오.
  • 내가 알기에, '포즈'매크로는 말이 실제로있는 것을 보여주기위한 것이다. 어쩌면 당신은 그 순간을 건너 뛰고 새 좌표를 인쇄해야합니다. 이것은 꽤 쉽지만 직관적이지 않습니다.

8 개의 스위치 케이스가 다른 결함을 나타냅니다. 동일한 반복 코드가 8 번 이상 나타납니다. 유일한 차이점은 점프 패턴입니다. 이러한 설정은 행과 열의 거리를 건너 뛰거나 가능한 점프 패턴 배열을 사용하여 함수를 작성하는 데 도움이됩니다.

코드는 대신 각 이동에 대해 다음과 같이해야합니다 :

  • 루프를 여덟 개 점프 패턴을 통해. 말이 보드에서 뛰어 내리거나 말이 이미 방문한 타일을 방문한다면 그 가능성을 무시하십시오. 그렇지 않은 경우 이동을 보조 배열에 추가하십시오.
  • 가능성이 0이면 루프를 종료하십시오. 말은 아무데도 갈 수 없습니다.
  • 유효한 움직임 중 하나를 선택하십시오.
  • 말을 움직여 현재 방문한 타일을 표시하십시오.
  • 원하는 경우 점프를보고하십시오. 새 위치를 인쇄하거나 커서를 놓습니다.

다음은 점프 패턴 배열을 사용하는 구현 예입니다. 하나의 임의 경로를 제공합니다. 문제에이 코드를 적용 할 수 있습니다.

#include <stdlib.h> 
#include <stdio.h> 
#include <time.h>  /* for time() */ 

#define SIZE 10   /* Fixed board size */ 

struct pos { 
    int x, y; 
}; 

struct pos moves[8] = {  /* Jump patterns */ 
    {1, 2}, 
    {2, 1}, 
    {2, -1}, 
    {1, -2}, 
    {-1, -2}, 
    {-2, -1}, 
    {-2, 1}, 
    {-1, 2} 
}; 

/* 
*  Is position (y, x) a valid board coordinate? 
*/ 
int on_board(int y, int x) 
{ 
    if (x < 0 || x >= SIZE) return 0; 
    if (y < 0 || y >= SIZE) return 0; 
    return 1; 
} 

/* 
*  Move the horse randomly, starting from (y, x). Print the 
*  visited fields and return the number of moves made or 
*  -1 if an error occurs. 
*/ 
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; 
    printf("%c%d, ", 'A' + y, x + 1); 

    while (1) {    /* Infinite loop - must use break */ 
     int poss[8];  /* Possible moves */ 
     int nposs = 0;  /* Actual length of poss */ 
     int i; 

     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){ 
      printf("whoa!\n"); 
      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 */ 
     printf("%c%d, ", 'A' + y, x + 1); 
    } 

    return -1;  /* Should never be reached */ 
} 

int main() 
{ 
    int n; 

    srand(time(NULL)); 

    n = horse(3, 6);  
    printf("%d moves\n", n); 

    return 0; 
} 
0

당신은 휠라와 COLUMNA