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

Kółko i Krzyżyk - JS ES5 - [Code Review]

Object Storage Arubacloud
–1 głos
622 wizyt
pytanie zadane 22 lipca 2017 w Nasze projekty przez Kamil Łydka Stary wyjadacz (13,600 p.)
Hej. Chciałbym pochwalić się swoją małą aplikacją napisaną w JavaScript. Celowo kod jest napisany w samym ES5. Jednocześnie chciałbym prosić wszystkich bardziej doświadczonych o ocenę kodu i wypunktowanie mi moich błędów. Apka jest dla dwóch osób, nie ma możliwości grania z komputerem, a to dlatego że chciałem skupić się na samym języku, a nie poświęcać czasu logice.

Moje repozytorium znajdziecie tutaj: https://github.com/PanLydka/tic-tac-toe-ES5

Z kolei wersję live można przetestować tutaj: https://panlydka.github.io/tic-tac-toe-ES5/

 

Będę bardzo wdzięczny za każdą uwagę i na pewno wszystkie poprawki wniosę. Bardzo możliwe, że potem stworzę nowe repo z tym samym kodem, ale przepisanym na ES6. :)
komentarz 22 lipca 2017 przez kubaapk Nałogowiec (44,270 p.)
'Teraz rusza się...' nie do końca dobrze działa, sprawdź sobie.
komentarz 22 lipca 2017 przez Kamil Łydka Stary wyjadacz (13,600 p.)
Chodzi o animację? No tak, jak ktoś szybko przeklika wszystkie pola, to w pewnym momencie może się nie wyświetlić, ale nie widzę tu problemu, bo jakby ktoś miał grać normalnie, to wszystko działałoby okej.

W dodatku nie mam pomysłu jak mógłbym to zrobić inaczej, żeby uniknąć takiego zawirowania. :)
komentarz 22 lipca 2017 przez kubaapk Nałogowiec (44,270 p.)
Jeśli kliknę start to jest napisane, że ruch ma gracz O, wykonuję ruch i znowu jest napisane, że jest ruch dla O, a dodaje się X. Jeśli zagram po raz drugi, to informacje odnośnie tury są odwrócone, tj. przy ruchu X wcześniej jest informacja, że ruch ma O. :)
komentarz 22 lipca 2017 przez Kamil Łydka Stary wyjadacz (13,600 p.)
Wczoraj coś poprawiałem i musiałem popsuć i umknęło to mojej uwadze, za jakieś 3h to poprawię, serio nie zauważyłem. Dzięki

2 odpowiedzi

+2 głosów
odpowiedź 22 lipca 2017 przez ScriptyChris Mędrzec (190,190 p.)
wybrane 25 lipca 2017 przez Kamil Łydka
 
Najlepsza
komentarz 22 lipca 2017 przez ScriptyChris Mędrzec (190,190 p.)
edycja 22 lipca 2017 przez ScriptyChris

https://github.com/PanLydka/tic-tac-toe-ES5/blob/master/src/js/board/game.js#L3

Pobrałeś elementy, z których potem nie korzystasz za pośrednictwem pola this.fields. Ale na takiej zasadzie możesz właśnie pobrać na początku działania aplikacji wszystkie elementy, których będziesz potrzebować i w funkcjach odnosić się do nich przez this/self.

https://github.com/PanLydka/tic-tac-toe-ES5/blob/master/src/js/main.js#L4

Czemu tak? Robisz coś potem ze zmienną game? Nie wystarczy po prostu new Game()?

Właściwie, to nawet wystarczyło by zapisać tak:

// document.getElementById("start").addEventListener("click", new Game());

Nie przekazujesz tam żadnych parametrów, ani tym bardziej obiektu zdarzenia, więc możesz od razu na kliknięciu odpalić grę.

+1 głos
odpowiedź 22 lipca 2017 przez niezalogowany

Zamiast tego spagetti

var lastAction = this.actions[this.currentPlayer][self.actions[self.currentPlayer].length-1];
this.actions[this.currentPlayer].splice((this.actions[this.currentPlayer].length-1), 1);

Proponuję użyć pop


Czemu winOptions są stringami?

this.winOptions = [
  ["1", "2", "3"], ["4", "5", "6"], ["7", "8", "9"],
  ["1", "4", "7"], ["2", "5", "8"], ["3", "6", "9"],
  ["1", "5", "9"], ["3", "5", "7"]
];

Po co w devDependencies

"devDependencies": {
    "babel-core": "^6.24.1",
    "babel-loader": "^7.0.0",
    "babel-preset-es2015": "^6.24.1",
    "coffeelint": "^1.16.0",
    "cssnano": "^3.10.0",
    "gulp": "^3.9.1",
    "gulp-cssnano": "^2.1.2",
    "gulp-livereload": "^3.8.1",
    "gulp-plumber": "^1.1.0",
    "gulp-sass": "^3.1.0",
    "gulp-webpack": "^1.5.0",
    "sass": "^1.0.0-beta.2",
    "webpack-watch-livereload-plugin": "0.0.1"
  },
  • babel-core,
  • babel-loader,
  • babel-preset-es2015,
  • coffelint,
  • cssnano,
  • sass,
  • webpack-watch-livereload-plugin

?

komentarz 22 lipca 2017 przez Kamil Łydka Stary wyjadacz (13,600 p.)
winOptions są stringami, dlatego że this.actions.x oraz this.actions.o również przechowują stringi, a potem w funkcji status() porównuje te stringi. Nie muszę dodawać dodatkowej operacji polegającej na rzutowaniu typu.
komentarz 22 lipca 2017 przez niezalogowany
A czemu this.actions są stringami?
komentarz 22 lipca 2017 przez Kamil Łydka Stary wyjadacz (13,600 p.)

Hmm. Szczerze nie wiem do końca. 

// funkcja fieldPick()

console.log(numberField);
// dostaję wartość typu int 

this.actions[this.currentPlayer].push(numberField);
console.log(this.actions[this.currentPlayer]);
// i dostaję już wartości w stringach :/ 

 

Podobne pytania

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

92,568 zapytań

141,421 odpowiedzi

319,626 komentarzy

61,956 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!

...