2014-12-05 7 views
3

임 코드에 문제가 있습니다. 필자는 오랫동안 노력해 왔으며 문제가 무엇인지 전혀 알지 못합니다. 필자는 디버깅을 시도하지만 난 그것과 아무. (스웨덴 덧글에 대한 죄송) 여기 Tic Tac Toe 확인 승자

import java.util.Scanner; 
public class Tictactoe { 

static char[][] MakeMove (char[][] spelplan, char spelare, int rad, int kolumn){ 
spelplan[rad][kolumn]=spelare; 
System.out.println(spelplan[rad][kolumn]); 
return spelplan; 
} 
static boolean CheckMove (char[][] spelplan, int x, int y){ 
if (spelplan[x][y] != ' ') 
return false; 
else return true; 
} 
static void SkrivUtSpelplan(char[][] spelplan){ 

System.out.println("-------"); 
System.out.println("|"+spelplan[1][1] + "|" + spelplan[1][2] + "|" +spelplan[1][3] + "|"); 
System.out.println("|-+-+-|"); 
System.out.println("|"+spelplan[2][1] + "|" + spelplan[2][2] + "|" +spelplan[2][3] + "|"); 
System.out.println("|-+-+-|"); 
System.out.println("|"+spelplan[3][1] + "|" + spelplan[3][2] + "|" +spelplan[3][3] + "|"); 
System.out.println("-------"); 

} 

//Kollar om horisontella är löst 
public static boolean isHorizontalSolved(char[][] spelplan) { 
for (int y = 0; y < spelplan.length; ++y) { 
    //För varje rad kolla om varje kolumn är fylld 
    boolean solved = true; 
    char first = spelplan[0][y]; 
    for (int x = 0; x < spelplan[y].length; ++x) { 
     if (spelplan[x][y] == ' ' || first != spelplan[x][y]) { 
      // Om en kolumn inte är fylld så är raden inte klar 
      // Om en kolumn i raden är fylld med olika tecken så är den inte klar 
      solved = false; 
     } 

    if (solved == true) { 
     return true; 
    } 
} 
} 
return false; 
} 

수평

public static boolean KollaVinst(char[][] spelplan) { 

return isHorizontalSolved(spelplan) || isVerticalSolved(spelplan) || isDiagonalSolved(spelplan); 
} 

수평 승자를 확인하는 코드 부분 없어 종료

수직

//Kollar om vertikala är löst 
public static boolean isVerticalSolved(char[][] spelplan) { 
for (int x = 0; x < spelplan.length; ++x) { 

    boolean solved = true; 
char first = spelplan[x][0]; 
for (int y = 0; y < spelplan[x].length; ++y){ 
    if (spelplan[x][y] == ' ' || first != spelplan[x][y]){ 
     solved = false; 
    } 
} 
if (solved == true){ 
    return true; 
} 
} 
return false; 
} 

수직 끝. 왼쪽 오른쪽 오른쪽

// Kollar om digonalen är löst 
public static boolean isDiagonalSolved(char[][] spelplan) { 
// Kollar vänster till höger 
char first = spelplan[0][0]; 
boolean solved = true; 
for (int y = 0, x = 0; y < spelplan.length && x < spelplan[y].length; ++y, ++x) { 
    if (spelplan[x][y] == ' ' || first != spelplan[x][y]) { 
     //Om en plats är tom eller om det är olika tecken så är den inte klar 
     solved = false; 
    } 
} 
if (solved) { 
    return true; 
} 

대각선

대각선 왼쪽 체크 위너 코드 종료 여기서

//Kollar höger till vänster 
int topRightX = spelplan[0].length - 1; 
solved = true; 
first = spelplan[0][topRightX]; 
for (int y = 0, x = topRightX; y < spelplan.length && x >= 0; ++y, --x) { 
    if (spelplan[x][y] == ' ' || first != spelplan[x][y]) { 
     //Om en plats är tom eller om det är olika tecken så är den inte klar 
     solved = false; 
    } 
} 
return solved; 
} 

왼쪽으로

대각선 오른쪽을 종료한다.

public static void main(String[] args) { 
char spelplan[][] = new char [4][4]; 
char spelare; 
int rad=3, kolumn=3, i=0; 
for(int x=1; x<4; x++){ 
    for (int y=1; y<4; y++){ 
    spelplan[x][y]=' '; 
    } 
} 


System.out.println("-------"); 
System.out.println("| | | |"); 
System.out.println("|-+-+-|"); 
System.out.println("| | | |"); 
System.out.println("|-+-+-|"); 
System.out.println("| | | |"); 
System.out.println("-------"); 

    for (i=0; i<=9; i++){ 
    if (KollaVinst(spelplan) == false){ 
    break; 
} 
    else 

    CheckMove(spelplan, rad, kolumn); 

    for (i=0; i<9; i++){ 
    if (i%2==0){ 
    spelare='X'; 
    } 
    else 
    spelare='O'; 

    System.out.println("Spelare 1 skriv vilken rad: 1-3"); 
    int x = new Scanner(System.in).nextInt(); 

    System.out.println("Spelare 1 skriv vilken kolumn: 1-3"); 
    int y = new Scanner(System.in).nextInt(); 

    if (CheckMove(spelplan, x, y) == true){ 
    MakeMove(spelplan, spelare, x, y); 


} 
System.out.println(" "); 
SkrivUtSpelplan(spelplan); 
} 
} 
} 
} 
+0

