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

Code Review - TicTacToe

Object Storage Arubacloud
0 głosów
259 wizyt
pytanie zadane 4 listopada 2016 w JavaScript przez Radekol Bywalec (2,880 p.)
Powiecie mi o wszystkich złych nawykach jakie tu zastosowałem? Chciałbym żebyście nie pozostawili po mnie suchej nitki. Wiem na pewno że pierwszy błąd to zmienne globalne tylko nie bardzo wiem jak ich w modułach bo inne funkcje ich nie widzą. 



var turaa = 1; 
var znak = "";
var znak1= "X";
var znak2 = "O";
var licznik = 0;

//wypisywanie pol X lub O, turowosc-----------------------------------------------------------------------
function podmien(nr)
{
	if(turaa == 1) {
		znak = znak1;
		turaa--;
		document.getElementById("tura").innerHTML = "Tura gracza O"
	}
 else  if(turaa == 0)
	{
		znak = znak2;
		turaa++;
		document.getElementById("tura").innerHTML = "Tura gracza X"
	}
	var myid = "pole" + nr;
	document.getElementById(myid).innerHTML = znak;
	document.getElementById(myid).setAttribute("onclick",";");
	document.getElementById(myid).style.cursor = "default";	
	document.getElementById(myid).onmouseover = function() {
    this.style.backgroundColor = "coral";}
	licznik++;
	sprawdz();
}

//sprawdzanie wygranej----------------------------------------------------------------------------------
function sprawdz()
{
	var uchwyt = document.getElementsByClassName("box");
	
var p1 = uchwyt[0].innerHTML;   var p2 = uchwyt[1].innerHTML;   var p3 = uchwyt[2].innerHTML;
var p4 = uchwyt[3].innerHTML;   var p5 = uchwyt[4].innerHTML;   var p6 = uchwyt[5].innerHTML;
var p7 = uchwyt[6].innerHTML;   var p8 = uchwyt[7].innerHTML;   var p9 = uchwyt[8].innerHTML;

//sprawzdanie wygranej dla O
	if((p1==znak2&&p2==znak2&&p3==znak2)||(p4==znak2&&p5==znak2&&p6==znak2)||(p7==znak2&&p8==znak2&&p9==znak2)||(p1==znak2&&p4==znak2&&p7==znak2)||(p2==znak2&&p5==znak2&&p8==znak2)||(p3==znak2&&p6==znak2&&p9==znak2)||(p1==znak2&&p5==znak2&&p9==znak2)||(p3==znak2&&p5==znak2&&p7==znak2))
	{
		document.getElementById("wygrana").innerHTML = "<a href=\"index.html\">Wygrał O! Jeszcze raz?</a>";
		koniec();
	}
//sprawzdanie wygranej dla X
	if((p1==znak1&&p2==znak1&&p3==znak1)||(p4==znak1&&p5==znak1&&p6==znak1)||(p7==znak1&&p8==znak1&&p9==znak1)||(p1==znak1&&p4==znak1&&p7==znak1)||(p2==znak1&&p5==znak1&&p8==znak1)||(p3==znak1&&p6==znak1&&p9==znak1)||(p1==znak1&&p5==znak1&&p9==znak1)||(p3==znak1&&p5==znak1&&p7==znak1))
	{
		document.getElementById("wygrana").innerHTML = "<a href=\"index.html\">Wygrał X! Jeszcze raz?</a>";
		koniec();
	}
//sprawdzanie remisu---------------------------------------------------------------------------------------
	if(licznik == 9) 
		{
		document.getElementById("wygrana").innerHTML = "<a href=\"index.html\">Remis! Jeszcze raz?</a>";
		koniec();
	}
}
//co ma sie stac po wygranej------------------------------------------------------------------------
function koniec()
{
		document.getElementById("pole1").setAttribute("onclick",";");
		document.getElementById("pole2").setAttribute("onclick",";");
		document.getElementById("pole3").setAttribute("onclick",";");
		document.getElementById("pole4").setAttribute("onclick",";");
		document.getElementById("pole5").setAttribute("onclick",";");
		document.getElementById("pole6").setAttribute("onclick",";");
		document.getElementById("pole7").setAttribute("onclick",";");
		document.getElementById("pole8").setAttribute("onclick",";");
		document.getElementById("pole9").setAttribute("onclick",";");
		
		document.getElementById("pole1").onmouseover = function() {
		this.style.backgroundColor = "coral";}
		document.getElementById("pole2").onmouseover = function() {
		this.style.backgroundColor = "coral";}
		document.getElementById("pole3").onmouseover = function() {
		this.style.backgroundColor = "coral";}
		document.getElementById("pole4").onmouseover = function() {
		this.style.backgroundColor = "coral";}
		document.getElementById("pole5").onmouseover = function() {
		this.style.backgroundColor = "coral";}
		document.getElementById("pole6").onmouseover = function() {
		this.style.backgroundColor = "coral";}
		document.getElementById("pole7").onmouseover = function() {
		this.style.backgroundColor = "coral";}
		document.getElementById("pole8").onmouseover = function() {
		this.style.backgroundColor = "coral";}
		document.getElementById("pole9").onmouseover = function() {
		this.style.backgroundColor = "coral";}
		
		document.getElementById("pole1").style.cursor = "default";
		document.getElementById("pole2").style.cursor = "default";
		document.getElementById("pole3").style.cursor = "default";
		document.getElementById("pole4").style.cursor = "default";
		document.getElementById("pole5").style.cursor = "default";
		document.getElementById("pole6").style.cursor = "default";
		document.getElementById("pole7").style.cursor = "default";
		document.getElementById("pole8").style.cursor = "default";
		document.getElementById("pole9").style.cursor = "default";
}

 

