2014-01-19 35 views
0

我正在開發一個小遊戲,用戶必須選擇5個字符中的一個(S,M,A,R或T)並將其插入5x5二維數組中。如果用戶輸入一個無效的數字或字符,程序會說這是一個無效的字符,並且不會插入它。除了輸入正確字符的字符之外,它還可以處理所有字符,但仍然顯示爲無效字符。數組中的唯一字符集

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. 

另一個問題,如果有人能夠幫助在用戶獲取二維數組完成,它說恭喜,你說對了我創造的最終聲明。爲此,用戶必須使S M A R和T在任意方向上以5個字符的行對齊。

感謝您花時間閱讀本文!

+0

'創建一個結束語句,用戶獲得2d數組完成,它說祝賀,你明白了。'你不能只計算用戶輸入有效字符的次數嗎? –

回答

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; 
} 

我在這裏使用了一個hashset。還有其他的解決方案,你只需要一些檢查沒有字符重複的方法。我把它留給你執行checkColumns

+0

謝謝!我知道我錯過了一些東西。你對如何計算遊戲結束語有什麼建議嗎? – Sythe

+0

當然,用戶只需要用有效字符填充2D數組,還是需要滿足一些額外的條件? –

+0

本質上,用戶必須以某種方式解決這個難題,S M A R和T可以在任何給定的5字符行中找到,但不必按特定順序。如果我記得,我相信我必須將每個5字符行轉換爲int來獲取其ASCII值,然後使用if語句。但我不確定如何做這樣的事情。 – Sythe