nefungujuci javascript

Čiastočne alebo vôbec nefungujúce stránky v prehliadačoch Mozilla, spolupráca s webdizajnérmi
Napísať odpoveď
lesna.vevericka
začiatočník
začiatočník
Príspevky: 5
Dátum registrácie: 4. Apríla 2017, 21:07

nefungujuci javascript

Príspevok od užívateľa lesna.vevericka » 4. Apríla 2017, 21:18

Ahojte skúšal som si naprogramovať malý javascript pre hru tic tac toe, otázka je, či ja nevidím pre oči alebo je bug niekde v Mozilla. Tuto je ten HTML súbor a problém je, že funkcia spustí náhodný kód neviem odkiaľ a zapíše sa trikrát do poľa jednotka, ale má sa zapísať len raz:

Kód: Vybrať všetko

<html>
<head>
<title>tic tac toe</title>
<meta charset='utf-8'>
</head>
<body>
<div id="hra">

</div>
<script>
var hra=[[]];//I create an array for virtual game
var div = document.getElementById("hra");//pripojim sa na element v html stranke, kde budem generovat pole hry	
var n='X';//zatial je velkost pola X, co je nedovolene
function uvod(){//generujem uvodnu obrazovku hry, kde len zvolim velkost pola
	div.innerHTML = 'Velkost pola N=<input id="n" style="width:25pt;" type="text"><input onclick="generuj_uvod();" type="submit" value="Generuj pole">';
}
uvod();//zavolam si uvod na uvod
function generuj_uvod(){//tu generujem uz z uvodu volane zobrazenie hracieho pola
	n = parseInt(document.getElementById("n").value.trim());//zistim kolko rozmerne pole chce hrac mat	
	if(isNaN(n)){//ak som v uvode zadal bludy necisla skoncim to hlaskou
		alert('n nie je cislo!');
		return;
	}
	for(var a=0;a<n;a++)//nuly znacia, ze tam neklikol ani hrac ani pocitac ZEROES INIT 
	  for(var b=0;b<n;b++){ hra[a,b]=0; }//stacil by aj jeden cyklus, ale pre istotu si generujem nuly pre cele pole
	var d='';//inicializujem si textovu premennu, ktoru naplnim uz existujucimi polickami text, na ktore klikam
	for(var a=0;a<n;a++){
	  for(var b=0;b<n;b++){
		  //tu si definujem hlavne na kliknutie funkciu tahal(a,b), aby som vedel, ze kde klikol hrac
		  //a,b mi definuju suradnice kliknutia na textove policko
		  d+='<input onclick=\"tahal('+a+','+b+')\" style=\"width:25pt;\" id=\"'+a+','+b+'\" type=\"text\">';//pridavam policka
	  }
	  d+="<br>";//zalomim riadok
	}  
	document.getElementById("hra").innerHTML=d;  //zobrazim textove klikacie polia na obrazovke prehliadaca
	
}
//tu sa to skoncilo nejakou chybou, lebo nenaplnilo len hra[i,j] na klik rovne jedna
function tahal(i,j){
	console.log('i='+i+' j='+j+' hra[parseInt(i),parseInt(j)] = 1'); //zobrazim v konzole, ze kde hrac klikol
	hra[parseInt(i),parseInt(j)] = 1; //tam, kde klikol si na suradnicu dam 1 ONLY ONE 1
	for(var a=0;a<n;a++){
	  for(var b=0;b<n;b++){
			console.log('a='+a+' b='+b+' hra[a,b]='+hra[a,b]);//WHY? this returns 3 times 1 if all items of array are initialized 0
	  }
	}	
}

</script>
</body>
</html>
Výstup je tento:

Kód: Vybrať všetko

i=0 j=0 hra[parseInt(i),parseInt(j)] = 1  tictactoe.html:41:2
a=0 b=0 hra[a,b]=1  tictactoe.html:45:4 (tu dalo správne)
a=0 b=1 hra[a,b]=0  tictactoe.html:45:4
a=0 b=2 hra[a,b]=0  tictactoe.html:45:4
a=1 b=0 hra[a,b]=1  tictactoe.html:45:4 (tu by nemala byť jednotka)
a=1 b=1 hra[a,b]=0  tictactoe.html:45:4
a=1 b=2 hra[a,b]=0  tictactoe.html:45:4
a=2 b=0 hra[a,b]=1  tictactoe.html:45:4 (tu by nemala byť jednotka)
a=2 b=1 hra[a,b]=0  tictactoe.html:45:4
a=2 b=2 hra[a,b]=0
Vďaka za pomoc.

