|
JavaScript 行棋游戏
<HTML><HEAD> <title>行棋游戏</title> <meta http-equiv=Content-Type content=text/html; charset=gb2312> <script language=javascript><!-- //n=3; //层数,不包括顶点 //K=-1; //K>0表示电脑执白;abs(K)=1表示白先走 var n=2,K,cursel,curpic,curX,curY,toX,toY,mX,mY, amov,moved,comoved,gameover; var pa=new PIECEARRAY(); //初始棋子数组 pa.Add(0,2); pa.Add(0,0); pa.Add(1,0); var bok=new PIECEARRAY(); for(i=0;i<4;i++) bok.Add(0,0); var canmov=new PIECEARRAY(); for(i=0;i<8;i++) canmov.Add(0,0); function w(txt){document.write(txt);} function XPosition(col,row) { if(row<n)return 300+125*col; else return 362; } function YPosition(col,row) { if(row<n)return 53*(n-2-row)+135; else return 25; } function PIECE(col,row) //棋子节点 { this.col=col; this.row=row; this.mok=false; this.qiexn=0; this.sel=-1; return this; } function PIECEARRAY() //棋子数组 { this.total=0; this.Add=Add; this.CheckMoveTo=CheckMoveTo; return this; } function Add(exp1,exp2) { this[this.total++]=new PIECE(exp1,exp2); } function CheckMoveTo(bno,col,row) //测试移动的合法性 { var rval=true; for(var i=0;i<3;i++) if(this[i].col==col&&this[i].row==row)break; else if(row==n&&this[i].row==n)break; if(i<3)rval=false; if(rval) { if(this[bno].row==n&&row==n-1)return true; else if(col>this[bno].col) { if(row-this[bno].row!=0&&row-this[bno].row!=1) rval=false; } else if(col<this[bno].col) { if(row-this[bno].row!=0&&row-this[bno].row!=-1) rval=false; } else if(Math.abs(row-this[bno].row)!=1)rval=false; } return rval; } function MovePiece() //移动棋子 { amov++; if(amov>=49) //移动到位 { document.all('b'+curpic).style.left=toX; document.all('b'+curpic).style.top=toY; if(comoved) //计算机移动结束,等待输入 { if(K>0) //显示移动步骤,并判断胜负 { whmove.innerHTML+='<BR>'+curpic+','+ pa[curpic].col+','+pa[curpic].row; if(pa[1].row==n-1&&pa[2].row==n-1)gameover=true; } else { bkmove.innerHTML+='<BR>'+curpic+','+ pa[curpic].col+','+pa[curpic].row; if(pa[0].row==0)gameover=true; } if(gameover){} else { comoved=false; moved=false; } } else //计算机移动 { if(K>0) { bkmove.innerHTML+='<BR>'+curpic+','+ pa[curpic].col+','+pa[curpic].row; if(pa[0].row==0)gameover=true; } else { whmove.innerHTML+='<BR>'+curpic+','+ pa[curpic].col+','+pa[curpic].row; if(pa[1].row==n-1&&pa[2].row==n-1) gameover=true; } if(gameover){} else { comoved=true; ComMove(); } } } else //继续移动 { var tm=(amov<40)?10:50-amov; setTimeout('MovePiece()',tm); curX+=mX; curY+=mY; document.all('b'+curpic).style.left=curX; document.all('b'+curpic).style.top=curY; } } function qiex(bal,wal1,wal2) //切西指数 { return bal.row*2-bal.col-wal1.col-wal1.row-wal2.col-wal2.row; } function ComMove() //计算机移动棋子 { var i,j,k=0,kt=0; var atnd=qiex(pa[0],pa[1],pa[2]); var btnd1=pa[0].row-pa[1].row; var btnd2=pa[0].row-pa[2].row; var toP=new PIECE(0,0); curpic=-1; if(K>0) //电脑执白 { for(var t_l=1;t_l<=2;t_l++) for(i=-1;i<=1;i++) for(j=-1;j<=1;j++) if((i!=0||j!=0)&&(pa[t_l].col+i==0||pa[t_l].col+i==1) &&pa[t_l].row+j>=0&&pa[t_l].row+j<=n) if(pa.CheckMoveTo(t_l,pa[t_l].col+i,pa[t_l].row+j)) { canmov[k].col=pa[t_l].col+i; canmov[k].row=pa[t_l].row+j; canmov[k].sel=t_l; if(canmov[k].row==n&&canmov[k].col==1)canmov[k].col=0; if(t_l==1)canmov[k].qiexn=qiex(pa[0],canmov[k],pa[2]); else canmov[k].qiexn=qiex(pa[0],pa[1],canmov[k]); k++; } if(btnd1<=0||btnd2<=0) { if(btnd1<btnd2)curpic=1; else if(btnd1>btnd2)curpic=2; var gowalk=-n*2; for(i=0;i<k;i++) if(curpic==canmov[i].sel||curpic<0) if(gowalk<canmov[i].qiexn) { gowalk=canmov[i].qiexn; kt=i; } if(cursel<0)cursel=canmov[kt].sel; toP.col=canmov[kt].col; toP.row=canmov[kt].row; } else { var haveok=false; for(i=0;i<k;i++) if(canmov[i].qiexn%2==0&&(canmov[i].row<pa[0].row||(canmov[i].row==pa[0].row&&pa[3-canmov[i].sel].row==canmov[i].row-1))) { canmov[i].mok=true; haveok=true; } else canmov[i].mok=false; var gowalk=n*2; if(haveok||pa[0].row==n) { if(btnd1<btnd2)curpic=2; else if(btnd1>btnd2)curpic=1; for(i=0;i<k;i++) if(curpic==canmov[i].sel||curpic<0) if(canmov[i].mok&&gowalk>canmov[i].qiexn) { gowalk=canmov[i].qiexn; kt=i; } if(curpic<0)curpic=canmov[kt].sel; toP.col=canmov[kt].col; toP.row=canmov[kt].row; } else { gowalk=-n*2; for(i=0;i<k;i++) if(curpic==canmov[i].sel||curpic<0) if(gowalk<canmov[i].qiexn) { gowalk=canmov[i].qiexn; kt=i; } if(curpic<0)curpic=canmov[kt].sel; toP.col=canmov[kt].col; toP.row=canmov[kt].row; } } } else { curpic=0; for(i=-1;i<=1;i++) for(j=-1;j<=1;j++) if((i!=0||j!=0)&&(pa[0].col+i==0||pa[0].col+i==1)&&pa[0].row+j>=0&&pa[0].row+j<=n) if(pa.CheckMoveTo(0,pa[0].col+i,pa[0].row+j)) { canmov[k].col=pa[0].col+i; canmov[k].row=pa[0].row+j; if(canmov[k].row==n&&canmov[k].col==1)canmov[k].col=0; canmov[k].qiexn=qiex(canmov[k],pa[1],pa[2]); k++; } if(btnd1<=0||btnd2<=0) { var gowalk=n*2; for(i=0;i<k;i++) if(gowalk>canmov[i].qiexn) { gowalk=canmov[i].qiexn; kt=i; } toP.col=canmov[kt].col; toP.row=canmov[kt].row; } else { var haveok=false; for(i=0;i<k;i++) if(canmov[i].qiexn%2==0) { canmov[i].mok=true; haveok=true; } else canmov[i].mok=false; var gowalk=n*2; if(haveok) { for(i=0;i<k;i++) if(canmov[i].mok&&gowalk>canmov[i].qiexn) { gowalk=canmov[i].qiexn; kt=i; } toP.col=canmov[kt].col; toP.row=canmov[kt].row; } else { gowalk=-n*2; for(i=0;i<k;i++) if(gowalk<canmov[i].qiexn) { gowalk=canmov[i].qiexn; kt=i; } toP.col=canmov[kt].col; toP.row=canmov[kt].row; } } } if(curpic<0||curpic>2)alert(curpic+','+toP.col+','+toP.row); curX=XPosition(pa[curpic].col,pa[curpic].row); curY=YPosition(pa[curpic].col,pa[curpic].row); toX=XPosition(toP.col,toP.row); toY=YPosition(toP.col,toP.row); mX=(toX-curX)/50; mY=(toY-curY)/50; moved=true; amov=0; pa[curpic].col=toP.col; pa[curpic].row=toP.row; MovePiece(); } function MoveData() //接受行棋代码移动棋子 { if(moved||gameover)return; var str,split1,split2,bno,col,row,error=0; str=document.forms.inbox.inx.value; split1=str.indexOf(',',0); split2=str.indexOf(',',split1+1); if(split1>0&&split2>0) { bno=eval(str.substring(0,split1)); //棋子代码 col=eval(str.substring(split1+1,split2)); //纵线代码 row=eval(str.substring(split2+1,str.length)); //横线代码 if(row==n&&col==1)error=3; else if(col!=0&&col!=1)error=3; //非法的纵线代码 else if(row<0||row>n)error=4; //非法的横线代码 else if(bno==0) { if(K>0) { if(!pa.CheckMoveTo(bno,col,row))error=-2; } else error=-1; // } else if(bno==1||bno==2) { if(K<0) { if(!pa.CheckMoveTo(bno,col,row))error=-2; } else error=-1; } else error=2; //非法的棋子代码 } else error=1; //参数中应该有两个逗号(三个参数) if(error>0)alert('请检查您输入的行棋参数!'); else if(error==0) { ResetOK(); //选定棋子取消 curpic=bno; curX=XPosition(pa[bno].col,pa[bno].row); curY=YPosition(pa[bno].col,pa[bno].row); toX=XPosition(col,row); toY=YPosition(col,row); mX=(toX-curX)/50; mY=(toY-curY)/50; moved=true; amov=0; pa[bno].col=col; pa[bno].row=row; MovePiece(); } else if(error==-1)alert('你不能移动该棋子!'); else alert('你不能这样移动棋子!'); } function ResetOK() //取消原先的 { if(cursel>=0) for(var i=0;i<4;i++) document.all('bok'+i).style.display='none'; cursel=-1; } function Select(bid) //选定一个棋子 { if(moved||gameover)return; var i,j,k=0; if((bid==0&&K<0)||((bid==1||bid==2)&&K>0))return; //不能移动该棋子 ResetOK(); cursel=bid; for(i=-1;i<=1;i++) for(j=-1;j<=1;j++) if((i!=0||j!=0)&&(pa[cursel].col+i==0||pa[cursel].col+i==1)&&pa[cursel].row+j>=0&&pa[cursel].row+j<=n) if(pa.CheckMoveTo(cursel,pa[cursel].col+i,pa[cursel].row+j)) { bok[k].col=pa[cursel].col+i; bok[k].row=pa[cursel].row+j; if(bok[k].row==n&&bok[k].col==1)bok[k].col=0; var obj=document.all('bok'+k).style; obj.left=XPosition(bok[k].col,bok[k].row); obj.top=YPosition(bok[k].col,bok[k].row); obj.display=''; k++; } } function MoveClick(bno) { curpic=cursel; curX=XPosition(pa[cursel].col,pa[cursel].row); curY=YPosition(pa[cursel].col,pa[cursel].row); toX=XPosition(bok[bno].col,bok[bno].row); toY=YPosition(bok[bno].col,bok[bno].row); mX=(toX-curX)/50; mY=(toY-curY)/50; moved=true; amov=0; pa[cursel].col=bok[bno].col; pa[cursel].row=bok[bno].row; ResetOK(); MovePiece(); } function Victory(player) { } function DrawBox() { boxnn.innerHTML=''; for(var i=0;i<n-1;i++) boxnn.innerHTML+='<img src=box_c.gif><br>'; } function StartGame() { K=0; if(document.forms.setbox.inx.value!="") { var error=0; var str=document.forms.setbox.inx.value; var split=str.indexOf(','); if(split>0) { n=eval(str.substring(0,split)); K=eval(str.substring(split+1,str.length)); if(n<2||K>2||K<-2||K==0)error=1; } else error=1; if(error!=0) { alert('如果要通过输入参数开始游戏,n请注意输入参数的格式!'); document.forms.setbox.inx.focus(); } else { Draw(); } } else { var symbol=0; if(document.forms.setbox.csel[0].checked)symbol=-1; else if(document.forms.setbox.csel[1].checked)symbol=1; if(symbol!=0) { if(document.forms.setbox.fsel[0].checked)K=2*symbol; else if(document.forms.setbox.fsel[1].checked)K=symbol; if(K!=0) { n=eval(document.forms.setbox.level.value); if(n>=2) { Draw(); } else alert('如果不通过输入参数开始游戏,n请输入层数!'); } else alert('如果不通过输入参数开始游戏,n请选择谁先走!'); } else alert('如果不通过输入参数开始游戏,n请选择计算机的颜色!'); } } function Draw() { var i,obj; setboard.style.display='none'; DrawBox(); pa[0].row=n; cursel=-1; moved=false; comoved=false; gameover=false; document.all('b1').style.top=YPosition(0,0); document.all('b2').style.top=YPosition(1,0); for(i=0;i<=2;i++)document.all('b'+i).style.display=''; for(i=0;i<=n;i++) { obj=document.all('num'+i); if(!obj) { append.innerHTML+='<div id=num'+i+' style=display:none;position:absolute;width:30;height:30;left:'+ 270+';top:0;>'+i+'--</div>'; obj=document.all('num'+i); } obj.style.top=(53*(n-i)+35); obj.style.display=''; } boxboard.style.display=''; } //--> </script></HEAD> <BODY leftMargin=0 topMargin=0 bgcolor=#a0efef><P align=center> <table border=0 cellspacing=5 cellpadding=0 id=setboard><tr><FORM name=setbox> <th height=30 style=FONT-SIZE:12pt;COLOR:BLUE>行 棋 游 戏</th></tr><tr> <P align=center> <td align=center>输入参数: <input type=text name=inx size=10> <hr width=300 size=1 color=black> </td></tr><tr><td>或者输入层数:<input type=text name=level size=3> </td></tr><tr><td nowrap>请选择颜色:<input type=radio name=csel value='黑'>计算机执黑 <input type=radio name=csel value='白'>计算机执白 </td></tr><tr><td nowrap>选择先走者:<input type=radio name=fsel value='黑'>执黑者先走 <input type=radio name=fsel value='白'>执白者先走 </td></tr><tr><td align=center><input type=button value=' 开 始 游 戏 ' onclick=StartGame()> <hr width=300 size=1 color=black> </td></tr><tr><td><font color=red>注</font>:请使用800*600*16K以上分辨率;<BR> 输入参数,或保持该输入框为空。<BR> 输入参数时,请输入两个参数:n,K,用逗号分隔。<BR> n表示要输入的层数(n>=2);<BR> K表示选择颜色和先后:<BR> K=1:计算机取白、白先走;<BR> K=2:计算机取白、黑先走;<BR> K=-1:计算机取黑、白先走;<BR> K=-2:计算机取黑、黑先走;<BR> </td></FORM></tr></TABLE> <TABLE width=780 border=0 id=boxboard style=display:none><tr><td width=300 id=bkmove style=FONT-SIZE:12pt;color:#200000 valign=top align=center>黑方行棋<BR></td><td width=163 valign=top> <TABLE border=0 width=100% cellpadding=0 cellspacing=0> <tr><th height=30 style=FONT-SIZE:12pt;COLOR:BLUE>行 棋 游 戏</th></tr> <tr><td><img src=box_t.gif></td></tr> <tr><td id=boxnn valign=top></td></tr> <tr><td><img src=box_b.gif></td></tr> <tr><FORM name=inbox><td align=center><P>行棋参数:<input type=text name=inx size=8> <p><input type=button value=' 走动 ' onclick=MoveData()> <input type=button value=' 重来 ' onclick='location.reload()'> </td></FORM></tr> </TABLE> </td><td width=317 id=whmove style=FONT-SIZE:12pt;color:#200000 valign=top align=center>白方行棋<BR></td></tr> <tr><th colspan=3 height=30 style=FONT-SIZE:12pt;color:red width=100%> <hr width=100% size=1 color=black>行棋规则</th></tr> <tr><td colspan=3> 你可以点击一个棋子来移动它,同时,你也可以通过输入行棋参数的形式来移动棋子。<BR> 你只能移动自己一方的棋子,通过输入行棋参数来移动时,需要输入三个数,使用逗号分隔,三个数分别是:棋子代码、棋盘纵线代码、棋盘横线代码。<BR> 棋子代码表示移动的棋子,可以在棋子上看到,棋盘纵线代码和棋盘横线代码表示棋子要移到的地方,左边一条线的纵线代码为0,右边一条线的纵线代码为1,顶点的纵线代码定义为0。<BR> 横线代码依次从底线为0开始向上依次递增。<BR> 双方每个回合可沿着线条方向移动棋子一步,当白方两个棋子将黑方棋子困在顶点,白方胜;当黑方棋子到达底线,黑方胜。 </td></tr> </table> <script><!-- DrawBox(); for(i=0;i<=2;i++) w('<div id=b'+i+' style=display:none;position:absolute;width:30;height:30;left:'+XPosition(pa[i].col,pa[i].row)+';top:'+YPosition(pa[i].col,pa[i].row)+'><img src=ball'+i+'b.gif border=0 width=30 height=30 onclick=Select('+i+')></div>n'); for(i=0;i<4;i++) w('<div id=bok'+i+' style=display:none;position:absolute;width:30;height:30;left:0;top:0><img src=ballok.gif border=0 width=30 height=30 onclick=MoveClick('+i+')></div>n'); //--> </script><div id=append></div> </BODY></HTML> ---------------------------------------------------------------------- 全文完 (作者:jincoo 来源:奥索) |