Sortowanie tablicy dwuwymiarowej

0

Hej.
Potrzebuję waszej pomocy. Mam do wykonania pracę , która brzmi następująco.

Przygotuj program tworzący kwadratową tablicę o rozmiarze 23×23, a następnie wypełnij wszystkie jej elementy wartością 0. W kolejnym kroku rozmieść w losowych miejscach wartości 1, tak aby zajmowały przynajmniej 10% powierzchni planszy. Wreszcie w losowym miejscu umieść wartość 2. Przyjmij że wartość 2 reprezentuje mysz, która musi zjeść cały ser (reprezentowany przez wartość 1) w pomieszczeniu (reprezentowanym przez tablicę). Mysz może poruszać się w dowolnym kierunku (w górę, w dół, w lewo, w prawo oraz po skosach), zostawiając za sobą ślad (wartość 3 w tablicy) w dowolnym miejscu w którym była.
Przygotuj dla myszy trzy strategie poruszania się po pomieszczeniu, prowadzące do zjedzenia całego sera w pomieszczeniu:
• w pierwszej mysz porusza się na "ślepo" nie wiedząc gdzie jest ser tak długo aż nie zje całego sera w pokoju,
• w drugiej mysz ma tylko kierunek w którym znajduje się najbliższy kawałek sera,
• w trzecim mysz wie dokładnie gdzie znajduje się ser. Zadbaj aby program przy każdym "kroku"myszy wyświetlał na ekran zawartość całej tablicy.

Udało mi się zrobić pierwszą część bez większego problemu. Natomiast zatrzymałem się przy tym jak mysz ma się poruszać. Wiem, że należy to wykonać poprzez sortowanie tablicy dwuwymiarowej w pętli. Natomiast z tym nie idzie mi najlepiej i wykonałem sortowanie, ale na konkretną pozycję. A potrzebuję wiedzieć jak mogę przemiszczać ją w stronę właśnie (góra, dół, lewo, prawo i na skosy) tak, by pokryła całą tablicę. Tutaj jest mój kod: https://ghostbin.com/paste/8ryuk

Byłbym wdzięczny za pomoc.

0

Rozbij kod na funkcje, z wyświetlania tablicy będziesz korzystać wielokrotnie, więc lepiej napisz jedną funkcje, która będzie się tym zajmować.
Powiedz mi co to znaczy, że mysz wie dokładnie gdzie znajduje się ser ? Czyli jak ma się zachowywać ?

0

Jeżeli chodzi dokładnie o strategie. Trzeba przyjąć, że jest ona ślepa.

  1. W tej strategii porusza się po całym pokoju, aż zje cały ser
  2. Tutaj załóżmy, że mysz kieruje się węchem i porusza się jedno pole wyczuwa skąd dochodzi zapach sera i kieruje się w tym kierunku
  3. Mysz ma powiedzmy mapę gdzie jest ser i dokładnie wie gdzie należy iść
    Czym różni się 2 od 3?
    W strategii 2 poruszamy się na podstawie najbliższego sera, którego czujemy. Co może się okazać, że mysz będzie chodziła bardzo losowo, po skrajnych miejscach
    W strategii 3. Wiemy dokładnie gdzie jest ser i mysz musi iść do najbliższego sera, a po zjedzeniu od razu na podstawie (powiedzmy) mapy rusza do kolejnego kawałka.

Nie muszę używać koniecznie sortowania tablicy dwuwymiarowej, ale wydaje mi się, że jest to najlepsza tutaj opcja sterowania myszą.
I dzięki masz rację z tym wyświetlaniem tablicy.

0

jeśli chodzi o pierwszą strategie to widzę to tak


public FirstStrategy(int[][] tab, int wiersz, int kolumna) {
       Random random = new Random();
       while(countHowManyChesseIsOnMap() > 0) { // jeśli jest ser na mapie to wykonujemy pętle

           switch (random.nextInt(5) + 1) {
               case 1:
                   if(up(tab, wiersz, kolumna)) { // każda metoda zwraca true  jeśli jest możliwość przejścia
                       wiersz = wiersz -1;     // wtedy aktualizujemy pozycie myszy
                   }
                   break;
               case 2:
                   if(down(tab, wiersz, kolumna)) {
                       wiersz = wiersz +1;
                   }
                   break;
               case 3:
                   if(right(tab, wiersz, kolumna)) {
                       kolumna = wiersz +1;
                   }
                   break;
               case 4:
                   if(left(tab, wiersz, kolumna)) {
                       wiersz = wiersz -1;
                   }
                   break;
               // tutaj możesz dodać funkcję drukującą dla pokazania efektu     

           }

       }
   }