lesna.vevericka
začiatočník
začiatočník
Príspevky: 5
Dátum registrácie: 4. Apríla 2017, 21:07

Re: nefungujuci javascript

Príspevok od užívateľa lesna.vevericka » 5. Apríla 2017, 18:00

Kód: Vybrať všetko

<html>
<head>
<title>tic tac toe</title>
<meta charset='utf-8'>
</head>
<body>
<div id="hra">

</div>
<script>
var hra=[[]];//I create an array for virtual game
var div = document.getElementById("hra");//pripojim sa na element v html stranke, kde budem generovat pole hry	
var n='X';//zatial je velkost pola X, co je nedovolene
function uvod(){//generujem uvodnu obrazovku hry, kde len zvolim velkost pola
	div.innerHTML = 'Velkost pola N=<input id="n" style="width:25pt;" type="text"><input onclick="generuj_uvod();" type="submit" value="Generuj pole">';
}
uvod();//zavolam si uvod na uvod
function generuj_uvod(){//tu generujem uz z uvodu volane zobrazenie hracieho pola
	n = parseInt(document.getElementById("n").value.trim());//zistim kolko rozmerne pole chce hrac mat	
	if(isNaN(n)){//ak som v uvode zadal bludy necisla skoncim to hlaskou
		alert('n nie je cislo!');
		return;
	}
	for(var a=0;a<n;a++)//nuly znacia, ze tam neklikol ani hrac ani pocitac ZEROES INIT 
	  for(var b=0;b<n;b++){ hra[a,b]=0; }//stacil by aj jeden cyklus, ale pre istotu si generujem nuly pre cele pole
	var d='';//inicializujem si textovu premennu, ktoru naplnim uz existujucimi polickami text, na ktore klikam
	for(var a=0;a<n;a++){
	  for(var b=0;b<n;b++){
		  //tu si definujem hlavne na kliknutie funkciu tahal(a,b), aby som vedel, ze kde klikol hrac
		  //a,b mi definuju suradnice kliknutia na textove policko
		  d+='<input onclick=\"tahal('+a+','+b+')\" style=\"width:25pt;\" id=\"'+a+','+b+'\" type=\"text\">';//pridavam policka
	  }
	  d+="<br>";//zalomim riadok
	}  
	document.getElementById("hra").innerHTML=d;  //zobrazim textove klikacie polia na obrazovke prehliadaca
	
}
//tu sa to skoncilo nejakou chybou, lebo nenaplnilo len hra[i,j] na klik rovne jedna
function tahal(i,j){	
	i=parseInt(i);j=parseInt(j);	 
	for(var a=0;a<n;a++){
	  for(var b=0;b<n;b++){		 		  
			hra[a][b]=1;//should overwrite global array to 1
			console.log(hra[a,b]);//returns zeroes???
			//no cache history, delted, file renamed tried another browser, error persists
			//tested in firefox 52, chrome 57, Linux Mint 17.3
			//rem: eset antivirus destroyed fallen down, nobody knows why
			// mybe ghost in the shell :-D :-D			
	  }
	}	
}

</script>
</body>
</html>
Vracia v konzole:
a=0 b=0 hra[a,b]=0 tictactoe2.html:44:4
a=0 b=1 hra[a,b]=0 tictactoe2.html:44:4
a=0 b=2 hra[a,b]=0 tictactoe2.html:44:4
a=1 b=0 hra[a,b]=0 tictactoe2.html:44:4
a=1 b=1 hra[a,b]=0 tictactoe2.html:44:4
a=1 b=2 hra[a,b]=0 tictactoe2.html:44:4
a=2 b=0 hra[a,b]=0 tictactoe2.html:44:4
a=2 b=1 hra[a,b]=0 tictactoe2.html:44:4
a=2 b=2 hra[a,b]=0 tictactoe2.html:44:4
A už kašľať na to, nejako to nefičí v HTML5. Asi treba skúsiť iný jazyk, ale tuto to vyzeralo byť jednoduché: Hráč kliká, renderujeme polia a počítač zráta riadky, stĺpce, diagonály a vráti úder. To bolo celé tic tac toe z http://www.joineset.sk/assets/files/Joi ... TacToe.pdf Thak nič, nejde to ani v chrome :evil:

