Задали нам задачу, сделать игру с нахождением одинаковых карточек, наверняка все играли. Ты кликаешь на одну карточку, потом на другую и, если они совпадают, то они убираются, и так пока все поле не останется чистым. Решил сделать через двумерный массив, изначально заполнять поле нужно рандомно. Поле размером 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);
}
}
Вы никогда не попадаете в последние колонку и столбец. А подматрица 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)
.
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Виртуальный выделенный сервер (VDS) становится отличным выбором
Драстипроект по разработке веб приложения был написан 3 года назад другой командой
Что должно быть описано в maven (pomxml), при работе с сервлетами? Только начинаю изучать java EE, трудно разобраться с мавеном
Делаю одному знакомому программу (лабораторную работу) для университетаДолжен буду предоставить ему в том числе и исходники