jest to całkowicie losowe wybierania pola. Poniżej dodaje Ci przykład jak powinna wyglądać jedna z metod wewnątrz switcha :

 private boolean up(int[][] tab, int wiersz, int kolumna) {

        if( wiersz == 0) {
            return false;
        }
        else {
            tab[wiersz][kolumna] = 3; // tam gdzie znajduje się  myszy zmieniamy na 3
            tab[wiersz - 1][kolumna] = 2; // stawiamy mysz na nowe pole
            return true;
        }
    }

Uwaga możliwe że gdzieś strzeliłem gapę. Nie testowałem tego więc lepiej to sprawdź dwa razy.

0

Okey. Dzięki za pomoc. Ale potrzebuję jeszcze pomocy w jednej rzeczy. A mianowicie chciałbym zastosować to o czym wspomniałeś i cały ten projekt zrobić na zasadzie metod. Jednak nie do końca jeszcze to rozumiem. I mam problem

public class test {
    public static void main(String[] args) {


        int[][] tab = new int[23][23];

        PlanszaPusta();
    }


    private static void PlanszaPusta(int tab[][]) {

        int pustePole = 0;

        for (int i = 0; i < tab.length; i++) {
            for (int j = 0; j < tab[i].length; j++) {
                tab[i][j] = pustePole;
            }

        }
    }
}


Nie wiem co robię źle, ale nie chce mi powyższy się nie kompiluje.

0

nie przekazałeś do funkcji argumentu kolego :)

java
  PlanszaPusta(tab);

Taka ciekawostka na przyszłość w javie stworzona tablica zawsze jest wypełniona 0; no chyba że jest to tablica obiektów to wtedy jest null;

0

Wielkie dzięki! xddd Co do reszty odezwę się jak trochę już pozmieniam ten kod. Myślę, że jutro.
A co do ciekawostki, to wiem o tym właśnie, że tak jest. Tylko wiesz. W zadaniu jest napisane, że muszę nadać elementom wartość 0 i w sumie tak się też zastanawiałem, ale dla świętego spokoju już dam.

0

Udało mi się poprawić dzięki Twoim radom kod i wygląda rzeczywiście dużo lepiej. Jednak zatrzymałem się teraz przy metodzie FirstStrategy. Przy wywołaniu jej chce, żebym wpisał jakieś argumenty. Rozumiem, że chodzi o to gdzie aktualnie znajduje się mysz. Nie jestem tego pewien, dlatego wolę zapytać. Załączam aktualną wersje kodu. https://ghostbin.com/paste/bqxj8

0

Dobra, zanim dojdę do tego jeszcze jak to zrobić. Mam pytanie, gdyż nie za bardzo wiem co znacza w switchu to: switch (random.nextInt(5) + 1) Nie rozumiem, czemu akurat takie tam są wartości wpisane

0

Zatrzymałem się w tym miejscu i po prostu nie wiem jak wpisać argumenty do metody FirstStrategy. Napisałem metodę, która wskazuje położenie myszy, ale w jaki sposób mogę wstawić je do tej metody. Mam wrażenie, że próbowałem już wszystkiego i po prostu bardzie jjeszcze się gubię, niż sobie pomagam

Wyszukanie Pozycji myszy wygląda tak:

private static void PozycjaMyszyStart(int tab[][]) {

       int wierszPozycjaMyszy = 0;
       int kolumnaPozycjaMyszy = 0;
       int mysz = tab[wierszPozycjaMyszy][kolumnaPozycjaMyszy];

        for (int i = 0; i < tab.length; i++) {
            for (int j = 0; j < tab[i].length; j++) {
                if (tab[i][j] == 2) {
                    wierszPozycjaMyszy = i;
                    kolumnaPozycjaMyszy = j;
                    mysz = tab[wierszPozycjaMyszy][kolumnaPozycjaMyszy];
                }
            }

        }
        System.out.println("Mysz: " + mysz + " znajduje sie w wierszu: " + wierszPozycjaMyszy + " oraz kolumnie: " + kolumnaPozycjaMyszy);
        System.out.println();

    }