lesna.vevericka
začiatočník
začiatočník
Príspevky: 5
Dátum registrácie: 4. Apríla 2017, 21:07

Re: nefungujuci javascript

Príspevok od užívateľa lesna.vevericka » 10. Apríla 2017, 19:37

V tomto prípade to generuje správne. Asi to má problém s generovaím funkcie v DOM dynamicky ako vidno vyššie:
Možno sme našli chybu:

Kód: Vybrať všetko

<html>
<head>
<title></title>
<meta charset="utf-8">
</head>
<body>
<script>
var a=[[]];
a[0][0]=1;
a[0][1]=2;
var x =function(){
	console.log(a[0][1]);	
}
x();
</script>
</body>
</html>
Ešte raz vďaka za prezretia vlákna. Držím palce tímu Mozilla, fajn prehliadač na každý deň. Čaute.

lesna.vevericka
začiatočník
začiatočník
Príspevky: 5
Dátum registrácie: 4. Apríla 2017, 21:07

Re: nefungujuci javascript

Príspevok od užívateľa lesna.vevericka » 12. Apríla 2017, 14:18

No nefičalo to v javascripte, ale možno sa to zíde niekomu v pythone:

Kód: Vybrať všetko

import sys#import system
import random#importnem nahodne cisla
def uvod(): #funkcia na uvodny pozdrav
    global rozmer #rozmer hracieho pola
    global hra #pole hry
    global maxr #maximum v riadku
    global maxs #maximum v stlpci
    maxr=0
    maxs=0
    hra=[]#zopar globalnych premennych a ich inicializacia
    rozmer=unicode(raw_input('Rozmer pola: '),'utf-8')
    while not rozmer.isnumeric():
        rozmer=unicode(raw_input('Rozmer pola: '),'utf-8')#ponacitavam si rozmery pola
    rozmer=int(rozmer)#kedze su rozmery znaky, konvertnem ich na cislo
    
    for x in range(0,rozmer):
        hra.append([])
    for x in range(0,rozmer):
        for y in range(0,rozmer):        
            hra[x].append(0)#naplnim si v cykloch pole hra na nuly
    vypis_hru()#vypisem pole hry

def vypis_hru():#v cykle vypisem hracie pole vzdy, ked treba
    print 'Hracie pole je:'
    for x in range(0,int(rozmer)):        
            print hra[x]
    

uvod()#tu volam uvodnu obrazovku, vypise sa pekne co treba na uvod

def tah_hraca():#taha hrac
    print 'Vloz tvoj tah:'
    print 'Riadok pola, Stlpec pola:'
    global riadok
    global stlpec
    riadok=unicode(raw_input('Riadok='),'utf-8')
    while not riadok.isnumeric():
        riadok=unicode(raw_input('Riadok='),'utf-8')
    stlpec=unicode(raw_input('Stlpec='),'utf-8')
    while not stlpec.isnumeric():
        stlpec=unicode(raw_input('Stlpec='),'utf-8')#hrac zada riadok stlpec pola
    if hra[int(riadok)][int(stlpec)]==0:#ak je pole volne hracovi sa tam priradi 1
        hra[int(riadok)][int(stlpec)]=1
    else:#inak hrac taha znova, lebo pozicia je obsadena
        print 'Tahaj znova, lebo pozicia je uz obsadena:'
        tah_hraca()#rekurzivne znova volam tah hraca
    vypis_hru()#a vypisem hracie pole

def tah_na_diagonale(hra):#mala funkcia na potiahnutie na diagonale
    b=0
    for a in range(0,rozmer):
        if a==b:
            if hra[a][b]==0:
                hra[a][b]=-1#tam, kde je mozne vlozit minus jedna ju vlozi
                return
        b+=1    

