您的位置:寻梦网首页编程乐园JavaScript>JavaScript 行棋游戏
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  来源:奥索)