<!--
Vak=new Array(8);	// negen elementen met waarden: L, M, C voor resp. een vak met niets, een menszet, een computerzet
			// 'L': voor leeg vakje
			// 'M': voor mens
			// 'C': voor computer
imL='ltransp.gif';	// Leeg vakje (box)
imM='xtransp.gif';	// mens
imMwin='xgroen.gif';
imC='0transp.gif';	// Computer
imCwin='0rood.gif';
Mx1=-1;
My1=-1;
Cspervak=new Array(25);	//bevat vaknrs waar computer zet kan doen om een reeks van 2 van Mens verder te blokkeren

beginbeurt=-1;
beurt=beginbeurt;

toel='Voor elke computerbeurt wordt de beste zet bepaald.\nBij een sterkte van max, mid en min wordt de beste zet in respectievelijk 100%, 50% en 0% van de gevallen gedaan. Wordt de beste zet niet gedaan dan wordt het voorgaande herhaald voor de een na beste zet (wanneer die er is) enz. Wanneer geen beste zet gevonden of  toegelaten wordt wordt een willekeurige zet gedaan (die toevallig toch de beste kan zijn).\n\nDit is "freeware". Commercieel gebruik, ongeacht hoe, is zonder schriftelijke toestemming van de auteur niet toegestaan.\n____________________________________________________________________________\n\nFor every computer turn the best move is determined.\nWith a play strength of max, mid and min the best move is made in 100%, 50% and 0% of the cases respectively. If the best move is not made the foregoing is repeated for the next to best move (if any), and so on. If no best move is found or allowed a random move is made (which can still be the best move).\n\nThis is freeware. Commercial use, no matter how, is not allowed without written permission by the author.\n\n\n  © Aad van der Arend 2000    '+mijnmeeladres;

sterkte=50;

function wyzsterkte(x){
	sterkte=x;
}

function evtZet(){
	//deze functie wordt voor elke Cbeurt voor diverse situaties, dus vaak aangeroepen
	//dit geeft een grotere willekeurigheid in het spelen dan wanneer alleen aan het begin
	//van de Cbeurt getest wordt of de zet willekeurig moet zijn; in dat geval maakt het niet
	//of de zet de eerste of de laatste is; het spel was saaier dan nu;
	//
	if(Vrvak<0&&sterkte>=Math.random()*100-13){evtZ=true}else{evtZ=false};
	if(sterkte==0)evtZ=false;
	return evtZ;
}

function doereset(){	
	//om vinkjes en sterkte na reload te laten kloppen mag in de tags van de radioknoppen geen Checked staan
	if(sterkte==50)document.speelsterkte.Rd[2].checked=true;	//is nodig om bij start aan te vinken
	//herstel sterkte bij "Load" en "opnieuw"; zie ook boven over sterkte:
	for(i=0;i<5;i++){
		if(document.speelsterkte.Rd[i].checked){
			sterkte=document.speelsterkte.Rd[i].value;
			break;
		}
	}
	beginbeurt=-beginbeurt;
	beurt=beginbeurt;
	Nvrij=9;
	Mbeurtnr=0;
	Cbeurtnr=0;
	Cxvorig=9;Cyvorig=9;
	for(i=0;i<9;i++){
		Vak[i]='L';
		DID('V'+i).src=imL;
	}
	if(beginbeurt==-1)Cbeurt();
	window.focus();
}

function wis(){
	document.scores.scoreM.value='';ScM=0;
	document.scores.scoreC.value='';ScC=0;
}

function VnrConvert(Vnr){			// verwerking integer vaknummer
	Vx=Vnr%3;
	Vy=Math.round((Vnr-Vx)/3);
}
	
function Mbeurt(Vn){
	if(beurt==-1 || Nvrij<1||Vak[Vn]!='L')return;
	Mx2=Mx1;
	My2=My1;
	Mx1=Vn%3;
	My1=Math.round((Vn-Mx1)/3);
	Mbeurtnr++							//1e Mbeurt heeft nummer 1
	Vak[Vn]='M';
	DID('V'+Vn).src=imM;
	Nvrij--;
	beurt=-beurt;
	Mlaatst=Vn
	Check3opLijn('M');
	if(Nvrij>0)Cbeurt()	
}

function Rndvak(){				//bepaal een willekeurig vak    Vrvak   uit het bereik 0...8 dat bovendien vrij is
	i=-1;Vrvak=-1
	vrijvak=Math.round(Math.random()*(Nvrij-1))	//vrijvak is een willekeurig nr.uit een bereik 0...Nvrij
	while(i<vrijvak && Vrvak<8){			//lege vakken tellen totdat telling==vrijvak
		Vrvak++
		if(Vak[Vrvak]=='L')i++
	}	
}