zaś cała metoda FirstStrategy tak. Załączam też "up, right, left, down" metody>

 private static boolean up(int[][] tab, int wiersz, int kolumna) {
        if (wiersz == 0) {
            return false;
        } else {
            tab[wiersz][kolumna] = 3; // tam gdzie znajduje się  myszy zmieniamy na 3
            tab[wiersz - 1][kolumna] = 2; // stawiamy mysz na nowe pole
            return true;
        }
    }

    private static boolean down(int[][] tab, int wiersz, int kolumna) {
        if (wiersz == 0) {
            return false;
        } else {
            tab[wiersz][kolumna] = 3;
            tab[wiersz + 1][kolumna] = 2;
            return true;
        }

    }

    private static boolean right(int[][] tab, int wiersz, int kolumna) {
        if (wiersz == 0) {
            return false;
        } else {
            tab[wiersz][kolumna] = 3;
            tab[wiersz][kolumna + 1] = 2;
            return true;
        }
    }

    private static boolean left(int[][] tab, int wiersz, int kolumna) {
        if (wiersz == 0) {
            return false;
        } else {
            tab[wiersz][kolumna] = 3;
            tab[wiersz][kolumna - 1] = 2;
            return true;
        }
    }


    public static void FirstStrategy(int[][] tab, int wiersz, int kolumna) {
        Random random = new Random();


        while (countHowManyChesseIsOnMap(tab) > 0) { // jeśli jest ser na mapie to wykonujemy pętle

            switch (random.nextInt(5) +1) {

                case 1:
                    if (up(tab, wiersz, kolumna)) { // każda metoda zwraca true  jeśli jest możliwość przejścia
                        wiersz = wiersz - 1;     // wtedy aktualizujemy pozycie myszy
                    }

                    break;
                 case 2:
                    if (down(tab, wiersz, kolumna)) {
                        wiersz = wiersz + 1;
                    }
                    break;
                case 3:
                    if (right(tab, wiersz, kolumna)) {
                        kolumna = wiersz + 1;
                    }
                    break;
                case 4:
                    if (left(tab, wiersz, kolumna)) {
                        kolumna = wiersz - 1;
                    }
                    break;


            }

        }

    }

1

Skoro w metodzie PozycjaMyszyStart() uzyskujesz pozycję myszy, to to zwróć zamiast printować. Zmień typ metody z void na Listę (np 0 indeks to wiersz, a 1 to kolumna) lub na mapę, wrzucająć coś w stylu klucz - wiersz, wartość - tutaj to co znalazłeś.

Albo stwórz nowy obiekt wskazujący pozycję (przyjmujący wiersz i kolumne w konstruktorze) i go zwracaj ze swojej metody ;)

0

Ogółem jako, że nie za bardzo jeszcze potrafię takie rzeczy wykonywać, po prostu wrzuciłem pozycje myszy bez motody do maina. I normalnie w w firsStrategy(tab, PozycjaMyszyStart, KolumnaMyszyStart) da się wpisać i kompiluje. Natomiast. Problem jest teraz taki, zę pętla nigdy się nie kończy i gdzieś muszę mieć błąd w up,right,left,down

0

Ogółem jest tak, że jak się kogoś prosi o pomoc/radę to wypadałoby słuchać ;)
Czego nie potrafisz zrobić? Zmienić typu metody z void na inny? Napisać nowej klasy Pozycja, z jednym konstruktorem, przyjmującym 2 argumenty, int x, int y jako pozycja myszy?

Jeśli nie wiesz gdzie jest błąd to poczytaj jak włączyć i posługiwać sie debuggerem w twoim IDE. Dzięki temu zobaczysz co Twój kod robi krok po kroku i łatwiej będzie Ci znaleźć błąd.

0

