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

[CODE REVIEW] Gra w kółko i krzyżyk. Początki javascript.

Object Storage Arubacloud
–1 głos
3,134 wizyt
pytanie zadane 28 września 2016 w JavaScript przez Codeboy Stary wyjadacz (12,120 p.)
edycja 19 października 2016 przez Codeboy

Zacząłem uczyć się javascriptu i postanowiłem zrobić grę kółko i krzyżyk żeby nie była to sucha nauka.

Proszę o ocenę i wytkniecie wszelkich błędów ;) Co powinienem ulepszyć, czego się douczyć. Dopiero zaczynam z javascriptem wiec będę wdzięczny za wszystkie wskazówki. Najbardziej boli mnie sprawdzanie czy divy w linii są takie same, bo wygląda to co najmniej obszernie(no ale to pierwsze na co wpadłem) ;) Napisałem to w jeden wieczór, także jestem pewien ze jest sporo do poprawy. Dziękuje za poświęcony czas.

W miedzy czasie przejrzę inne tematy z code-review tej gry na forum ;).

https://github.com/NoMoExcuses/Kolko-i-krzyzyk

http://www.kolko-i-krzyzyk.awsome.pl/

1 odpowiedź

+7 głosów
odpowiedź 28 września 2016 przez ScriptyChris Mędrzec (190,190 p.)
wybrane 30 września 2016 przez Codeboy
 
Najlepsza

Co do JavaScriptu:

komentarz 16 października 2016 przez Codeboy Stary wyjadacz (12,120 p.)

W funkcji insert, szukany jest element, za każdym razem, gdy ktoś się ruszy.

W funkcji ifwin, szukane są elementy x9, prawie za każdym razem, gdy ktoś się ruszy.

Tak, ale zacytowałeś czyszczenie "aktywności" pól, a to wykonywane jest wtedy gdy zajdzie wygrana ;) A to chyba co innego niż to co teraz opisujesz. 

Tak - funkcja sprawdzająca powinna sprawdzać kto wygrał, niezależnie od tego, która jest runda.

Ten warunek dałem po to bo jaki sens ma sprawdzanie wygranej gdy runda < 3

komentarz 16 października 2016 przez ScriptyChris Mędrzec (190,190 p.)

Przeszukiwanie DOM za każdym razem - jest 'kosztowne' dla procesora. Znacznie ładniejszym rozwiązaniem byłoby zapakowanie wszystkich pól do tablicy

+

Co masz na myśli mówiąc "za każdym razem"? To jest wykonywane tylko raz, jeśli zaszła wygrana.

Argeento zapewne miał na myśli to, że z każdą iterację pętli odnosisz się do danego elementu trzykrotnie i w każdej iteracji odnosisz się do DOM. Czyli:

for(var i=0; i<=8; i++) 
{
    document.getElementById(i).removeEventListener("click", insert);
    document.getElementById(i).classList.remove('field');
    document.getElementById(i).classList.add('off');
}

Argeento wskazał Ci, abyś najpierw zrobił sobie tablicę zawierającą elementy, po których będziesz sobie w pętli iterował (będziesz je mieć już w pamięci, przez co z każdą iteracją JS nie będzie musiał sięgać do DOM, aby je pobrać).

Poza tym, po co trzykrotnie pobierać element, aby wziąc jego classList albo coś innego, skoro możesz pobrać element, umieścić go w zmiennej i na tej zmiennej działać. Czyli:

var element = document.getElementById(i);
element.removeEventListener("click", insert);
element.classList.remove('field');
element.classList.add('off');

, pobierasz element do zmiennej raz, a potem tylko odnosisz się do niego przez referencje (jako, że JS elementy DOM traktuje jako obiekty, a do tych JS z kolei odnosi się przez referencje) poprzez tą zmienną i robisz z tym elementem co tam chcesz - przez co nie musisz za każdym razem odnosić się do DOM, aby sobie coś z elementu odczytać czy w nim zmienić.

