Професионална програма
Loading...
+ Нов въпрос
AnnaIvanova11 avatar AnnaIvanova11 19 Точки

10. Radioactive Mutant Vampire Bunnies, Multidimensional Arrays - Exercises,JAVA Advanced

Здравейте,

Моля някой да ми погледне кода, трудно ми е да разбера задачата, взимам 80/100, ако ми кажете къде бъркам ще е супер!

Благодаря предварително!

Код: https://pastebin.com/cWiYk7Uv

Условие:https://pastebin.com/c3gViVut

1
Java Advanced
MartinBG avatar MartinBG 2694 Точки
Best Answer

Имаше някоко дребни разминавания между основната логика в решението Ви и условието, като основния проблем беше, че прекъсвате цикъла, преди да сте извършили всичко необходимо в него, а именно:

- преместване на зайците (може и да е първо, защото позицията на играча не се пази в playerPosition[])

- преместване на играча и проверка дали не е победил: ако да - прекъсваме играта

- записване на новите координати на играча в playerPosition[]

- проверка дали новите координати са свободни (няма значение дали заекът е бил там преди, или е дошъл в текущият ход): ако не са - играчът губи и прекъсваме играта

По този начин покриваме всички възможни условия и няма нужда да се вика още веднъж moveBunnies(matrix, queueOfPositions) извън цикъла.

Разбира се, има много валидни начини, по които да се реши задачата, но се постарах да запазя решението максимално близко да Вашето:

        while (++counter < cmdArgs.length && !isPlayerDead) {
            String command = cmdArgs[counter];

            moveBunnies(matrix, queueOfPositions);

            int playerRow = playerPosition[0];
            int playerCol = playerPosition[1];

            switch (command) {
            case "R":
                playerCol += 1;
                break;
            case "L":
                playerCol -= 1;
                break;
            case "U":
                playerRow -= 1;
                break;
            case "D":
                playerRow += 1;
                break;
            }
            
            if (!isInBounds(playerRow, playerCol, matrix)) {
                break;
            }

            playerPosition[0] = playerRow;
            playerPosition[1] = playerCol;

            if (!isCellFree(playerRow, playerCol, matrix)) {
                isPlayerDead = true;
                break;
            }
        }
        // moveBunnies(matrix, queueOfPositions); 

 

1
AnnaIvanova11 avatar AnnaIvanova11 19 Точки

Много Благодаря за бързия и изчерпателен отговор!

Ето кода за колегите, ако някой има нужда да си помогне : https://pastebin.com/jDvEpjrb

 

П.П:

// Извинявам се, но ще си позволя да сменя обращението на Ти :)

@MartinBG Нямах възможност да решавам в последни месец и определено дава негативно отражение, не бях помислила за това, че нямам нужда да проверявам отново, защото си запазвам позициите...

Бих искала да я реша, по няколко възможни начина, ако е удобно дали би дал насоки, как би подходил и какви варианти би ползвал ти?

1
26/05/2020 16:02:31
MartinBG avatar MartinBG 2694 Точки

@AnnaIvanova11 

Без използване на помощни класове и абстракция, няма кой-знае какво по-добро да се измисли от твоето решение.

Като забележка, използването на статични променливи е лоша практика, но пък опростяват текущото решение. :)

Използването на опашка за "размоножаването" на зайците е добра оптимизация на алгоритъма. yes

 

Може да се използват стриймове за някои от операциите, вместо цикли, но ползата от тях (като скорост и четимост на кода) в случая ще е спорна до минимална.

Все пак, ето няколко варианта за принтирането на матрицата:

        System.out.println(Arrays.stream(matrix)
                .map(String::new)
                .collect(Collectors.joining(System.lineSeparator())));

// Или така:
        Arrays.stream(matrix)
                .map(String::new)
                .forEach(System.out::println);


// Но пък и този вариант с нищо не отстъпва на горните:
        for (char[] chars : matrix) {
            System.out.println(new String(chars));
        }

 

За прочитането на входните данни може да се използва вариант със стрийм, но за тази задача не носи предимства, защото след прочитането им трябва веднага да се обходят за да се открият координатите на играча (и зайците):

        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in, StandardCharsets.UTF_8));
        
        char[][] matrix = reader.lines()
                .limit(Long.parseLong(reader.readLine().split("\\s+")[0])) // брой линии, които ще четем
                .map(String::toCharArray) // мапваме както ни е угодно
                .toArray(char[][]::new);  // събираме в какъвто контейнер ни трябват или направо ги обработваме

 

 

 

1
26/05/2020 18:26:40
AnnaIvanova11 avatar AnnaIvanova11 19 Точки

@MartinBG Благодаря ти! Както обикновено, много полезна информация. 

1
27/05/2020 23:53:45