알고리즘의 일부분이 적절하게 작동하지 않는다고 가정 할 수 있습니까? 그것은 우리가 조사해야 할 범위를 좁히는 데 도움이 될 것입니다. –

+0

"wincode"란 누군가 승자인지 확인하는 것을 의미합니까? – rzysia

+0

나는 이것이 수평 또는 수직 또는 둘 다라고 생각한다. – Marc

답변

1

두 가지 (일반적으로)해야 할 일 :

1) 메인 클래스를 변경 - 먼저 이동하기 전에 마지막으로 이동 한 후 승자 ... 그래서해야을위한 게임은 다음과 같습니다 확인됩니다

for (i = 0; i < 9; i++) { 
     if (KollaVinst(spelplan)) { 
      break; 
     } else { 
      CheckMove(spelplan, rad, kolumn); 
     } 

     if (i % 2 == 0) { 
      spelare = 'X'; 
     } else { 
      spelare = 'O'; 
     } 

     System.out.println("Spelare 1 skriv vilken rad: 1-3"); 
     int x = new Scanner(System.in).nextInt(); 

     System.out.println("Spelare 1 skriv vilken kolumn: 1-3"); 
     int y = new Scanner(System.in).nextInt(); 

     if (CheckMove(spelplan, x, y) == true) { 
      MakeMove(spelplan, spelare, x, y); 

     } 
     System.out.println(" "); 
     SkrivUtSpelplan(spelplan); 
    } 

2) 승자 확인 - 귀하의 기능을 업그레이드했습니다 (아래 참조). 필드 검사를 넘어서 다른 필드가 2 개 밖에 없으므로 모든 항목 (특히 fileds [0] [x])을 반복 할 필요가 없습니다. 그래서 수평 및 수직 검사에서는 충분합니다 이 두 가능성을 모두 확인할 수 있습니다.) 대각선을 확인하는 데 필요하지 않습니다. 게임에서 이길 수있는 유일한 두 가지 가능성입니다.

public static boolean isHorizontalSolved(char[][] spelplan) { 
     boolean solved = false; 
     for (int y = 1; y < spelplan.length; y++) { 
      if ((spelplan[y][1] == spelplan[y][2]) && (spelplan[y][1] == spelplan[y][3]) && (spelplan[y][1] != ' ')) { 
       solved = true; 
      } 
     } 
     return solved; 
    } 

    public static boolean isVerticalSolved(char[][] spelplan) { 
     boolean solved = false; 
     for (int y = 1; y < spelplan.length; y++) { 
      if ((spelplan[1][y] == spelplan[2][y]) && (spelplan[1][y] == spelplan[3][y]) && (spelplan[1][y] != ' ')) { 
       solved = true; 
      } 
     } 
     return solved; 
    } 

    public static boolean isDiagonalSolved(char[][] spelplan) { 
     boolean solved = false; 
     if ((spelplan[1][1] == spelplan[2][2]) && (spelplan[1][1] == spelplan[3][3]) && (spelplan[1][1] != ' ')) { 
       solved = true; 
      } 

     if ((spelplan[1][3] == spelplan[2][2]) && (spelplan[1][3] == spelplan[3][1]) && (spelplan[1][3] != ' ')) { 
       solved = true; 
      } 

     return solved; 
    } 
0

isHorizontalSolved에는 실수가 있습니다. 루프 닫는 브라켓 은 다음과 같은 경우 앞에 배치해야합니다 당신이 그것을했다

//Kollar om horisontella är löst 
public static boolean isHorizontalSolved(char[][] spelplan) { 
    for (int y = 0; y < spelplan.length; ++y) { 
     //För varje rad kolla om varje kolumn är fylld 
     boolean solved = true; 
     char first = spelplan[0][y]; 
     for (int x = 0; x < spelplan[y].length; ++x) { 
      if (spelplan[x][y] == ' ' || first != spelplan[x][y]) { 
       // Om en kolumn inte är fylld så är raden inte klar 
       // Om en kolumn i raden är fylld med olika tecken så är den inte klar 
       solved = false; 
      } 
     } 

     if (solved == true) { 
      return true; 
     } 
    } 
    return false; 
} 

방법, 루프는 첫 번째 반복에서 진정한와 함께 종료됩니다.

+0

그리고'solve; = false; 뒤에'break;'를 추가 할 수 있습니다. 또한'if (solveed) {'를 쓰는 것이 더 좋은 스타일이다. –