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

JS - Kółko i krzyżyk, źle działający kod

VPS Starter Arubacloud
+1 głos
1,077 wizyt
pytanie zadane 27 marca 2016 w JavaScript przez Bornegio Obywatel (1,070 p.)

Cześć. Naskrobałem sobie w ramach ćwiczeń kółko i krzyżyk w JSsie w opcji na 2 graczy i mój problem polega na tym, że po skończonym meczu i wywołaniu funkcji czyszczącej plansze, kółko jest stawiane samo w miejscu, gdzie został wykonany ostatni ruch poprzedniej gry. Problem występuje tylko w przypadku, gdy zaczyna gracz drugi (kółko). W przypadku, gdy grę zaczyna gracz pierwszy (krzyżyk) to wszystko jest w porządku. Ktoś może domyśla się dlaczego?

Oto kod JS:

var player = 1;

function wypelnij_plansze()
{
	
	/* Czyści planszę */
	
	document.getElementById("game").innerHTML = " ";
	
	/* Wypełnia planszę, pustymi divami */
	for (i = 1; i <= 9; i++)
	{
		document.getElementById("game").innerHTML = document.getElementById("game").innerHTML + 
		'<div id="' + i + '" class="pole" onclick="klick(' + i + ')"> </div>';
		if (i % 3 == 0) document.getElementById("game").innerHTML = document.getElementById("game").innerHTML + '<div style="clear:both"></div>';
	}
}

function klick(a)
{
	
	if (document.getElementById(a).innerHTML == " " & player == 1)
	{		
		document.getElementById(a).innerHTML = "X";
		player = 2;
		koniec();
	}
	if (document.getElementById(a).innerHTML == " " & player == 2)
	{
		document.getElementById(a).innerHTML = "O";
		player = 1;
		koniec();
	}
}

function koniec()
{
	var koniec = true;
	var zwyciezca = 0;
	/*sprawdza, czy wszystkie pola są wypełnione */
	for (i = 1; i <= 9; i++)
	{
		if (document.getElementById(i).innerHTML == " ") koniec = false;
	}
	
	/* sprawdza, czy nie jest spełniony warunek zwycięztwa*/	
	for (i = 0; i <= 2; i++)
	{
		/* sprawdza w poziomie */
		var x = i *  3 + 1;
		if(document.getElementById(x).innerHTML == document.getElementById(x+1).innerHTML & document.getElementById(x).innerHTML == document.getElementById(x+2).innerHTML & document.getElementById(x).innerHTML != " ")
		{
			koniec = true;
			if (document.getElementById(x).innerHTML == "X") zwyciezca = 1;
			if (document.getElementById(x).innerHTML == "O") zwyciezca = 2;	
		}
		/*sprawdza w pionie */
		var o = i + 1;
		if(document.getElementById(o).innerHTML == document.getElementById(o+3).innerHTML & document.getElementById(o).innerHTML == document.getElementById(o+6).innerHTML & document.getElementById(o).innerHTML != " ")
		{
			koniec = true;
			if (document.getElementById(o).innerHTML == "X") zwyciezca = 1;
			if (document.getElementById(o).innerHTML == "O") zwyciezca = 2;	
		}
	}
	/* sprawdza w skosie */
	if (document.getElementById("5").innerHTML == document.getElementById("1").innerHTML & document.getElementById("5").innerHTML == document.getElementById("9").innerHTML & document.getElementById(5).innerHTML != " ")
	{
		koniec = true;
		if (document.getElementById("5").innerHTML == "X") zwyciezca = 1;
		if (document.getElementById("5").innerHTML == "O") zwyciezca = 2;
	}
	if (document.getElementById("5").innerHTML == document.getElementById("3").innerHTML & document.getElementById("5").innerHTML == document.getElementById("7").innerHTML & document.getElementById(5).innerHTML != " ")
	{
		koniec = true;
		if (document.getElementById("5").innerHTML == "X") zwyciezca = 1;
		if (document.getElementById("5").innerHTML == "O") zwyciezca = 2;
	}
	
	if (koniec)
	{
		if (zwyciezca == 0) alert("REMIS!");
		else if (zwyciezca == 1) alert("Zwycięża gracz 1 (X)");
		else if (zwyciezca == 2) alert("Zwycięża gracz 2 (O)");
		
		wypelnij_plansze();
	}
}


function start()
{
	wypelnij_plansze();
}

window.onload = start;

 

plik html zawiera tylko jednego diva o id="game".

2 odpowiedzi

0 głosów
odpowiedź 27 marca 2016 przez Comandeer Guru (604,400 p.)

Prawdę mówiąc dziwię się, że to wgl działa, gdyż pomylileś operatory. Operator & to bitowe i. Normalne i, czyli te, którego potrzebujesz, to &&

0 głosów
odpowiedź 27 marca 2016 przez Mr. Mustache Początkujący (350 p.)

W funkcji klick, w linijce 28 dodaj else przed if'em:
 

function klick(a)
{
     
    if (document.getElementById(a).innerHTML == " " && player == 1)
    {       
        document.getElementById(a).innerHTML = "X";
        player = 2;
        koniec();
    }
    else if (document.getElementById(a).innerHTML == " " && player == 2)
    {
        document.getElementById(a).innerHTML = "O";
        player = 1;
        koniec();
    }
}

 

komentarz 29 marca 2016 przez niezalogowany
jak zrobiłeś to zaznaczenie??
komentarz 29 marca 2016 przez Mr. Mustache Początkujący (350 p.)

Dodajesz kod przez: "Add or update a code snippet". W okienku, które Ci się wyświetli zmieniasz zakładkę na "Advanced" i w polu "Highlight lines" wpisujesz numery linii po przecinku, które mają zostać wyróżnione.

komentarz 29 marca 2016 przez niezalogowany
ooo... dzięki wielkie :)

Podobne pytania

+1 głos
6 odpowiedzi 2,558 wizyt
pytanie zadane 16 kwietnia 2018 w C i C++ przez macias17 Nowicjusz (190 p.)
0 głosów
1 odpowiedź 1,100 wizyt
pytanie zadane 16 stycznia 2018 w C i C++ przez BinaryMan Stary wyjadacz (12,620 p.)
0 głosów
0 odpowiedzi 590 wizyt
pytanie zadane 26 października 2019 w JavaScript przez Kuba Romańczuk Początkujący (320 p.)

92,834 zapytań

141,778 odpowiedzi

320,827 komentarzy

62,164 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

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!

...