def tah_na_diagonale2(hra):#tah na antidiagonale
    b=rozmer    
    for a in range(0,rozmer):
        b-=1    
        if hra[a][b]==0:
            hra[a][b]=-1#opatovne vlozim minus jedna, ak sa to da
            return
        

def navrhni_tah_riadok(r):#taham v riadku r a vlozim tam, kde treba
    
    for b in range(0,rozmer):
        if hra[r][b]==0:
            hra[r][b]=-1
            zadal=1
            print '['+str(r)+']['+str(b)+']'
            return
        
    #tu musim najst vhodnu nulu na poli, ak uz nie je v riadku
    najdi_vhodnu_nulu(hra)

def navrhni_tah_riadky(hra):#poprezeram riadky na tah
    
    s=[]
    m=0#inicializacia premennych    
    for a in range(0,rozmer):#prejdem kazdy riadok
        s.append(sum(hra[a]))#ukladam sucty do zoznamu s
    m=max(s)#najdem maximum suctov v riadku zoznamu
    
    maxr=m#pouzivam globalnu premennu pre dalsie vypocty    
    for a in range(0,rozmer):
        if sum(hra[a])==m:
            navrhni_tah_riadok(a)#navrhnem dalsi tah v riadku (a)
            vypis_hru()#vypisem hracie pole
            return    

def najdi_vhodnu_nulu(hra):
    for a in range(0,rozmer):
        for b in range(0,rozmer):
            if hra[a][b]==0:
                print '['+str(a)+']['+str(b)+']'
                hra[a][b]=-1
                return

    
def navrhni_tah_stlpec(x):#navrhnem tah v stlpci
    for b in range(0,rozmer):
        if hra[b][x]==0:#tam, kde je nula mozem vlozit minus jedna
            hra[b][x]=-1
            print '['+str(b)+']['+str(x)+']'
            return#vyskocim z funkcie
        
    #tu musim najst vhodnu nulu v poli, ak uz nemozem tahat ten stlpec
    najdi_vhodnu_nulu(hra)

def navrhni_tah_stlpce(hra):#prebehnem stlpce a hladam vhodne sucty na tah
    s=0
    sl=[]#inicializacia niektorych premennych
    
    m=0
    for a in range(0,rozmer):
        for b in range(0,rozmer):
            s+=hra[b][a]
        sl.append(s)
    m=max(sl)#z vytvorenych suctov najdem maximum
    
    maxs=m#pouzivam globalne premenne pre niektore dalsie prenosy a vypocty medzi funkciami
    s=0
    for a in range(0,rozmer):
        for b in range(0,rozmer):
            s+=hra[b][a]
        if s==m:
            navrhni_tah_stlpec(a)#navrhnem stlpcovy tah
            vypis_hru()#a vypisem hru
            return# vyskocim z funkcie

def navrhni_tah_diagonalne(hra):
    shd=0
    sdi=0
    for a in range(0,rozmer):
        for b in range(0,rozmer):            
            if b==a and hra[a][b]!=0:#kontrolujem, ci je uz diagonala plna cisiel inych ako nula
                sdi+=1#sucet na diagonale
    if sdi==rozmer:
        return False#ak sa na diagonale neda uz hladat tah vratim false
    
    for a in range(0,rozmer):
        for b in range(0,rozmer):            
            if b==a:#jedine tu moze nastat sucet rovny rozmer
                shd=0#zratam sucet hlavnej diagonaly
                pociatok_riadok=a-a
                pociatok_stlpec=b-b
                while pociatok_stlpec<rozmer and hra[pociatok_riadok][pociatok_stlpec]!=-1:
                    shd+=hra[pociatok_riadok][pociatok_stlpec]
                    pociatok_riadok+=1
                    pociatok_stlpec+=1
                if shd==int(rozmer)-1: #ak su diagonaly pred vyhrou, zakrocim
                    tah_na_diagonale(hra)#lebo smeruje k vyhre
                    vypis_hru()#vypisem hracie pole
                    return True#vratim pravda tahal som na diagonale, aby som uz netahal v riadku stlpci

