2014-01-19 4 views
0

사용자가 5 자 (S, M, A, R 또는 T) 중 하나를 선택하고 5x5 2 차원 배열에 삽입해야하는 작은 게임에서 작업 중입니다. 사용자가 유효하지 않은 숫자 또는 문자를 입력하면 프로그램은 유효하지 않은 문자이고 삽입하지 않는다고 말합니다. 이것은 올바른 문자를 입력해도 여전히 유효하지 않은 문자로 표시되는 문자를 제외한 모든 문자와 함께 작동합니다.배열의 고유 한 문자 집합

import java.util.Scanner; 

class program{ 
    public static void main(String[] args){ 
    char[][] table = new char[5][5]; 
    table[0][0] = 'S'; 
    table[0][1] = 'M'; 
    table[0][2] = 'A'; 
    table[0][3] = 'R'; 
    table[0][4] = 'T'; 
    table[1][1] = 'T'; 
    table[1][2] = 'S'; 
    table[1][3] = 'M'; 
    table[2][2] = 'R'; 
    table[2][4] = 'S'; 
    table[3][1] = 'S'; 
    table[3][2] = 'M'; 
    table[4][2] = 'T'; 
    table[4][3] = 'S'; 

    int rows = 5; 
    int columns = 5; 


    for(int k = 0; k>=0; k++){ 
     for(int i = 0; i < rows; i++){ 
     for(int j = 0; j < columns; j++){ 
      System.out.print(table[i][j] + " "); 
     } 
     System.out.println(); 
     } 

     System.out.println("Enter a row (1-5): "); 
     Scanner scRow = new Scanner(System.in); 
     int m = scRow.nextInt(); 

     System.out.println("Enter a column (1-5): "); 
     Scanner scCol = new Scanner(System.in); 
     int n = scCol.nextInt(); 

     System.out.println("Enter a letter (S, M, A, R or T): "); 
     Scanner scChar = new Scanner(System.in); 
     char c = scChar.next().charAt(0); 

     if (m < 1 || m > 5){ 
     System.out.println("Invalid: Enter a valid row. "); 
     } 
     if (n < 1 || n > 5){ 
     System.out.println("Invalid: Enter a valid column. "); 
     } 
     if (c != 'S' || c != 'M' || c != 'A' || c != 'R' || c != 'T'){ 
     System.out.println("Invalid: Enter a valid character. "); 
     } 

     table[(m-1)][(n-1)] = c; 
    } 
    } 
} 

나는 내 if 문 함께 할 수있는 뭔가가 실현,하지만 난 의도 한 결과를 얻기 위해에 if 문을 변경해야하는지 모르는입니다.

Example output: 

S M A R T 
    T S M 
    R S 
    S M 
    T S 

Enter a row (1-5): **3** 
Enter a column (1-5): **2** 
Enter a letter (S, M, A, R or T): **A** 

Invalid: Enter a valid character. 

또 다른 문제는 사람이 사용자가 완성 된 2 차원 배열을 취득하고 축하, 당신은 그것을 가지고 말한다 곳 저 끝 문을 만드는 도울 수 있다면. 이렇게하기 위해서는 사용자는 S M A R과 T를 어떤 방향 으로든 5 문자로 정렬해야합니다.

시간을내어 읽어 주셔서 감사합니다.

+0

'사용자가 2 차원 배열을 완성하고 축하한다고 말하는 최종 문장 만들기. 알았어. '사용자가 유효한 문자를 입력 한 횟수를 계산할 수는 없습니까? –

답변

2

if 문에서 ||&&으로 변경해야합니다. 또는 !===으로 변경할 수 있습니다.

지금은 S을 입력하면 문자가 S과 같으므로 첫 번째 검사는 통과하지만 이후의 모든 검사는 실패합니다.

문자가 이고 유효 문자 집합이 (&&)이 아닌지 확인할 수 있습니다.

if(c!='S' && c!='M' && c!='A' && c!='R' && c!='T') 

또는 사용자가 입력 한 문자가 ==||를 사용하여에서 유효한 문자 집합을 것을 확인할 수 있습니다.

if(c=='S' || c=='M' || c=='A' || c=='R' || c=='T') 

편집 :

당신은 어떤 반복되는 문자가 있는지 확인하기 위해 모든 열과 모든 행을 반복해야합니다, 최종 상태를 확인합니다. 대각선을 확인할 필요가 없다고 가정합니다.

static boolean checkEndCondition(char[][] table){ 
    return checkRows(table) && checkColumns(table); 
} 

static boolean isValidCharacter(char c){ 
    return c=='S' || c=='M' || c=='A' || c=='R' || c=='T'; 
} 

static boolean checkRows(char[][] table){ 
    HashSet<Character> hashset = new HashSet<Character>(); 
    for(int y=0;y<table.length;y++){ 
     for(int x=0;x<table[0].length;x++){ 
      if(isValidCharacter(table[y][x])) 
       hashset.add(table[y][x]); 
      else 
       return false; 
     } 
     if(hashset.size()!=5) 
      return false; 
     hashset.clear(); 
    } 
    return true; 
} 

여기서 해시 세트를 사용합니다. 다른 해결책이 있습니다. 문자를 반복하지 않아도되는지 확인하는 방법이 필요합니다. 나는 당신에게 checkColumns을 구현하도록 맡깁니다.

+0

감사! 나는 뭔가를 놓친다는 것을 알았다. 게임 끝 문장을 계산하는 방법에 대한 제안이 있습니까? – Sythe

+0

물론 사용자는 유효한 문자로 2D 배열을 채워야합니까? 아니면 충족해야하는 추가 조건이 있습니까? –

+0

본질적으로, 사용자는 주어진 5-char 라인에서 S M A R과 T가 발견 될 수있는 방식으로 퍼즐을 풀어야 만하지만 특정 순서 일 필요는 없습니다. 기억한다면 각 5 문자 행을 int로 변환하여 ASCII 값을 얻은 다음 if 문을 사용해야한다고 생각합니다. 그러나 나는 그런 일을하는 방법을 확신하지 못한다. – Sythe