• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Zrozumienie kodu Javascript - Sliding Puzzle

+1 głos
629 wizyt
pytanie zadane 9 czerwca 2022 w JavaScript przez Maciek273 Początkujący (450 p.)
zamknięte 9 czerwca 2022 przez Maciek273

Witam. Nie rozumiem pewnych linii w kodzie (kod nie jest mój, jest znaleziony w internecie i staram się go zrozumieć, dlatego niektóre części są pokomentowane). Mianowicie chodzi o tę funkcję. 

function checkAdjacentCell(id) {
    var flag = -1;
    const topCellId = parseInt(id) - type,
        bottomCellId = parseInt(id) + type,
        rightCellId = parseInt(id) + 1,
        leftCellId = parseInt(id) - 1;
    adjacentId = [topCellId, bottomCellId, rightCellId, leftCellId];

    if (adjacentId[2] % type == 0) {
        adjacentId[2] = -1;
    } 
	else if (adjacentId[3] % type == type - 1) {
        adjacentId[3] = -1;
    }
	
	//nowe puste pole
    for (let i = 0; i < adjacentId.length; i++) {
        if (adjacentId[i] <= type ** 2 - 1 && adjacentId[i] >= 0) {
            var cell = document.getElementById(adjacentId[i]);
            if (cell.className == "pusta") {
                flag = adjacentId[i];
            }
        }
    }
    return flag;
}

Rozumiem, że ma ona sprawdzać sąsiednią komórkę. Nie rozumiem natomiast dlaczego wartości const mają dodawane -type, +type. -1 i +1 przy prawej i lewej komórce rozumiem, że chodzi o poruszanie się komórke o jeden w lewo lub w prawo. Nie wiem czemu jednak proszuamy się o "type" w przypadku poruszania się w górę i dół.

komentarz zamknięcia: Udalo sie uzyskac odpowiedz
komentarz 9 czerwca 2022 przez VBService Ekspert (256,600 p.)