def navrhni_tah_diagonalne2(hra):#tah na antidiagonale
    snvd=0
    b=rozmer#inicializujem si premenne    
    for a in range(0,rozmer):
        b-=1#sucet rozmer je aj na vedlajsej diagonale
        if hra[a][b]!=0:
            snvd+=1    
    if snvd==rozmer:
        return False#ak som zistil, ze su tam same cisla, netaham na diagonale
    snvd=0
    b=rozmer    
    for a in range(0,rozmer):
        b-=1#sucet rozmer je aj na vedlajsej diagonale
        if hra[a][b]==1:
            snvd+=hra[a][b]
    if snvd==int(rozmer)-1:
        tah_na_diagonale2(hra)#lebo smeruje k vyhre
        vypis_hru()#vypisem hracie pole
        return True#vratim pravda tahal som na diagonale uz nemozem tahat na riadok stlpec

def skontroluj_remizu(hra):#zistim, ci su uz vyplnene vsetky policka a remiza
    najdene=0
    for a in range(0,rozmer):
        for b in range(0,rozmer):
            if hra[a][b]==0:
                najdene=1
    if najdene==0:
        print 'Nastala remiza.'
        sys.exit()            

def skontroluj_vyhru_pocitaca(hra):#skotrolijem sucty na riadok stlpec diagonaly, kto vyhrava
    sr=0 #sucet riadok
    ss=0 #sucet stlpec
    sd=0 #sucet diagonala
    sv=0 #sucet vedlajsia diagonala
    print 'Kontrolujem vyhru pocitaca.'
    for a in range(0,rozmer):
        for b in range(0,rozmer):
            if hra[a][b]==-1:#ratam minus jednotky pocitacove
                sr=0
                ss=0
                sd=0        
                for x in range(0,rozmer):
                    sr+=hra[x][b]
                    ss+=hra[a][x]
                r=int(rozmer)
                if sr==-r:
                    print 'Vyhral pocitac v stlpci!'                    
                    sys.exit()
                            
                if ss==-r:
                    print 'Vyhral pocitac v riadku!'                    
                    sys.exit()
                if a==b:
                    sd+=hra[a][b]
                if sd==-r:
                    print 'Vyhral pocitac v diagonale!'                    
                    sys.exit()
    b=rozmer
    snvd=0            
    for a in range(0,rozmer):
        b-=1#sucet rozmer je aj na vedlajsej diagonale
        if hra[a][b]==-1:
            snvd+=hra[a][b]
    
    r=int(rozmer)
    if snvd==-r:
        print 'Vyhral pocitac vedlajsia diagonala!'
        sys.exit()                


def tah_pocitaca():#pocitam tahy pocitaca na zaklade hracieho platna
    print 'Taha pocitac.'
    sr=0 #sucet riadok
    ss=0 #sucet stlpec
    shd=0 #sucet na hlavnej diagonale
    snvd=0 #sucet na vedlajsej diagonale
    for a in range(0,rozmer):
        for b in range(0,rozmer):
            if hra[a][b]==1: #vzdy ked najdem jednotku, skontrolujem jej riadok stlpec a diagonaly sucet
                sr=0
                ss=0        
                for x in range(0,rozmer):
                    if hra[x][int(stlpec)]==1:
                        sr+=hra[x][int(stlpec)]
                    if hra[int(riadok)][x]==1:
                        ss+=hra[int(riadok)][x]				
                                
                if sr==int(rozmer):
                    print 'Vyhral hrac v stlpci!'
                    sys.exit()
                
                if ss==int(rozmer):
                    print 'Vyhral hrac v riadku!'
                    sys.exit()
                                   
                shd=0 
                snvd=0                                   
                if b==a:#jedine tu moze nastat sucet rovny rozmer
                    pociatok_riadok=a-a
                    pociatok_stlpec=b-b
                    
                    while pociatok_stlpec<rozmer:
                        if hra[pociatok_riadok][pociatok_stlpec]==1:
                            shd+=hra[pociatok_riadok][pociatok_stlpec]
                        pociatok_riadok+=1
                        pociatok_stlpec+=1
                    if shd==int(rozmer):
                        print 'Vyhral hrac hlavna diagonala!'
                        sys.exit()
                    
    b=rozmer            
    for a in range(0,rozmer):
        b-=1#sucet rozmer je aj na vedlajsej diagonale
        if hra[a][b]==1:
            snvd+=hra[a][b]
    
    if snvd==int(rozmer):
        print 'Vyhral hrac vedlajsia diagonala!'
        sys.exit()
                
       
    #logika hry pocitaca:
    if ((navrhni_tah_diagonalne(hra)) or (navrhni_tah_diagonalne2(hra))):
        print 'Pocitac taha na diagonale.'    
    else:
        print 'Pocitac taha na riadky, stlpce.'
        if maxr>maxs:
            navrhni_tah_riadky(hra)
        if maxs>maxr:
            navrhni_tah_stlpce(hra)
        if maxs==maxr:
            random.seed()
            if random.randint(0,1)==0:#tuto funkciu random mozeme zamenit za lepsiu umelu inteligenciu pozorujucu pole hry
                navrhni_tah_stlpce(hra)
            else:
                navrhni_tah_riadky(hra)
    skontroluj_vyhru_pocitaca(hra)
    skontroluj_remizu(hra)
        
    
    
