2012-07-27 2 views
0

저는 Tic-Tac-Toe 게임을하고 있었고 제 입력 함수로 플레이어가 2 차원 배열에 정수로 저장하려고 한 움직임을 얻었습니다. 입력은 포인터의 1D 배열에 대한 참조를 사용하여 얻었습니다 2D 배열의 위치로 이동합니다.2D 배열에 대한 포인터의 1D 배열 사용?

하지만 내 문제는 포인터를 사용하여 다차원 배열의 사각형 값을 설정하는 것처럼 보이지만 아무런 문제가 발생하지 않는다는 것입니다.

void Game::input(Board b){ 
int *spots[9]; // Possible spots for the input 
bool validInput = false; 
spots[0] = &b.board[2][0]; 
spots[1] = &b.board[2][1]; 
spots[2] = &b.board[2][2]; 
spots[3] = &b.board[1][0]; 
spots[4] = &b.board[1][1]; 
spots[5] = &b.board[1][2]; 
spots[6] = &b.board[0][0]; 
spots[7] = &b.board[0][1]; 
spots[8] = &b.board[0][2]; 
redo: 
    cout << ">> " << endl; 
    int input; // Input 
    cin >> input; // Get the input 
    validInput = cin; 
    if(!validInput){ 
     cout << "Numbers only please!" << endl; 
     cin.clear(); 
     while(cin.get() != '\n'); 
     goto redo; 
    } 
    if(input > 9 || input <= 0){ 
     cout << "Invalid move!" << endl; 
     goto redo; 
    } 
    input--; // Subtract 1 for array location 
    if(*spots[input] != 0){ 
     cout << "Square is already being used!" << endl; 
     goto redo; 
    } 
    *spots[input] = 1; 
} 

지금, I는 입력 번호 7 그것은 [0] [0] (1)에 단이 보이지 않는 b.board 설정해야한다고 : 여기

입력 함수 우연히 있다. 나중에 유닛 케이스를 실행할 때 보드 [0] [0]이 1로 설정되지 않은 것으로 보이며 배열에 반영되지 않습니다. 내가 포인터에 대해 뭔가를 망쳐 놓고 있니?

+4

당신은 goto''을 통해 루프를 사용하는 습관을해야합니다

은 BTW, paranthesis 및 루프는 당신의 친구입니다. 또한, 당신은 참조로 보드를 통과하지 않을거야, 당신은 어떤 무작위로 복사 전달하고있어. – chris

+1

벡터,지도 또는 for-loop를 사용할 수 있습니까? – andre

+0

절대로, 이건 해결되었습니다, 내가 참조 할 일을 놓친 것을 믿을 수 없어. – Annabelle

답변

6

함수에 대한 인수는 값에 의해 전달되므로 값으로 전달하면 인수 사본이 만들어 지므로 사용자가 변경 한 값은 인식되지 않습니다. 포인터 나 참조를 대신 전달하는 것을 고려하십시오.

+0

내가 그것을 놓쳤다는 것을 믿을 수 없다 : p 대단히 감사합니다! 수락 됨. (5 분 안에) – Annabelle

+0

적어도 고칠 수 있습니다 !! – mathematician1975

2

void Game::input(Board& b) 

에 당신이 실제로 반영하는 변경 사항을 볼 수 있습니다 그런 식으로 당신의 방법 서명을 변경

. 현재 값으로 메소드를 호출하고 있습니다.

+0

코드를 보내 주셔서 감사합니다. 문제가 해결되었습니다. – Annabelle

2

시도 할 수있는 또 다른 사항은 이동을 선택하는 약간의 수학입니다. 사용자가 7. 7/3 = 2, 행을 입력한다고 가정 해보십시오. 7 % 3 = 1, 컬럼. 그래서 7은 올바른 자리 인 board[2][1]을 나타냅니다. 다른 함수에서이를 호출 할 때

void Game::input(Board b) 

같은

Board tictactoe; 
Game g; 

g.input(tictactoe); 

b사본 tictactoe을 얻는다 :로

+0

시도해 봤지만, 작동하지 않았다. 오, 그리고 보드 [0] [0]은 배열 인덱스에 대해 입력에서 1을 빼기 때문에 # 7입니다. – Annabelle

+0

+1은 우아함 –

+0

입니다. 실제로는 훨씬 쉽고 우아하게 보입니다. – Annabelle

0

귀하의 입력 기능이 선언된다. input() 함수에서 변경 한 내용이 b으로 변경된 경우 tictactoe에 반영되지 않습니다.

1) 참조 보드를 전달합니다 :

당신은 적어도 두 가지 솔루션을

void Game::input(Board& b) 

2) 또는 보드에 대한 포인터를 전달합니다

void Game::input(Board* b) 

도 있습니다을 코드 재 설계가 필요한 다른 솔루션 이 두 가지는 아마도 현재의 문제를 해결하는 가장 간단하고 직접적인 방법 일 것입니다.

또한 1D 배열에서 2 차원 배열로 색인을 매핑하는 방법이 다소 이상하게 보입니다. 당신이 사실

spots[0] = &(b.board[0][0]); 
spots[1] = &(b.board[0][1]); 
spots[2] = &(b.board[0][2]); 
spots[3] = &(b.board[1][0]); 
spots[4] = &(b.board[1][1]); 
spots[5] = &(b.board[1][2]); 
spots[6] = &(b.board[2][0]); 
spots[7] = &(b.board[2][1]); 
spots[8] = &(b.board[2][2]); 

이 있다면 나는 다른 사람이 언급 한대로 입력에서 행 안부 지수를 계산할 수 있기 때문에,이 불필요하다, 무슨 일이 일어나고 있는지를 추적하기 쉬울 것 같아요.또는 사용자에게 하나가 아닌 두 개의 숫자를 입력하도록 요청할 수 있습니다.

3

Board 인스턴스를 포인터/참조 대신 input() 값으로 전달하고 있습니다. 해당 Board 인스턴스를 변경하면 input()으로 전달 된 원래 Board 인스턴스에 반영되지 않습니다.

void Game::input(Board &b) 
{ 
    int* spots[9]; // Possible spots for the input 
    bool validInput; 
    int input; 
    spots[0] = &(b.board[2][0]); 
    spots[1] = &(b.board[2][1]); 
    spots[2] = &(b.board[2][2]); 
    spots[3] = &(b.board[1][0]); 
    spots[4] = &(b.board[1][1]); 
    spots[5] = &(b.board[1][2]); 
    spots[6] = &(b.board[0][0]); 
    spots[7] = &(b.board[0][1]); 
    spots[8] = &(b.board[0][2]); 
    do 
    { 
     std::cout << ">> " << std::endl; 
     std::cin >> input; // Get the input 
     validInput = std::cin; 
     if (!validInput) 
     { 
      std::cout << "Numbers only please!" << std::endl; 
      std::cin.clear(); 
      while (std::cin.get() != '\n'); 
      continue; 
     } 
     if ((input > 9) || (input <= 0)) 
     { 
      std::cout << "Invalid move!" << std::endl; 
      continue; 
     } 
     --input; // Subtract 1 for array location 
     if (*spots[input] != 0) 
     { 
      std::cout << "Square is already being used!" << std::endl; 
      continue; 
     } 
     *spots[input] = 1; 
     break; 
    } 
    while (true); 
} 
관련 문제