BTW, przy tym zapisie

 for (let i=0; i<(type*type)-1; i++){
    var cell = document.getElementById(i);
    if (cell.textContent == i+1) {...

nie da się wygrać  laugh, IMO chyba powinno byc tak

for (let i=1; i<(type*type); i++) {
    var cell = document.getElementById(i);
    if (cell.textContent == i) {...

 

komentarz 9 czerwca 2022 przez Maciek273 Początkujący (450 p.)
Sprawdziłem na twoim kodzie i nie da się wygrać. Poprzedni działa prawidłowo. Tu chyba chodzi o indeksy każdej komórki, więc od 0 do 15
1
komentarz 9 czerwca 2022 przez VBService Ekspert (256,600 p.)

Sugerowałem się, że id=0 to class="pusta",
a dalej id=1 class="cell", id=2 class="cell", ... itd.  laugh

komentarz 9 czerwca 2022 przez Maciek273 Początkujący (450 p.)
Bo ta pętla chyba przechodzi od 0 do 14 i przy 14 dodaje 1 i wtedy mamy na id = 15 mamy pusta komorke. Tak przynajmniej ja to rozumiem :)

2 odpowiedzi

+2 głosów
odpowiedź 9 czerwca 2022 przez doublechess Obywatel (1,300 p.)
wybrane 9 czerwca 2022 przez Maciek273
 
Najlepsza
Góra minus typ.

Dół plus typ.

ID - 1, ID - 2, ID - 10

ID + 1, ID + 2, ID + 10
komentarz 9 czerwca 2022 przez Maciek273 Początkujący (450 p.)
No tak, ale dlaczego jest góra -type. To tak jakby góra odejmowała 4, a chodzi o zamianę komórki z jednego wiersza do drugiego, a nie o 4.
komentarz 9 czerwca 2022 przez doublechess Obywatel (1,300 p.)
HHHH
HHHH
HOHH
HHHH

-1

HHHH
HOHH
HHHH
HHHH
HHHH
HHHH
HOHH
HHHH

-2

HOHH
HHHH
HHHH
HHHH
komentarz 9 czerwca 2022 przez Maciek273 Początkujący (450 p.)
Dobra już wiem o co chodzi, po prostu to tak jakbym szedł 4 w prawo albo w lewo, ale z racji, że nie da się iść aż 4 w daną stronę, to przechodzimy do wiersza wyżej lub niżej, dzięki :)
komentarz 9 czerwca 2022 przez doublechess Obywatel (1,300 p.)
Te jednostki to już zależy od definicji programisty.

Można zdefiniować 4 jako jedną jednostkę, czyli liczba cztery pozwala przesunąć kostkę do góry o jedną jednostkę lub liczba cztery pozwala przesunąć kostkę do góry o cztery jednostki.

To kwestia umowna, każdy programista robi inaczej.
komentarz 9 czerwca 2022 przez Maciek273 Początkujący (450 p.)

Pewnie, ale wiem już na jakiej zasadzie to działa. A miałbym jeszcze jedno pytanie odnośnie kolejnej części. 

adjacentId = [topCellId, bottomCellId, rightCellId, leftCellId];

    if (adjacentId[2] % type == 0) {
        adjacentId[2] = -1;
    } 
	else if (adjacentId[3] % type == type - 1) {
        adjacentId[3] = -1;
    }

Bo tutaj rozumiem, że bierzemy rightCellId i jeśli jest ono na miejscu najbardziej z prawej strony to zmieniam jej wartosc na -1. Sprawdziłem co się stanie jak zmienię te wartość na 0 i komórka przechodzi z prawej strony na lewą. Czy to jest swego rodzaju zabezpieczenie przed tym? Czy jest to wykorzystywane do czegoś innego? I tak samo poniżej == type - 1. Tego też zbytnio  nie rozumiem.

komentarz 9 czerwca 2022 przez doublechess Obywatel (1,300 p.)
To jest przypisanie do rightCellId minus jeden, w drugim przypadku to samo.

% to oznacza tutaj resztę z dzielenia.

5 % 2 = 2.5

if(5 == 0) { // false

Reszta wyszła pięć.

2 % 2 = 1.0

if(0 == 0) { // true

Reszta wyszła zero.

Zapewne zdefiniowane to jest w ten sposób.

Jak będzie -1, to wróć o jedną kostkę z powrotem, cofnij.
komentarz 9 czerwca 2022 przez Maciek273 Początkujący (450 p.)
Znaczy to, że jest przypisane -1 i modulo ogarniam. Tylko chodzi o to, że w przypadku, gdy id jest równe 4 czyli jest to najbardziej komórka z lewej to do id przypisywane jest -1. Dlaczego?Żeby komórka z lewej nie mogła przejśc tak jakby do wiersza wyżej do prawej strony?
1
komentarz 9 czerwca 2022 przez doublechess Obywatel (1,300 p.)
Według mnie, to jest ograniczone przez zakres planszy poruszania się kostki.

Jeżeli szachownica ma 8x8, to...

Pierwsza kolumna to indeks 0, a ostatnia 7.

0,1,2,3,4,5,6,7

To jest wymiar naszej planszy do gry.

Kostka nie może być na -1, bo plansza ma wymiar "skończony" i programista definiuje, że dalej kostka nie może się przekulać, więc -1, żeby zakończyć, przerwać, brak miejsca.

Z 7, to samo analogicznie, porównując do zera, koniec planszy.
1
komentarz 9 czerwca 2022 przez VBService Ekspert (256,600 p.)
id0 id1 id2 id3 % type == type - 1 
id4 % type == 0     id7 % type == type - 1
id8 % type == 0     id11 % type == type - 1
id12 % type == 0     id15 % type == type - 1

% type == 0 - lewa krawędź

 % type == type - 1 - prawa

2
komentarz 9 czerwca 2022 przez doublechess Obywatel (1,300 p.)
Napisałem swój kod na podstawie "swojej" definicji, a nie z Twojego rysunku.
2
komentarz 9 czerwca 2022 przez VBService Ekspert (256,600 p.)
cells = [
    id0,   id1,    id2,   id3,
    id4,   id5,    id6,   id7,
    id8,   id9,  id10, id11,
   id12, id13, id14, id15
]
1
komentarz 9 czerwca 2022 przez doublechess Obywatel (1,300 p.)
No okey. Jeśli tak miałoby być, to masz rację. Leci plus.
2
komentarz 9 czerwca 2022 przez Maciek273 Początkujący (450 p.)
Super, dziękuje wam za pomoc i za zrozumienie pewnych rzeczy. Pozdrawiam :D
+2 głosów
odpowiedź 9 czerwca 2022 przez VBService Ekspert (256,600 p.)
edycja 9 czerwca 2022 przez VBService

type = 4

komentarz 9 czerwca 2022 przez Maciek273 Początkujący (450 p.)
Dzięki, już to rozumiem :)

Podobne pytania

0 głosów
0 odpowiedzi 110 wizyt
pytanie zadane 31 sierpnia 2019 w JavaScript przez bezNicku Nowicjusz (170 p.)
–1 głos
0 odpowiedzi 143 wizyt
pytanie zadane 16 maja 2019 w JavaScript przez Info Nowicjusz (140 p.)
+1 głos
1 odpowiedź 319 wizyt
pytanie zadane 29 sierpnia 2019 w Nasze projekty przez kodowiec Początkujący (410 p.)

93,600 zapytań

142,525 odpowiedzi

322,993 komentarzy

63,085 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...