2014-01-19 4 views
0

Я работаю над небольшой игрой, где пользователь должен выбрать 1 из 5 символов (S, M, A, R или T) и вставить его в 5x5 2d-массив. Если пользователь вводит неверный номер или символ, программа говорит, что это недопустимый символ и не вставляет его. Это работало со всеми, кроме символов, где, если вы введете правильный символ, он по-прежнему отображается как недопустимый символ.Уникальный набор символов в массиве

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

Я понимаю, что что-то делать с моим, если заявление, но я не уверен, что изменить, если заявление для того, чтобы получить желаемые результаты.

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. 

Другой вопрос, если кто-нибудь может мне помочь в создании торцевую заявление, в котором пользователь получает 2d-массив завершен, и он говорит Congrats, вы его получили. Для этого пользователь должен иметь 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') 

Edit:

Чтобы проверить граничное условие, вы должны будете перебирать каждый столбец и каждую строку, чтобы увидеть, если есть какие-либо повторяющиеся символы. Я предполагаю, что вам не нужно проверять диагонали.

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

Смежные вопросы