Программа не заканчивает свою работу

135
15 мая 2019, 22:20

Задали нам задачу, сделать игру с нахождением одинаковых карточек, наверняка все играли. Ты кликаешь на одну карточку, потом на другую и, если они совпадают, то они убираются, и так пока все поле не останется чистым. Решил сделать через двумерный массив, изначально заполнять поле нужно рандомно. Поле размером 6*6. В нашей задаче вместо карт идут различные символы, так как нужно, чтобы у каждого символа была пара, то делаю в 18 шагов (36 клеток на поле всего), каждый шаг создает 2 символа в различных нулевых клетках. После 12 шага происходит что-то совершенно мне непонятное.

package Task11;
    import java.util.concurrent.ThreadLocalRandom;
    public class Game1 {
    public static void printArray(Character[][] array){
        System.out.println("  a b c d e f ");
        for (int i=0;i<6;i++){
            System.out.print(i+1+" ");
            for(int j=0;j<6;j++) {
                System.out.print(array[i][j]+" ");
            }
            System.out.println();
        }
    }
public static void randomFilling(Character[][] array) { // { # , @ , & , % }
    int remainingCouples = 18;
    int randomInt;
    for (int l=0;l<18;l++){
        randomInt=ThreadLocalRandom.current().nextInt(1,4);
        switch (randomInt) {
            case 1: // #
                fillCouple('#',array);
                break;
            case 2: // @
                fillCouple('@',array);
                break;
            case 3: // &
                fillCouple('&',array);
                break;
            case 4: // %
                fillCouple('%',array);
                break;
        }
    }
}

public static boolean isPositionFree(int i, int j, Character[][] array) {
    if (array[i][j]==null) {
        return true;
    } else return false;
}
public static void fillCouple(Character c, Character[][] array) {
    int randomI;
    int randomJ;
    boolean isOk;
    for (int k = 0; k < 2; k++) {
        do {
            randomI = ThreadLocalRandom.current().nextInt(0, 5);
            randomJ = ThreadLocalRandom.current().nextInt(0, 5);
            isOk = isPositionFree(randomI,randomJ,array);
        } while(!isOk);
        array[randomI][randomJ] = c;
    }
}

public static void main(String[] args) {
    Character[][] array = new Character[6][6];
    randomFilling(array);
    printArray(array);
}
}
Answer 1

Вы никогда не попадаете в последние колонку и столбец. А подматрица 5 х 5 заполняется за двеннадцать с половиной вызовов fillCouple, и двадцать шестой цикл do {...} while(!isOk); выполняется бесконечно.

        randomI = ThreadLocalRandom.current().nextInt(0, 6); // а не (0, 5)
        randomJ = ThreadLocalRandom.current().nextInt(0, 6); // а не (0, 5)

https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ThreadLocalRandom.html#nextInt-int-int-

bound - the upper bound (exclusive)

т.е.

не включая верхнюю границу

Но и теперь Ваш do {...} while(!isOk); для последних нескольких элементов может крутиться очень долго. Посчитайте количество пустых элементов (N_empty) и вызывайте nextInt(0, N_empty).

READ ALSO
Ошибка при компиляции веб-приложения на Grails 2.5.0

Ошибка при компиляции веб-приложения на Grails 2.5.0

Драстипроект по разработке веб приложения был написан 3 года назад другой командой

113
servlet java maven

servlet java maven

Что должно быть описано в maven (pomxml), при работе с сервлетами? Только начинаю изучать java EE, трудно разобраться с мавеном

146
Как защитить программу от копирования?

Как защитить программу от копирования?

Делаю одному знакомому программу (лабораторную работу) для университетаДолжен буду предоставить ему в том числе и исходники

136
Литература по Java Maven [дубликат]

Литература по Java Maven [дубликат]

На данный вопрос уже ответили:

131