#pragma TextEncoding = "UTF-8" #pragma rtGlobals=3 // Use modern global access method and strict wave access #pragma DefaultTab={3,20,4} // Set default tab width in Igor Pro 9 and later function createdata() make/N=(15*15)/O pan_x,pan_y pan_x=mod(p,15) pan_y=floor(p/15) make/N=(15,15)/O player1=0,player2=0,watk=0,wdef=0 make/O/N=5 refp_y={3,3,7,11,11} make/O/N=5 refp_x={3,11,7,3,11} make/O/N=15 labelwave=p make/O/T/N=15 labeltxt={"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O"} buildweightmap() variable/G player=0,gameover end function createqipan() variable i,n=15 createdata() for(i=0;i=1) return 0 endif w[x0][y0]=1 wave pan_y variable n0=y0*15+x0 if(player==0) ModifyGraph marker(pan_y[n0])=100,msize(pan_y[n0])=12,rgb(pan_y[n0])=(0,0,0) else ModifyGraph marker(pan_y[n0])=100,msize(pan_y[n0])=12,rgb(pan_y[n0])=(65535,0,0) endif doupdate end function getwinorloss(x0,y0,player) variable x0,y0,player wave w=$"player"+num2str(player+1) if(checkline5(x0,y0,1,0,w)==1) return 1 elseif(checkline5(x0,y0,1,1,w)==1) return 1 elseif(checkline5(x0,y0,1,-1,w)==1) return 1 elseif(checkline5(x0,y0,0,1,w)==1) return 1 else return 0 endif end function checkline5(x0,y0,dx,dy,w) variable x0,y0,dx,dy wave w variable k=0 variable x00=x0,y00=y0 do x0+=dx y0+=dy if(x0>14||y0>14||x0<0||y0<0) break endif if(w[x0][y0]==1) k+=1 else break endif if(k==4) return 1 endif while(1) x0=x00 y0=y00 do x0-=dx y0-=dy if(x0>14||y0>14||x0<0||y0<0) break endif if(w[x0][y0]==1) k+=1 else break endif if(k==4) return 1 endif while(1) return 0 end Function ButtonProc(ctrlName) : ButtonControl String ctrlName wave player1,player2 player1=0 player2=0 variable x0,y0 removefromgraph pan_y wave pan_y,pan_x appendtograph pan_y vs pan_x ModifyGraph mode(pan_y)=3,mrkThick(pan_y)=0,lsize(pan_y)=0 TitleBox title0 title="Playing..." [x0,y0]=AIChess() nvar player,gameover,aifirst if(aifirst) gameover=0 player=0 setqizi(x0,y0,player) player=!player else gameover=0 player=1 endif setwindow Graph0,hook(myhook)=MyWindowHook End ///function AI //AI first function/S buildweightmap() string/G map_atk="" string/G map_def="" map_atk+="*****=100000;",map_def+="ooooo=30000;" map_atk+="-****-=5000;",map_def+="-oooo-=3000;" map_atk+="*-***=700;",map_def+="o-ooo=150;" map_atk+="***-*=700;",map_def+="ooo-o=150;" map_atk+="-****o=1000;",map_def+="-oooo=200;" map_atk+="o****-=1000;",map_def+="*oooo-=200" map_atk+="**-**=700;",map_def+="oo-oo=200;" map_atk+="-***-=500;",map_def+="-ooo-=100;" map_atk+="*-**=150;",map_def+="o-oo=50;" map_atk+="**-*=150;",map_def+="oo-o=50;" map_atk+="--***o=100;",map_def+="--ooo=20;" map_atk+="o***--=100;",map_def+="ooo--=20;" map_atk+="-*-**o=80;",map_def+="-o-oo=15;" map_atk+="o**-*-=80;",map_def+="*oo-o-=15;" map_atk+="-**-*o=60;",map_def+="-oo-o*=10;" map_atk+="o*-**-=60;",map_def+="*o-oo-=10;" map_atk+="*--**=60;",map_def+="o--oo=10;" map_atk+="**--*=60;",map_def+="oo--o=10;" map_atk+="*-*-*=60;",map_def+="o-o-o=10;" map_atk+="o-***-o=60;",map_def+="*-ooo-*=2;" map_atk+="--**--=50;",map_def+="--oo--=2;" map_atk+="-*-*-=20;",map_def+="-o-o-=2;" map_atk+="*--*=20;",map_def+="o--o=2;" map_atk+="---**o=10;",map_def+="---oo*=1;" map_atk+="o**---=10;",map_def+="*oo---=1;" map_atk+="--*-*o=10;",map_def+="--o-o*=1;" map_atk+="o*-*--=10;",map_def+="*o-o--=1;" map_atk+="-*--*o=10;",map_def+="-o--o*=1;" map_atk+="o*--*-=10;",map_def+="*o--o-=1;" map_atk+="*---*=10;",map_def+="o---o=1;" end function [variable x0,variable y0]AIChess() variable i,j wave player1,player2 if(sum(player1)==0&&sum(player2)==0) return [7,7] endif putallweiht(player1,player2) wave watk,wdef variable vatkmax=wavemax(watk) variable vdefmax=wavemax(wdef) make/O/N=(225,2) posatk,posdef variable k1=findmaxindex(watk,posatk) variable k2=findmaxindex(wdef,posdef) k1=findatkdefmax(posatk,wdef) k2=findatkdefmax(posdef,watk) variable index1=floor((enoise(0.5)+0.5)*k1) variable index2=floor((enoise(0.5)+0.5)*k2) if(vatkmax>vdefmax) x0=posatk[index1][0] y0=posatk[index1][1] else x0=posdef[index2][0] y0=posdef[index2][1] endif return [x0,y0] end function findatkdefmax(posatk,wdef) wave posatk,wdef variable i,n=dimsize(posatk,0) make/free/N=(n) wtmp,windex=p wtmp=wdef[posatk[p][0]][posatk[p][1]] sort/R wtmp,wtmp,windex duplicate/free posatk wtmp2 wtmp2=posatk[windex[p]][q] duplicate/O wtmp2 posatk variable k=1,v0 v0=wtmp[0] for(i=1;i0) return -1 endif string schain=getchain7(p0,q0,w1,w2) svar map_atk variable i,j variable value=0 string s0,s1,s2 for(i=0;i<28;i++) s0=stringfromlist(i,schain) for(j=0;j<30;j++) s1=stringfromlist(j,map_atk) s2=getstring(s1) if(strsearch(s0,s2,0)!=-1) value+=str2num(stringbykey(s2,s1,"=")) endif endfor endfor return value end function getdefvalue(p0,q0,w1,w2) variable p0,q0 wave w1,w2 if(w1[p0][q0]+w2[p0][q0]>0) return -1 endif string schain=getchain7def(p0,q0,w1,w2) svar map_def variable i,j variable value=0 string s0,s1,s2 for(i=0;i<28;i++) s0=stringfromlist(i,schain) for(j=0;j<30;j++) s1=stringfromlist(j,map_def) s2=getstring(s1) if(strsearch(s0,s2,0)!=-1) value+=str2num(stringbykey(s2,s1,"=")) endif endfor endfor return value end function/s getstring(s0) string s0 variable i0=strsearch(s0,"=",0) return s0[0,i0-1] end function/S getchain7(p0,q0,w1,w2) variable p0,q0 wave w1,w2 variable i,j string s0="",s1="" w1[p0][q0]=1 for(i=0;i<7;i++) for(j=0;j<7;j++) s0+=isaichess(w1,w2,p0-i+j,q0) //hor endfor s0+=";" for(j=0;j<7;j++) s0+=isaichess(w1,w2,p0,q0-i+j) //ver endfor s0+=";" for(j=0;j<7;j++) s0+=isaichess(w1,w2,p0-i+j,q0-i+j) //dig endfor s0+=";" for(j=0;j<7;j++) s0+=isaichess(w1,w2,p0+i-j,q0-i+j) endfor s0+=";" endfor w1[p0][q0]=0 return s0 end function/S getchain7def(p0,q0,w1,w2) variable p0,q0 wave w1,w2 variable i,j string s0="",s1="" w1[p0][q0]=1 for(i=0;i<7;i++) for(j=0;j<7;j++) s0+=isuserchess(w1,w2,p0-i+j,q0) //hor endfor s0+=";" for(j=0;j<7;j++) s0+=isuserchess(w1,w2,p0,q0-i+j) //ver endfor s0+=";" for(j=0;j<7;j++) s0+=isuserchess(w1,w2,p0-i+j,q0-i+j) //dig endfor s0+=";" for(j=0;j<7;j++) s0+=isuserchess(w1,w2,p0+i-j,q0-i+j) endfor s0+=";" endfor w1[p0][q0]=0 return s0 end function/S isaichess(w1,w2,p0,q0) wave w1,w2 variable p0,q0 if(p0>14||p0<0||q0>14||q0<0) return "" endif if(w1[p0][q0]==1) return "*" elseif(w2[p0][q0]==1) return "o" else return "-" endif end function/S isuserchess(w1,w2,p0,q0) wave w1,w2 variable p0,q0 if(p0>14||p0<0||q0>14||q0<0) return "" endif if(w1[p0][q0]==1) return "o" elseif(w2[p0][q0]==1) return "*" else return "-" endif end Function CheckProc(ctrlName,checked) : CheckBoxControl String ctrlName Variable checked nvar aifirst if(checked) aifirst=1 else aifirst=0 endif End Function CustomMarkerProc(s) STRUCT WMMarkerHookStruct &s if( s.marker > 0 ) return 0 endif Variable size= s.size - s.penThick/2 if( s.marker == 0 ) DrawOval s.x-size,s.y-size,s.x+size,s.y+size SetDrawEnv linefgc= (65535,65535,65535,52428) SetDrawEnv fillfgc= (65535,65535,65535) variable cx=s.x,cy=s.y DrawOval cx-size/6,cy-size/6,cx+size/6,cy+size/6 endif return 1 End macro InvokeGame() createqipan() dowindow/F Graph0 if(!V_Flag) Graph0() endif end Window Graph0() : Graph PauseUpdate; Silent 1 // building window... Display /W=(311.4,49.7,845.1,554.6) h0_y vs h0_x as "Igor-GoBang" AppendToGraph v0_y vs v0_x AppendToGraph h1_y vs h1_x AppendToGraph v1_y vs v1_x AppendToGraph h2_y vs h2_x AppendToGraph v2_y vs v2_x AppendToGraph h3_y vs h3_x AppendToGraph v3_y vs v3_x AppendToGraph h4_y vs h4_x AppendToGraph v4_y vs v4_x AppendToGraph h5_y vs h5_x AppendToGraph v5_y vs v5_x AppendToGraph h6_y vs h6_x AppendToGraph v6_y vs v6_x AppendToGraph h7_y vs h7_x AppendToGraph v7_y vs v7_x AppendToGraph h8_y vs h8_x AppendToGraph v8_y vs v8_x AppendToGraph h9_y vs h9_x AppendToGraph v9_y vs v9_x AppendToGraph h10_y vs h10_x AppendToGraph v10_y vs v10_x AppendToGraph h11_y vs h11_x AppendToGraph v11_y vs v11_x AppendToGraph h12_y vs h12_x AppendToGraph v12_y vs v12_x AppendToGraph h13_y vs h13_x AppendToGraph v13_y vs v13_x AppendToGraph h14_y vs h14_x AppendToGraph v14_y vs v14_x AppendToGraph refp_y vs refp_x AppendToGraph pan_y vs pan_x ModifyGraph userticks(bottom)={labelwave,labeltxt} ModifyGraph width={Aspect,1},gbRGB=(65535,47802,16962) ModifyGraph mode(refp_y)=3,mode(pan_y)=3 ModifyGraph marker(refp_y)=19 ModifyGraph lSize(h0_y)=2,lSize(v0_y)=2,lSize(h14_y)=2,lSize(v14_y)=2,lSize(pan_y)=0 ModifyGraph rgb(h0_y)=(0,0,0),rgb(v0_y)=(0,0,0),rgb(h1_y)=(0,0,0),rgb(v1_y)=(0,0,0) ModifyGraph rgb(h2_y)=(0,0,0),rgb(v2_y)=(0,0,0),rgb(h3_y)=(0,0,0),rgb(v3_y)=(0,0,0) ModifyGraph rgb(h4_y)=(0,0,0),rgb(v4_y)=(0,0,0),rgb(h5_y)=(0,0,0),rgb(v5_y)=(0,0,0) ModifyGraph rgb(h6_y)=(0,0,0),rgb(v6_y)=(0,0,0),rgb(h7_y)=(0,0,0),rgb(v7_y)=(0,0,0) ModifyGraph rgb(h8_y)=(0,0,0),rgb(v8_y)=(0,0,0),rgb(h9_y)=(0,0,0),rgb(v9_y)=(0,0,0) ModifyGraph rgb(h10_y)=(0,0,0),rgb(v10_y)=(0,0,0),rgb(h11_y)=(0,0,0),rgb(v11_y)=(0,0,0) ModifyGraph rgb(h12_y)=(0,0,0),rgb(v12_y)=(0,0,0),rgb(h13_y)=(0,0,0),rgb(v13_y)=(0,0,0) ModifyGraph rgb(h14_y)=(0,0,0),rgb(v14_y)=(0,0,0),rgb(refp_y)=(0,0,0) ModifyGraph msize(refp_y)=2 ModifyGraph mrkThick(pan_y)=0 ModifyGraph nticks=10 ModifyGraph standoff=0 ModifyGraph axThick=0 ModifyGraph tlOffset=-6 TitleBox title0,pos={57.00,533.00},size={55.00,21.00},title="Playing..." TitleBox title0,font="Comic Sans MS",fSize=14,frame=0,fColor=(0,0,65535) Button button0,pos={426.00,532.00},size={100.00,20.00},proc=ButtonProc Button button0,title="New Game" CheckBox check0,pos={334.00,533.00},size={53.00,17.00},proc=CheckProc CheckBox check0,title="AI First",value=0 SetWindow kwTopWin,hook(myhook)=MyWindowHook SetWindow kwTopWin,markerHook={CustomMarkerProc,100,100} EndMacro