rozpoczynasz nowe bloki na 4* różne sposoby, wybierz jeden i bądź konsekwentny

Owszem, wybór jednego stylu pisania jak najbardziej, ale czytałem coś takiego: https://github.com/airbnb/javascript#blocks

i jest tam napisane, że jedno linijkowe instrukcje po if można pisać zarówno w jednej linijce jak i wielu :) Więc IMHO, jak komu wygodniej. Chociaż rzeczywiście lepiej trzymać się jednego stylu zapisu. Tak tylko nawiasem rzucam.

Przypomniałem też sobie, że muszę refaktoryzować kod na GitHub, bo chyba nie spełnia tych wymagań.

komentarz 16 października 2016 przez niezalogowany
if(round>=3 && round<=10) ifWin("o");

Zatem niech sprawdzanie licznika rund będzie pierwszą czynnością w ifwin. Funkcja insert jest od wstawiania, funkcja ifwin od sprawdzania. Niepotrzebnie to mieszasz.

Druga sprawa, po co sprawdzać czy aby na pewno nie jest runda 11 lub dalej


Więc IMHO, jak komu wygodniej

IMO bycie konsekwentnym, to bycie konsekwentnym. Pod ifem jednak zawsze spodziewam się zamknięcia jego bloku.

komentarz 16 października 2016 przez Codeboy Stary wyjadacz (12,120 p.)

Dzięki Krzycho za wytłumaczenie ;)
 

Przypomniałem też sobie, że muszę refaktoryzować kod na GitHub, bo chyba nie spełnia tych wymagań.

??? ;D 

komentarz 16 października 2016 przez Codeboy Stary wyjadacz (12,120 p.)

Przeszukiwanie DOM za każdym razem - jest 'kosztowne' dla procesora. Znacznie ładniejszym rozwiązaniem byłoby zapakowanie wszystkich pól do tablicy 

+

Użyłem pętle globalnie i zastosowałem to do wszystkich możliwych funkcji ;) 

*uważaj, zmienna field może Ci namieszać przy tworzeniu tablicy.. albo na odwrót. Takie życie gdy nie masz scopa z funkcji / oddzielnej klasy

Wydaję się, że nie namieszało ;) 

*zawsze parsuj zmienne przychodzące z DOM API // parseInt( e.target.id );

Hmmm, ale tylko wtedy kiedy ta zmienna ma być liczbą prawda? ;)
W moim kodzie tylko to co napisałeś do sparsowania, nie mylę się?

Zatem niech sprawdzanie licznika rund będzie pierwszą czynnością w ifwin. Funkcja insert jest od wstawiania, funkcja ifwin od sprawdzania. Niepotrzebnie to mieszasz.

if (round%2==0) {
			
			field[i].innerHTML="<img src='img/krzyzyk.png'>";
			if(round>=3) ifWin("x");
			return;
			
		}

Nie za bardzo rozumiem gdzie tu się miesza, przecież po prostu jest warunek kiedy wywołać sprawdzenie, czyli kiedy runda >3. Chyba, że chodzi Ci o to żeby całkiem wyrzucić, z funkcji wstawiania(insert), wywołanie funkcji sprawdzającej(ifWin) i zrobić to osobno.

Druga sprawa, po co sprawdzać czy aby na pewno nie jest runda 11 lub dalej

+

IMO bycie konsekwentnym, to bycie konsekwentnym. Pod ifem jednak zawsze spodziewam się zamknięcia jego bloku.

 + 
Racja, poprawione, mam nadzieje, że wszystko :D

Podobne pytania

0 głosów
1 odpowiedź 1,799 wizyt
+1 głos
4 odpowiedzi 685 wizyt
pytanie zadane 2 sierpnia 2016 w JavaScript przez Mawii0 Nowicjusz (170 p.)
0 głosów
3 odpowiedzi 1,344 wizyt

92,568 zapytań

141,422 odpowiedzi

319,637 komentarzy

61,957 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...