komentarz 4 listopada 2016 przez Adam Kaczmar Początkujący (300 p.)

Spróbuj przerobić to na OOP. Dobrym nawykiem też jest definiowanie lub chociaż zadeklarowanie możliwie największej liczby zmiennych na początku kodu. Nie musisz używać też za każdym razem "var":

var turaa = 1, znak = "", znak1= "X", znak2 = "O", licznik = 0;

Co się da zrób CSS'em, a JS'em tylko dodawaj/usuwaj klasy. Inaczej robi się bałagan.

Instrukcje warunkowe w sprawdz() na pewno można uprościć.

Tyle, co widać na pierwszy rzut oka. ;)

komentarz 4 listopada 2016 przez niezalogowany

Co się mocno rzuca w oczy to słabo zadbane formatowanie kodu oraz byt długie linie. Linie typu

if((p1==znak1&&p2==znak1&&p3==znak1)||(p4==znak1&&p5==znak1&&p6==znak1)||(p7==znak1&&p8==znak1&&p9==znak1)||(p1==znak1&&p4==znak1&&p7==znak1)||(p2==znak1&&p5==znak1&&p8==znak1)||(p3==znak1&&p6==znak1&&p9==znak1)||(p1==znak1&&p5==znak1&&p9==znak1)||(p3==znak1&&p5==znak1&&p7==znak1))

powinny zostać rozbite na kilka wierszy. Zwykle definiuje się w zespole max szerokość kodu na N kolumn i się trzyma tej zasady

if((p1 == znak1 && p2 == znak1 && p3 == znak1)
        || (p4 == znak1 && p5 == znak1 && p6 == znak1)
        || (p7==znak1 && p8 == znak1 && p9 == znak1)
        || (p1 == znak1 && p4 == znak1 && p7 == znak1)
        || (p2 == znak1 && p5 == znak1 && p8 == znak1)
        || (p3 == znak1 && p6 == znak1 && p9 == znak1)
        || (p1 == znak1 && p5 == znak1 && p9 == znak1)
        || (p3 == znak1 && p5 == znak1 && p7 == znak1))

W JavaScript zwykle zapisuje się klamry { w ten samej linii co instrukcje

if (true)
{ // często spotykane w C++

vs

if (true) { // tak zwykle piszemy w JS

Co do komentarza przedmówcy odnośnie użycia jednego var lub osobnego var dla każdej zmiennej, to już zależy od stylu ustalonego w zespole. Crockfordowy JSLint z tego co pamiętam preferuje jeden var i to najlepiej na początku funkcji, ale inne style-guidy dla niektórych popularnych projektów (np. node.js style guide) piszą akurat o osobnym var.

Mam podobne zdanie do kwestii prezentacyjnych. Linie takie jak

document.getElementById("pole1").onmouseover = function() {

        this.style.backgroundColor = "coral";}

document.getElementById("pole1").style.cursor = "default";

powinny zostać zastąpione CSSem, zaś JavaScriptem ustawiałbym na elemencie klasy, żeby wymusić odpowiedni wygląd.

W kodzie nie widzę definicji event-handlerów, więc zgaduję, że masz je w kodzie HTML jako atrybuty onclick. To powinno IMO być przeniesione do kodu JS i wtedy nie musiałbyś używać kodu w stylu

document.getElementById("pole1").setAttribute("onclick",";");

do ich usuwania, tylko korzystać z dedykowanych API do obsługi zdarzeń.

Poza tym, zwykle proponuje się używanie operatora porównań === zamiast ==. W twoim kodzie nie robi to wielkiej różnicy, ale jednak taka jest dobra praktyka dla JavaScript.

1 odpowiedź

0 głosów
odpowiedź 4 listopada 2016 przez Comandeer Guru (601,110 p.)
  • Zmienne globalne można załatwić modularnym JS-em albo IIFE.
  • Raz pobrane elementy HTML zapisuj do zmiennych a nie pobieraj non stop od nowa.
  • Wszystkie onmouseover wywal do CSS-a.
  • document.getElementById("pole1").setAttribute("onclick",";");

    Jak już, to podmień własność onclick na pustą funkcję. A najlepiej wszystko przypiąć normalnie i wyłączać handlery używając flagi.

  • Sprawdzanie wygranej można przerzucić do funkcji – będzie ładniej.

Eh, miałem kiedyś napisać przykładową implementację kółka i krzyżyka. Chyba to serio zrobię :P

komentarz 5 listopada 2016 przez Radekol Bywalec (2,880 p.)
3 rzeczy z twojej listy zastosowałem, jednakże IIFE nadal nie rozumiem. Myślę, że to bardzo dobry pomysł z tą implementacją bo tyle osób na forum ma z tym problemy;) Pozdrawiam i dziękuję.

Podobne pytania

–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.)
0 głosów
1 odpowiedź 1,798 wizyt

92,568 zapytań

141,420 odpowiedzi

319,620 komentarzy

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

...