// xzero.code




SXEMA: void main(){
	10:if(1);{150,160} // 8
	20:trace("connect ok.");{10} // 7
	30:SendDLL(nameDll,"connect");{20} // 6
	40:SendDLL(nameDll,"setWAY:"+WAY);{30} // 5
	50:LoadDLL(nameDll);{40} // 4
	60:var nameDll="xzero.dll";{50} // 3
start:	70:;{170} // 1
	80:SendDLL(nameDll,"send:quit");{220} // 18
	90:SendDLL(nameDll,"send:{comand}");{80} // 17
	100:rungame(nameDll);{10} // 18
	110:if(str=="game");{100,10} // 17
	120:if(str=="exit");{90,110} // 16
	130:if(str=="deldosvid");{210,120} // 11
	140:str=RecvDLL(nameDll);{130} // 10
	150:SendDLL(nameDll,"slux");{140} // 9
	160:PAGECLOSE;{70} // 20
	170:PAGEOPEN;{60} // 2
	180:amputace(getThisFileName());{120} // 15
	190:trace("Please restart this program.");{180} // 14
	200:trace("-----------------------------------------");{190} // 13
	210:str="exit";{200} // 12
	220:;{160} // 19
}



void initStart(var* doska){
	( *doska)=reserve(3);
	int i=0;
	for(;i<3;++i)(*doska)[i]=reserve(3);
}



void rungame(var nameDll){
	SendDLL(nameDll,"slux");
	str=RecvDLL(nameDll);
	var xod={a:((string)str[0]); b:((string)str[1]); xod:1; xodov:0; };
	var doska;
	initStart(&doska);
	while(1){
		SendDLL(nameDll,"slux");
		str=RecvDLL(nameDll);
		trace(str);
		if(str=="exitgame")break;
		if(str=="whotxod"){if(xod["xodov"]<9)oneXod(nameDll,doska,xod);}
		if(str.substr(0,7)=="onexod:"){
			str=str.substr(7);
			v=split(",",str);
			x=v[0];
			y=v[1];
			doska[x][y]=xod["xod"];
			continue;
			}
		if(str=="winer"){if(xod["a"]==1||xod["b"]==1){
			xod["xodov"]=9;
			s=xod["xod"]==1?"x":"0";
			addMatrex(doska,xod["xod"]==1?0:2);
			}}
		if(str=="next"){
			xod["xod"]=3-xod["xod"];
			if( ++xod["xodov"]==9)addMatrex(doska,1);
			}
		}
}



void addMatrex(var doska,var ploxo){
	var mm=getDosvid();
	var ok=1;
	int i=0;
	for(;i<mm.size();++i)if(mm[i]["ploxo"]==ploxo){if(mm[i]["p"]==doska){
		ok=0;
		break;
		}};
	if(ok){
		str2="{";
		int i=0;
		for(;i<3;++i){
			if(i)str2+=",";
			str2+=doska[i].export();
			}
		str2+="}";
		str="m.push_back({ploxo:"+ploxo+";p:"+str2+";})";
		var pos=getFunctionRoot("getDosvid");
		++pos;
		++pos;
		pos.inertDown(str);
		++pos;
		trace(pos);
		}
}



var getDosvid(){
	var m={};
	return m;
}



void oneXod(var nameDll,var doska,var xod){
	trace(xod["xodov"]);
	m=getDosvid();
	var x;
	var y;
	var ok=0;
	var fi=xod["xod"]==1?0:2;
	int i=0;
	for(;i<m.size();++i){
		if(m[i]["ploxo"]==fi){
			var d=m[i]["p"];
			int j=0;
			for(;j<4;++j){
				if(j)d=povorot(d);
				var xy=getXYwiner(d,doska,xod["xod"]);
				if(typeof(xy)=="vector"){
					x=xy[0];
					y=xy[1];
					ok=1;
					}
				}
			}
		if(ok==1)break;
		if(m[i]["ploxo"]==2-fi){
			var d=m[i]["p"];
			int j=0;
			for(;j<4;++j){
				if(j)d=povorot(d);
				var xy=getXYluzer(d,doska,xod["xod"]);
				if(typeof(xy)=="vector"){
					x=xy[0];
					y=xy[1];
					ok=2;
					}
				}
			}
		}
	if(!ok){
		x=rozpad([0;3).getN());
		y=rozpad([0;3).getN());
		if(doska[x][y])OFF;
		define();
		}
	SendDLL(nameDll,"send:{comand,xy}");
	SendDLL(nameDll,"send:onexod");
	SendDLL(nameDll,str="send:["+x+","+y+"]");
	Sleep(150);
}



var povorot(var doska){
	var r;
	var x;
	var y;
	initStart(&r);
	y=0;
	for(;y<3;++y){
		x=0;
		for(;x<3;++x){
			r[2-y][x]=doska[x][y];
			}
		}
	return r;
}



var getXYwiner(var d,var original,var xod){
	var r=0;
	var x;
	var y;
	var n=0;
	y=0;
	for(;y<3;++y){
		x=0;
		for(;x<3;++x){
			if( !original[x][y]&&d[x][y]==xod){
				r={x,y};
				++n;
				}
			}
		}
	if(n!=1)r=0;
	return r;
}



var getXYluzer(var d,var original,var xod){
	var r=0;
	var x;
	var y;
	var nx=0;
	var n0=0;
	y=0;
	for(;y<3;++y){
		x=0;
		for(;x<3;++x){
			if( !original[x][y]&&d[x][y]==3-xod){
				r={x,y};
				++n0;
				}
			}
		}
	if(n0!=1)r=0;
	return r;
}


// xzero.code	:-|