def kontrola_vyhry():
    return 'dummy funckia pre nekonecny cyklus, lebo koncim na sys.exity'   

def bezi_hra():#slucka beziacej hry
    strieda=0#strieda tahy hrac pocitac
    while kontrola_vyhry()!='koniec':
        if strieda==0:
            tah_hraca()
            strieda=1
        if strieda==1:
            tah_pocitaca()
            strieda=0

bezi_hra()#bezi hra v slucke po koniec
Na tej AI treba ešte popracovať :-)

lesna.vevericka
začiatočník
začiatočník
Príspevky: 5
Dátum registrácie: 4. Apríla 2017, 21:07

Re: nefungujuci javascript VYRIEŠENÉ

Príspevok od užívateľa lesna.vevericka » 16. Apríla 2017, 15:18

Opravené, naskočilo to takto:

Kód: Vybrať všetko

<html>
<head>
<title>tic tac toe</title>
<meta charset='utf-8'>
</head>
<body>
<div id="hra">

</div>
<script>
	//podla novej literatury treba pouzit new Array(), stare pole=[[]] nefunguje
var hra=new Array();//vytvorim si pole pre virtualnu hru

var div = document.getElementById("hra");//pripojim sa na element v html stranke, kde budem generovat pole hry	
var n='X';//zatial je velkost pola X, co je nedovolene

function uvod(){//generujem uvodnu obrazovku hry, kde len zvolim velkost pola
	div.innerHTML = 'Velkost pola N=<input id="n" style="width:25pt;" type="text"><input onclick="generuj_uvod();" type="submit" value="Generuj pole">';
}
uvod();//zavolam si uvod na uvod
function generuj_uvod(){//tu generujem uz z uvodu volane zobrazenie hracieho pola
	n = parseInt(document.getElementById("n").value.trim());//zistim kolko rozmerne pole chce hrac mat	
	if(isNaN(n)){//ak som v uvode zadal bludy necisla skoncim to hlaskou
		alert('n nie je cislo!');
		return;
	}
	for(i=0;i<n;i++)
	for(j=0;j<n;j++) hra[i]=new Array();
	
	var d='';//inicializujem si textovu premennu, ktoru naplnim uz existujucimi polickami text, na ktore klikam
	for(var a=0;a<n;a++){
	  for(var b=0;b<n;b++){
		  //tu si definujem hlavne na kliknutie funkciu tahal(a,b), aby som vedel, ze kde klikol hrac
		  //a,b mi definuju suradnice kliknutia na textove policko
		  d+='<input onclick=\"tahal('+a+','+b+')\"'+'style=\"width:25pt;\" id=\"'+a+','+b+'\" type=\"text\">';//pridavam policka
	  }
	  d+="<br>";//zalomim riadok
	}  
	document.getElementById("hra").innerHTML=d;  //zobrazim textove klikacie polia na obrazovke prehliadaca
	
}

function tahal(i,j){	
	i=parseInt(i);j=parseInt(j);	 
	hra[i][j]=1 //bolo treba pole naplnit ako new Array() nie ako inicializacia podla starej literatury pole=[[]] <=to je chybne
	document.getElementById(i.toString()+','+j.toString()).value='1';
}

</script>
</body>
</html>
Vyriešené, chyba zrejme odstránená ;-)

Napísať odpoveď