function Rndhoek(){
	Vrvak=4;			//er is een beginwaarde (0..8) nodig
	while(Vrvak==4||Vak[Vrvak]!='L'){
		Vrvak=Math.round(Math.random()*3);
		if(Vrvak>1)Vrvak++;
		Vrvak=Vrvak*2;
	}
}
function Rndnaasthoek(){
	Vrvak=4;			//er is een beginwaarde (0..8) nodig
	while(Vrvak==4||Vak[Vrvak]!='L'){
		Vrvak=Math.round(Math.random()*3);
		Vrvak=Vrvak*2;
		Vrvak++;
	}
}

function Csper(sper){
	if(Vak[sper]=='L'){
		if(speler=='M'){Cspervak[Cspervakgevuld]=sper;Cspervakgevuld++};
		if(speler=='C'){Vrvak=sper};
	}
}

function Check2opLijn(x){
	speler=x;
	Cspervakgevuld=0;
	//horizontaal
		if(Vak[0]==speler&&Vak[1]==speler)	Csper(2);
		if(Vak[0]==speler&&Vak[2]==speler)	Csper(1);
		if(Vak[1]==speler&&Vak[2]==speler)	Csper(0);
		if(Vak[3]==speler&&Vak[4]==speler)	Csper(5);
		if(Vak[3]==speler&&Vak[5]==speler)	Csper(4);
		if(Vak[4]==speler&&Vak[5]==speler)	Csper(3);
		if(Vak[6]==speler&&Vak[7]==speler)	Csper(8);
		if(Vak[6]==speler&&Vak[8]==speler)	Csper(7);
		if(Vak[7]==speler&&Vak[8]==speler)	Csper(6);
	//verticaal
		if(Vak[0]==speler&&Vak[3]==speler)	Csper(6);
		if(Vak[0]==speler&&Vak[6]==speler)	Csper(3);
		if(Vak[3]==speler&&Vak[6]==speler)	Csper(0);
		if(Vak[1]==speler&&Vak[4]==speler)	Csper(7);
		if(Vak[1]==speler&&Vak[7]==speler)	Csper(4);
		if(Vak[4]==speler&&Vak[7]==speler)	Csper(1);
		if(Vak[2]==speler&&Vak[5]==speler)	Csper(8);
		if(Vak[2]==speler&&Vak[8]==speler)	Csper(5);
		if(Vak[5]==speler&&Vak[8]==speler)	Csper(2);
	//diagonaal
		if(Vak[4]==speler&&Vak[0]==speler)	Csper(8);
		if(Vak[4]==speler&&Vak[8]==speler)	Csper(0);
		if(Vak[4]==speler&&Vak[2]==speler)	Csper(6);
		if(Vak[4]==speler&&Vak[6]==speler)	Csper(2);
		if(Vak[0]==speler&&Vak[8]==speler)	Csper(4);
		if(Vak[2]==speler&&Vak[6]==speler)	Csper(4);
}

function Checkkruispt(){
	kruispt1=Mx1+My2*3;
	kruispt2=Mx2+My1*3;
	kruis1=true;
	kruis2=true;
	v0=Mx1;v1=Mx1+3;v2=Mx1+6;v3=My2*3;v4=v3+1;v5=v3+2;	//vakken van eerste paar kruisende lijnen
	if(Vak[kruispt1]!='L'||Vak[v0]=='C'||Vak[v1]=='C'||Vak[v2]=='C'||Vak[v3]=='C'||Vak[v4]=='C'||Vak[v5]=='C')kruis1=false;
	v0=Mx2;v1=Mx2+3;v2=Mx2+6;v3=My1*3;v4=v3+1;v5=v3+2;	//vakken van tweede paar kruisende lijnen
	if(Vak[kruispt2]!='L'||Vak[v0]=='C'||Vak[v1]=='C'||Vak[v2]=='C'||Vak[v3]=='C'||Vak[v4]=='C'||Vak[v5]=='C')kruis2=false;
	if(kruis1||kruis2){
		if(Vak[4]=='L'){		//heeft voorrang (ivm evt combinatie met diagonaal), maar alleen als er een kruis is
			Vrvak=4;
		}
		else{
			while(Vrvak<0){
				i=Math.round(Math.random());
				if(i==0&&kruis1){Vrvak=kruispt1};
				if(i==1&&kruis2){Vrvak=kruispt2};
			}
		}
	}
}