Problem mam taki, żę przy obecnym kodzie potrafi walnąć w ścianę i wywalić pętle, albo wracać się na to samo miejsce, gdzie już jest 3. A czasami jeszcze stać w miejscu i nic nie robić

 private static boolean up1(int[][] tab, int wiersz, int kolumna) {

        if (wiersz == 3) {

            return false;
        }
        else{
            tab[wiersz][kolumna] = 3; // tam gdzie znajduje się  myszy zmieniamy na 3
            tab[wiersz - 1][kolumna] = 2; // stawiamy mysz na nowe pole
            return true;
        }
    }

    private static boolean down(int[][] tab, int wiersz, int kolumna) {
        if (wiersz == 3) {
            return false;
        } else {
            tab[wiersz][kolumna] = 3;
            tab[wiersz + 1][kolumna] = 2;
            return true;
        }

    }

    private static boolean right(int[][] tab, int wiersz, int kolumna) {
        if (wiersz == 3) {
            return false;
        } else {
            tab[wiersz][kolumna] = 3;
            tab[wiersz][kolumna + 1] = 2;
            return true;
        }
    }

    private static boolean left(int[][] tab, int wiersz, int kolumna) {
        if (wiersz == 3) {
          return false;
        } else {
            tab[wiersz][kolumna] = 3;
            tab[wiersz][kolumna - 1] = 2;
            return true;
        }
    }


    public static void FirstStrategy(int[][] tab, int wiersz, int kolumna) {
        Random random = new Random();


        while (countHowManyChesseIsOnMap(tab) > 0) { // jeśli jest ser na mapie to wykonujemy pętle

            switch (random.nextInt(5)) {

                case 1:
                    if (up1(tab, wiersz, kolumna)) { // każda metoda zwraca true  jeśli jest możliwość przejścia
                        wiersz = wiersz - 1;     // wtedy aktualizujemy pozycie myszy
                    }

                    break;
                case 2:
                    if (down(tab, wiersz, kolumna)) {
                        wiersz = wiersz + 1;
                    }
                    break;
               case 3:
                    if (right(tab, wiersz, kolumna)) {
                        kolumna = kolumna + 1;
                    }
                    break;
                case 4:
                    if (left(tab, wiersz, kolumna)) {
                        kolumna = kolumna - 1;
                    }
                    break;


            }
            System.out.println();
            System.out.println();
            wyswietlenie(tab);
        }



0

Okey, ale w takim razie został mi tylko jeden problem. Program działa prawidłowo, ale w momencie zetknięcia się na przykład z indeksem 0, gdyż wyznaczyłem:

 private static boolean up1(int[][] tab, int wiersz, int kolumna) {

        if (wiersz == 0) {

            return false;
        }
        else{
            tab[wiersz][kolumna] = 3; // tam gdzie znajduje się  myszy zmieniamy na 3
            tab[wiersz - 1][kolumna] = 2; // stawiamy mysz na nowe pole
            return true;
        }
    }

to mysz program przestaje cokolwiek wyświetlać i wchodzi na tak jakby "else". Przykładowo w tym case.

case 1:
                    if (up1(tab, wiersz, kolumna)) { // każda metoda zwraca true  jeśli jest możliwość przejścia
                        wiersz = wiersz - 1;     // wtedy aktualizujemy pozycie myszy
                    }

                    break;

Gdy przykładowo wstawię tutaj else i załóżmy w jego blokach "ttt", to bedzie wyświetlał takie "ttt" w nieskończoność, gdy wejdzie na indeks 0. Co należy zrobić, żeby program w takim wypadku przestał patrzeć na ten case tylko przeszedł do następnego?

0

Dość ciekawe zadanie, więc stwierdziłem, że napiszę sobie coś podobnego. Możesz sobie zobaczyć mój kod: https://github.com/kkojot/cheese-eater/. Niestety, jest to raczej robocza wersja, jak będę miał czas to trochę uporządkuję.
Generalnie napisałem dwie myszki. Pierwsza czesze tablicę od góry do dołu, druga wędruje do najbliższego sera.
Nie miałem ochoty bawić się w tablice dwuwymiarowe i modyfikowanie ich podwójnymi pętlami jw. Napisałem klasę Board, która posiada listę obiektów Point, które z kolei niosą informacje o położeniu [x, y] oraz czy w danym punkcie znajduje się ser i czy odwiedziła go już myszka. Cała zabawa polega na podmienianiu odpowiednich obiektów Point w liście i printowaniu klasy Board. Nie wiem czy to jest dla Ciebie pomocne, ale jeśli chciałbyś rozwiązać to w ten sposób, to możesz śmiało podejrzeć mój kod.

0

poza tym metoda down, left, right jest źle napisana zastanów się co powinno być w if

0

Odkrylem. Dzieki wielkie! Totalnie nie pomyslalem o takim bledzie.

Temat mozna zamknac

1 użytkowników online, w tym zalogowanych: 0, gości: 1