Как отсортировать целые числа из a [] случайным образом по t [] [], чтобы все целые, образующие a [], были рядом друг с другом? - PullRequest
0 голосов
/ 24 июня 2018

Моя проблема немного сложна, чтобы описать словами, поэтому я начну с того, что у меня есть.Следующий код перемещает все 1 с одного [] raomly в t [] [] - каждый 1 перезаписывает найденное 0:

import java.util.Arrays;
import java.util.Random;

public class test {

    public static void main (String[] args) {


        Random r = new Random();

        int a[]  = {1,1,1,1,1,1,1,1,1,1};

        int t[][] = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //12 * 12, to avoid
                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},      //out-of-bounds ex;
                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},     //first and last 
                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},     //lines and rows  
                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},     //always stay 0.
                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};


        int line = r.nextInt(10)+1;  //1 - 11 to avoid out of bounds ex
        int column = r.nextInt(10)+1;
        t[line][column] = a[0]; //set first 1 in t[]

        //move line and row away from the first one
        //to avoid out-of-bounds ex in while loop below
        //(I have to think about if this is really necessary,
        //but let's not focus on this ;)
        if (line <=5) {
            line = (line+2);
        }
        else {
            line =(line-2);
        }

        if (column <=5) {
            column = (column+2);
        } else {
            column =(column-2);
        }

        //begin moving 1s
        for(int i = 1; i < a.length; i++) { //i=1, because first 1 is 
                                            //already set

            //the field has to be a new one, so it does not overwrite
            //an existing 1.

            while(   (t[line][column]) !=0) { 
                line = r.nextInt(10)+1; 
                column = r.nextInt(10)+1; 

            }
            t[line][column] = a[i];

        }

        for (int j = 0; j < t.length; j++) {
            System.out.println(Arrays.toString(t[j]));
        }
    }
}

Но теперь я хочу быть рядом друг с другом, например, какэто:

        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},      
        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0},
        {0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

Моя цель - чтобы они выглядели как маленький лабиринт (для мини-игры-лабиринта-исследователя. Мне все равно, если результат покажется мне хорошим лабиринтом, но яхочу понять что происходит не так).Я попытался изменить цикл while следующим образом:

//while the int at the field is not zero
        while(   (t[line][column]) !=0 &&

                //and all neighbours are 0,         
                ((t[line+1][column]) == 0 && //above
                (t[line-1][column]) == 0 &&  //below
                (t[line][column-1]) == 0 &&  //left
                (t[line][column+1]) == 0))  //right

        { 
            //generate new random field.
            line = r.nextInt(10)+1; 
            column = r.nextInt(10)+1; 

        }

Это не работает, и я не уверен, почему.Идея имеет смысл для меня, и я не знаю, где код не работает.Кроме того, я новичок, так что, хотя могут быть гораздо лучшие способы сделать что-то подобное, я был бы признателен за подробную информацию о причинах, по которым мой код работает неправильно: -)

Большое спасибо!

1 Ответ

0 голосов
/ 25 июня 2018

ваш код с изменениями

import java.util.Arrays;
import java.util.Random;

public class Game {
    private final static int DIMENSTION = 10;

    public static void main(String[] args) {
        final Random r = new Random();
        final int field[][] = new int[10][10];

        for(int line=0; line < DIMENSTION; line ++) {
            for(int column=0; column < DIMENSTION; column ++) {
                field[line][column] = 0;
            }
        }

        //begin moving 1s
        for(int i = 0; i < 8; i++) {
            int line = r.nextInt(DIMENSTION);
            int column = r.nextInt(DIMENSTION);

            while(field[line][column] == 0) {
                field[line][column] = 1;

                int direction = r.nextInt(4);
                switch (direction){
                    case 0:
                        if (line < DIMENSTION -1) {
                            line ++;
                        }
                        break;
                    case 1:
                        if (line >= 1) {
                            line --;
                        }
                        break;
                    case 2:
                        if (column >= 1) {
                            column --;
                        }
                        break;
                    case 3:
                        if (column < DIMENSTION - 1) {
                            column ++;
                        }
                        break;
                    default:
                        throw new UnsupportedOperationException("Can move wrong direction " + direction);
                }
            }
        }

        for (int j = 0; j < field.length; j++) {
            System.out.println(Arrays.toString(field[j]));
        }
    }

}

результат

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 1, 1, 0, 0, 0, 0, 0, 0]
[0, 0, 1, 1, 1, 1, 1, 0, 0, 0]
[0, 0, 0, 1, 1, 0, 1, 0, 0, 0]
[0, 0, 0, 1, 1, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 1, 0, 0, 1, 1, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
[0, 0, 0, 0, 0, 0, 1, 1, 1, 1]
[0, 1, 1, 1, 1, 0, 1, 0, 0, 0]
[0, 1, 1, 0, 0, 0, 0, 0, 0, 0]

И не используйте больший массив, чтобы избежать выхода за пределы ex

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...