function Check3opLijn(x){
	speler=x;
	if(Vak[0]==speler&&Vak[1]==speler&&Vak[2]==speler)	toonwin(speler,0,1,2);
	if(Vak[3]==speler&&Vak[4]==speler&&Vak[5]==speler)	toonwin(speler,3,4,5);
	if(Vak[6]==speler&&Vak[7]==speler&&Vak[8]==speler)	toonwin(speler,6,7,8);
	if(Vak[0]==speler&&Vak[3]==speler&&Vak[6]==speler)	toonwin(speler,0,3,6);
	if(Vak[1]==speler&&Vak[4]==speler&&Vak[7]==speler)	toonwin(speler,1,4,7);
	if(Vak[2]==speler&&Vak[5]==speler&&Vak[8]==speler)	toonwin(speler,2,5,8);
	if(Vak[0]==speler&&Vak[4]==speler&&Vak[8]==speler)	toonwin(speler,0,4,8);
	if(Vak[2]==speler&&Vak[4]==speler&&Vak[6]==speler)	toonwin(speler,2,4,6);
}

function toonwin(x,va,vb,vc){
	speler=x;
	Nvrij=0;
	if(speler=='M'){afb=imMwin}else{afb=imCwin};
	DID('V'+va).src=afb;
	DID('V'+vb).src=afb;
	DID('V'+vc).src=afb;
	if(speler=='M'){
		ScM++;document.scores.scoreM.value='   '+ScM.toString();
		doegeluid('mwint','mwint.wav');
	}
	if(speler=='C'){
		ScC++;document.scores.scoreC.value='   '+ScC.toString();
		doegeluid('cwint','cwint.wav');		//staan, zoals van een plaatje
	}
}

function Cbeurt(){
	//LET OP: bestezet() wordt voor elke situatie opnieuw berekend;
	//daarom wordt voor elke volgende situatie ook getest op Vrvak<0 dat zo kan zijn als in vorige situatie bestezet()=false
	//voor verder commentaar op bestezet() zie bij die functie
	Vrvak=-1;
	Cbeurtnr++							//1e Cbeurt heeft nummer 1
	if(Cbeurtnr==1){
		//situatie 1:
		if(evtZet()&&Mbeurtnr==0)Rndvak();
		//situatie 2:
		//defensief: anders na 2e M zet al grote kans op zeker verlies
		if(evtZet()&&Mbeurtnr==1&&Vak[4]=='L')Vrvak=4;
		//situatie 3:
		//defensief:
		if(evtZet()&&Vak[4]=='M')Rndhoek();
		VnrConvert(Vrvak);
		if(Vx==0){Vxdiam=2}else{Vxdiam=0};
		if(Vy==0){Vydiam=2}else{Vydiam=0};
		hoekdiamC=Vxdiam+Vydiam*3;
		Cxvorig=Vx;
		Cyvorig=Vy;
	}
	//situatie4:
	//offensief: om een lijn met 2 C's met een C vol te maken en dus spel te WINNEN
	if(evtZet()&&Cbeurtnr>1){Check2opLijn('C')};
	//situatie 5
	//defensief: om een lijn met 2 M's met een C vol te maken
	if(evtZet()&&Cbeurtnr>1){
		Check2opLijn('M');
		Le=Cspervakgevuld;
		if(Le>0){
			Vrvak=Cspervak[Math.round(Math.random()*(Le-1))];
		}
	}
	//situatie 6:
	//defensief: om bij 2e zet in geval van een diagonaal met MCM een C naast een hoek te zetten
	if(evtZet()&&Cbeurtnr==2&&Vak[4]=='C'&&((Vak[0]=='M'&&Vak[8]=='M')||(Vak[2]=='M'&&Vak[6]=='M'))){Rndnaasthoek()};
	//situatie 7:
	//defensief: om bij 2e zet in geval van een diagonaal met MMC een C op een hoek te zetten
	if(evtZet()&&Cbeurtnr==2&&Vak[4]=='M'&&Vak[hoekdiamC]=='M'){Rndhoek()};
	//situatie 8:
	//defensief: om op een van 2 kruisende lijnen met elk slechts 1 M een C te zetten
	if(evtZet()&&Cbeurtnr>1&&Mx1!=Mx2&&My1!=My2)Checkkruispt();
	//situatie 9:
	//offensief: om een haakse sprong te maken (Vrvak is na voorgaande nog < 0 !!)
	if(evtZet()&&Cbeurtnr>1){
		k=0
		while((Vx==Cxvorig||Vy==Cyvorig)&&k<20){
			Rndvak();
			VnrConvert(Vrvak);
			k++;
		}
	}
	//situatie 10:
	//om de "beste" zet te doen of een willekeurige (Vrvak=-1) als er geen beste is
	if(Vrvak<0)Rndvak();	//omdat geen beste zet gevonden of toegestaan is: een willekeurige zet doen
	Vak[Vrvak]='C';
	DID('V'+Vrvak).src=imC;
	Nvrij--;
	Check3opLijn('C');
	beurt=-beurt;
}

