Grafika żółwia

Grafika żółwia
VI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 43
0

Mam pytanie, mam do wykonania zadanie, z wykorzystaniem tablicy dwuwymiarowej 20 na 20.

Mam wpisując odpowiednie polecenia przypisywać elementy do tablicy 1 lub 0 aby później wyświetlić je w postaci wzoru, 1 oznacza gwiazdkę a 0 puste pole czyli spacje.

  1. Pióro w górę czyli dodaje 1
  2. Pióro w dół czyli zostaje przy 0
  3. Skręt w prawo
  4. Skręt w lewo
  5. Ruch w przód o 10 spacji lub (można zastąpić inna liczba spacji)
  6. Wyświetlenie tablicy 20 na 20
  7. koniec

Jak mogę w prosty sposób dodawać te elementy, głownie chodzi mi o skręt w prawo i skręt w lewo, aby program po wykonaniu polecenia skrętu w lewo, wykonał poprawnie skręt w prawo. Udało mi się to zrobić przez przypisywanie zmiennym na bieżąco odpowiednich wartości. Ale wydaje mi sie ze zrobiłem straszny syf w kodzie przez to

Kopiuj
public static void turttleRight() {

        if(right == 5) {

            right = 1;

        } else if (right == 2) {

            left = 0;
        }


        if (right == 1) {

            leftRight--;

        } else if (right == 2) {

            front++;

        } else if (right == 3) {

            leftRight++;

        } else if (right == 4) {

            front--;
        }

Analogicznie metoda do wykonania skrętu w lewo.

Kopiuj
 public static void turttleLeft() {

        if (left == 5) {

            left = 1;

        } else if (left == 1) {

            right =+ 1;
        }


        switch (left) {

            case 1:
                leftRight++;
                break;
            case 2:
                front--;
                break;
            case 3:
                leftRight--;
                break;
            case 4:
                front++;

        }


    }

Jak mógłbym uprościć cały ten mechanizm?.

Charles_Ray
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1912
1

Najpierw podaj prawdziwą treść zadania, bo mam wrażenie, że przedstawiłeś swoją interpretacje. Podaj przykładowe dane wejściowe i oczekiwany rezultat. Wtedy będziemy wiedzieli, jaki problem chcesz rozwiązać. Odnośnie kodu - tak, to straszny syf :)

VI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 43
0

image42A286B8-4799-4310-9B4C-AE73C4400488.jpeg46AF22EE-D033-43EC-BE20-4193FDC9150A.jpeg

Mateusz Golda
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1
1

Możesz stworzyć zmienną directions, która trzyma 4 wektory - [0, 1], [1, 0], [0, -1], [-1, 0], gdzie pierwszy element to przesunięcia w y, a drugi w x. Do tego zmienna currentDirection i jak dostajesz skręt w prawo to currentDirection przyjmuje kolejną wartość z directions, jak w lewo poprzednią. Jak masz się ruszyć do przodu o x, to x razy przesuwasz się o wektor z currentDirection.

Charles_Ray
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1912
0

Napisz sobie funkcje pomocnicza, która zwróci współrzędne następnego pola:

Kopiuj
Field nextField(
  Field currentPosition, 
  Direction direction);

gdzie Field to po prostu współrzędne (x, y). Pomysl, w jaki sposób zaimplementować Direction - mogą być 4 typy.

Dzięki temu, gdy wczytasz „5 N” będziesz mógł wywołać ja N razy i wykonać akcje na polu.

Pytanie pomocnicze: jakie dane (stan aplikacji) potrzebujesz utrzymywać, aby zrealizować wymagania?

VI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 43
0

Czy do współrzędnych muszę stworzyć nowa tablice?

Charles_Ray
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1912
0

Możesz np. mieć coś takiego:

Kopiuj
Direction[] directions = {
  new Direction(0, -1), new Direction(-1, 0), new Direction(0, 1), new Direction(1, 0)
};

To jest jakby wskazówka zegara (wektor o długości 1). Wtedy przy skręcie w prawo (clockwise) przesuwasz index +1, a dla skrętu w lewo (anticlockwise) o -1:

Kopiuj
int rotateLeft(int currentDirection) {
  return currentDirection + 1 % 4;
}

W klasie Field możesz mieć wtedy po prostu coś takiego:

Kopiuj
class Field {
  //...
  Field nextField(Direction d) {
    return new Field(x + d.getX(), y + d.getY());
  }
}
LukeJL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 8488
0
Virus_ napisał(a):

Czy do współrzędnych muszę stworzyć nowa tablice?

Nic nie musisz.
W programowaniu można zwykle rozwiązać daną rzecz na wiele różnych sposobów.
Równie dobrze skręt w lewo możesz zdefiniować jako przypisanie:

Kopiuj
x = -y
y = x

a skręt w prawo

Kopiuj
x = y
y = -x

(zakładam, że oś y idzie do góry, co nie musi być prawdą)

Wtedy nie będzie ci potrzebna tablica 4 kierunków, bo możesz sobie dynamicznie to obliczać.

VI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 43
0

Chyba jestem za głupi. Czy współrzędnymi są indeksy tablicy? Gdzie x to indeks kolumny a y to indeks wiersza?

Charles_Ray
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1912
0
Virus_ napisał(a):

Chyba jestem za głupi. Czy współrzędnymi są indeksy tablicy? Gdzie x to indeks kolumny a y to indeks wiersza?

Tak naprawdę whatever, możesz tak przyjąć. Indeksacja 2 wymiarowej tablicy będzie trochę rożna od układu współrzędnych, ale nie ma to znaczenia w tym zadaniu.

VI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 43
0

Dzięki za pomoc, ale próbuje zrozumieć jak mam przełożyć współrzędne na tablice, (0, -1) (-1, 0) , (0, 1) (1, 0), pierwsze dwa to y a kolejne to x?. Potrzebuje jakiegoś łopatologicznego wytłumaczenia.

Powiedzmy że poruszam się do przodu z 0,0 na 0,5 teraz chce skręcić w prawo czyli zwiększam indeks wiersza i jestem na pozycji 1,5 teraz chce znów skręcić w prawo czyli zmniejszam indeks kolumny i jestem na 1,4 teraz znów chce skręcić w prawo i jestem na 0,4, to czym jest 0 i - 1 , - 1 to minus jeden indeks?

Charles_Ray
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1912
0

Albo skręcasz, albo się poruszasz. Skręt to tylko zmiana wektora przesunięcia.

(0, 1) oznacza (x: 0, y: +1), czyli w kolejnym ruchu będziesz przesuwać się po osi OY o 1 w tym przypadku. Dla (x: -1, y: 0) przykładowo ruch będzie w lewo, itd

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.