2017-12-11 13 views
0

현재 Windows 용 고모 쿠 게임을하고 있으며 MFC를 사용 중입니다. 현재 대각선 알고리즘에서 우승 중입니다. 수평과 수직으로 잘 작동합니다. 내 논리가 잘못된 부분을 누군가가 밝힐 수 있기를 바랍니다. 코드는 다음과 같습니다.대각선 승리 조건

bool CMainFrame::isWinner(int player){ 
for (int row = 0; row < data.size(); row++) { 
    for (int col = 0; col < data.size(); col++) { 
     if (data[row][col].color == player && data[row + 1][col + 1].color == player && data[row + 2][col + 2].color == player && data[row + 3][col + 3].color == player && data[row + 4][col + 4].color == player) { 
      CheckForGameOver(player); //function that simply shows message box of winning piece 
      return true; 
     } 
    } 
} 
} 

왼쪽 위 모서리에 연결된 대각선에서만 작동합니다. 프로그래밍에 익숙하지 않으므로 도움이 될 것입니다.

+2

루프에 숫자 15를 사용하거나, 이름이 지정된 상수를 사용하거나, 데이터 크기에서 값을 파생시키지 마십시오. Go 보드는 19 x 19 크기이므로 테스트가 끝나지 않았는지 확실하지 않습니다. 응답을 위해 – stark

+0

고마워. 내 보드는 15 X 15입니다. 오. 방금 내 data.size()를 편집했습니다. 내 코드에서 사용하지만 여전히 변경되지 않는 것 같습니다. – Elijah

+0

그럼 분명히 한계를 벗어나고 있습니다. – stark

답변

1

이 게임의 규칙은 5 개 항목이 행 또는 열 또는 대각선에서 일치해야한다는 것입니다. 각 행, 열 및 대각선을 비교하여 5 개의 항목이 일치하는지 확인하고 true를 반환합니다. 그렇지 않으면 함수는 false를 반환해야합니다.

bool won(std::vector<std::vector<data_t>> &data, int color) 
{ 
    //check each row: 
    for(int row = 0; row < 15; row++) 
     for(int col = 0; col < 10; col++) 
     { 
      bool match = true; 
      for(int i = 0; i < 5; i++) 
       if(color != data[row][col + i].color) 
        match = false; 
      if(match) return true; 
     } 
    //check each column: 
    for(int col = 0; col < 10; col++) 
     for(int row = 0; row < 15; row++) 
     { 
      bool match = true; 
      for(int i = 0; i < 5; i++) 
       if(color == data[row + i][col].color) 
        match = false; 
      if(match) return true; 
     } 
    //check diagonal lines from top-left to bottom-right 
    for(int col = 0; col < 10; col++) 
     for(int row = 0; row < 10; row++) 
     { 
      bool match = true; 
      for(int i = 0; i < 5; i++) 
       if(color == data[row + i][col + i].color) 
        match = false; 
      if(match) return true; 
     } 
    //lastly check diagonal lines from top-right to bottom-left 
    return false; 
}