2013-03-17 2 views
5

저는 현재 자신을위한 행 게임에서 기본 4 가지 작업을하고 있습니다. 그러나 저는 그 논리에 뒤떨어져 있습니다. Four in a row logic

현재 I는 12은 플레이어를 나타내는 반면, 빈 슬롯을 나타내는 것 인 기판

[ 
    [0, 0, 0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0, 0, 0] 
] 

0를 나타내는이 다차원 배열을 갖는다.

[ 
    [0, 0, 0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0, 0, 0], 
    [0, 0, 0, 1, 1, 0, 0], 
    [0, 0, 0, 1, 1, 0, 0], 
    [0, 0, 1, 2, 2, 2, 0], 
    [0, 1, 2, 2, 1, 2, 0] 
] 

가 어떻게 연속으로 네이 있는지 확인하는 논리를 작성할 수 있습니다 그래서 당신은이 배열을 얻을 동안의이 후 가정 해 봅시다? 가로 및 세로 값을 계산하면 (비록 가장 좋은 방법을 찾았음에도 불구하고) 오히려 쉽게 보이지만, 대각선에 대해이 작업을 수행하는 방법은 무엇입니까?

+3

마찬가지로 수평 또는 수직으로 수행하지만 두 좌표는 모두 증가/감소합니다. 단지 하나가 아닌. –

+0

@ H2CO3 편집/태깅으로 더 나아가서 완전히 언어에 무관심하게 만들 수도 ... 나는 그 일을 생각하고있었습니다. – Till

+0

@Till 그래, 그건 너무 합리적이다. –

답변

12

가장 좋은 방법은 아마도 사에 검색 공간을 분할하는 것입니다 : 수직

  • ;
  • 가로;
  • 오른쪽 아래로;
  • 오른쪽 위로.

방향에 따라 시작 및 종료 좌표를 제한하십시오.

예를 들어, 배열이 board[row=0-5][col=0-6]이고 왼쪽 상단이 board[0][0] 인 경우를 가정 해 봅시다.

for row = 0 to 2: 
    for col = 0 to 6: 
     if board[row][col] != 0 and 
      board[row][col] == board[row+1][col] and 
      board[row][col] == board[row+2][col] and 
      board[row][col] == board[row+3][col]: 
       return board[row][col] 

이 보드의 문제를 가장자리를 확장하지 않는 만에 가능성을 제한 :

먼저 수직 (루프이 의사 코드에 모두 끝이 포함됩니다) 대부분의 솔루션은 각 셀을 확인하고 거기에서 모든 방향으로 나가서 간단하게 시작할 때 갖습니다. 이것에 의해 3 행의 시작 행을 검사 할 필요가 없다는 것을 의미합니다. 행 3, 4, 5 및 6 (존재하지 않는 후자)을 포함하기 때문입니다. 수평에 대한 유사

:

for row = 0 to 5: 
    for col = 0 to 3: 
     if board[row][col] != 0 and 
      board[row][col] == board[row][col+1] and 
      board[row][col] == board[row][col+2] and 
      board[row][col] == board[row][col+3]: 
       return board[row][col] 

권리를 아래로, 우측으로까지 이어 :

for row = 0 to 2: 
    for col = 0 to 3: 
     if board[row][col] != 0 and 
      board[row][col] == board[row+1][col+1] and 
      board[row][col] == board[row+2][col+2] and 
      board[row][col] == board[row+3][col+3]: 
       return board[row][col] 

for row = 3 to 5: 
    for col = 0 to 3: 
     if board[row][col] != 0 and 
      board[row][col] == board[row-1][col+1] and 
      board[row][col] == board[row-2][col+2] and 
      board[row][col] == board[row-3][col+3]: 
       return board[row][col] 

이제, 당신이 실제로 for col = 0 to 3 외부 루프를 만들어 두를 결합 할 수 있습니다 한 번만 두 번하는 것이 아니라 한 번만 해보는 것이 좋습니다. 실제로 이해하기 쉽도록 (적절한 설명과 함께) 별도로 유지하는 것을 선호합니다. 성능에 중독되어있는 경우에는, 당신은 시도 할 수없는 승리는 네 가지 방향에서 찾을 수 없습니다 경우

for col = 0 to 3: 
    for row = 0 to 2: 
     if board[row][col] != 0 and 
      board[row][col] == board[row+1][col+1] and 
      board[row][col] == board[row+2][col+2] and 
      board[row][col] == board[row+3][col+3]: 
       return board[row][col] 
    for row = 3 to 5: 
     if board[row][col] != 0 and 
      board[row][col] == board[row-1][col+1] and 
      board[row][col] == board[row-2][col+2] and 
      board[row][col] == board[row-3][col+3]: 
       return board[row][col] 

다음, 단순히 승자 1 또는 2 대신 0을 반환합니다.

따라서, 예를 들어, 샘플 보드 :

row 
0 [0, 0, 0, 0, 0, 0, 0] 
1 [0, 0, 0, 0, 0, 0, 0] 
2 [0, 0, 0, 1, 1, 0, 0] 
3 [0, 0, 0, 1, 1, 0, 0] 
4 [0, 0, 1, 2, 2, 2, 0] 
5 > [0, 1, 2, 2, 1, 2, 0] 
     ^
     0 1 2 3 4 5 6 <- col 

오른쪽과 {5,1}{4,2}, {3,3}{2,4} 모든 1로 설정되어 있기 때문에 시작 셀 {5,1}했다 루프까지 승자를 감지한다.

+0

정말 많이 도움이되었습니다. –

2

저는 4 시간 연속 게임을 개발했습니다. 다음은 행 상태에서 4 인 우승 조건을 확인하는 코드입니다. (C 언어)

int checkWinOrLose(int grid[][7],int result,int rowNum) { 
// For checking whether any win or lose condition is reached. Returns 1 if win or lose is reached. else returns 0 
// grid[][] is the 6X7 matrix 
// result is the column number where the last coin was placed 
// rowNum is the row number where the last coin was placed 

    int player=grid[rowNum][result]; 
    if(rowNum<=2 && grid[rowNum+1][result]==player && grid[rowNum+2][result]==player && grid[rowNum+3][result]==player) // 4 in a row vertically 
     return 1; 
    else { 
     int count=1,i,j; 
     for(i=result+1;i<7;i++) { // 4 in a row horizontally 
      if(grid[rowNum][i]!=player) 
       break; 
      count++; 
     } 
     for(i=result-1;i>=0;i--) { // 4 in a row horizontally 
      if(grid[rowNum][i]!=player) 
       break; 
      count++; 
     } 
     if(count>=4) 
      return 1; 
     count=1; 
     for(i=result+1,j=rowNum+1;i<7 && j<6;i++,j++) { // 4 in a row diagonally 
      if(grid[j][i]!=player) 
       break; 
      count++; 
     } 
     for(i=result-1,j=rowNum-1;i>=0 && j>=0;i--,j--) { // 4 in a row diagonally 
      if(grid[j][i]!=player) 
       break; 
      count++; 
     } 
     if(count>=4) 
      return 1; 
     count=1; 
     for(i=result+1,j=rowNum-1;i<7 && j>=0;i++,j--) { // 4 in a row diagonally 
      if(grid[j][i]!=player) 
       break; 
      count++; 
     } 
     for(i=result-1,j=rowNum+1;i>=0 && j<6;i--,j++) { // 4 in a row diagonally 
      if(grid[j][i]!=player) 
       break; 
      count++; 
     } 
     if(count>=4) 
      return 1; 
    } 
    return 0; 
}