技术交流 · 2009 年 4 月 17 日 0

双人版五子棋游戏

<!–
程序名称:双玩家版五子棋游戏(JavaScript版)
程序制作:付江云 © www.fujiangyun.com.cn
说明:本程序采取的是玩家交替下棋的思想,没选手下棋采用标志flag来标记,进行了空格子判断后对该棋格进行相应的修改,然后从四个方向判断是否有连续Z个棋子,有则宣布flag方胜利并重新加载页面,否则交换选手,即对flag进行变换。关键看panduan()函数,如果有什么问题或者好的建议欢迎留言交流。
页面画20*20的棋格需要10秒左右。
对于和电脑对弈的目前还没打算做,不过根据这种思想,我觉得做个扫雷游戏会比较好,或者作寻路算法问题会比较直观。
谢谢:)
–>
<html>
<head>
<title>五子棋游戏</title>
<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″ />
</head>
<body>
<script language=”javascript”>
<!–
var N=20;//定义棋盘的横向格子数
var M=20;//定义棋盘的纵向格子数
var Z=5;//几子相连算赢
var i,j,temp,flag=1;
var a=new Array();//定义一个数组,用以判断格子的状态
a[0]=” “;
a[1]=”X “;
a[2]=”O “;
function huaqipan()//换棋盘函数
{
document.body.innerHTML+=”<form name=qipan id=qipan></form>”;
huagezi();
}
function huagezi()//画格子函数
{
for(i=1;i<=M;i++)
{
for(j=1;j<=N;j++)
{
temp=(i-1)*N+j;
qipan.innerHTML+=”<button id=”+temp+” name=”+temp+” onClick=xiaqi(this)>”+a[0]+”</button>”;
}
qipan.innerHTML+=”<br>”;
}
}
function xiaqi(obj)//没下一步棋执行该函数
{
if(obj.value!=a[0])
alert(“该格已有棋子!”);
else
{
obj.value=a[flag];
i=parseInt(obj.name);
panduan(i);
if(flag==1)
flag=2;
else
flag=1;
}
}
function panduan(num)//判断一方下完一步棋后是否胜出(本程序的核心部分)
{
k=num;
l=0;
//判断横向
while((k%N)!=1&&document.getElementById(k).value==a[flag])
{
k–;
}
if(document.getElementById(k).value!=a[flag]) k++;
while(document.getElementById(k).value==a[flag])
{
if((k%N)==0)
{
l++;
break;
}
k++;
l++;
}
if(l==Z)
{
alert(flag+”方胜利!重新开始?”);
window.location.reload();
}
l=0;
k=num;
//判断纵向
if((k%N)!=0)
{
while((parseInt(k/N)+1)!=1&&document.getElementById(k).value==a[flag])
{
k=k-N;
}
if(document.getElementById(k).value!=a[flag]) k=k+N;
while(document.getElementById(k).value==a[flag])
{
if((parseInt(k/N)+1)==M)
{
l++;
break;
}
k=k+N;
l++;
}
}
else
{
while(parseInt(k/N)!=1&&document.getElementById(k).value==a[flag])
{
k=k-N;
}
if(document.getElementById(k).value!=a[flag]) k=k+N;
while(document.getElementById(k).value==a[flag])
{
if(parseInt(k/N)==M)
{
l++;
break;
}
k=k+N;
l++;
}
}
if(l==Z)
{
alert(flag+”方胜利!重新开始?”);
window.location.reload();
}
l=0;
k=num;
//判断左斜
if((k%N)!=0)
{
while((k%N)!=1&&(parseInt(k/N)+1)!=1&&document.getElementById(k).value==a[flag])
{
k=k-N-1;
}
if(document.getElementById(k).value!=a[flag]) k=k+N+1;
while(document.getElementById(k).value==a[flag])
{
if((k%N)==0||(parseInt(k/N)+1)==M)
{
l++;
break;
}
k=k+N+1;
l++;
}
}
else
{
while((k%N)!=1&&parseInt(k/N)!=1&&document.getElementById(k).value==a[flag])
{
k=k-N-1;
}
if(document.getElementById(k).value!=a[flag]) k=k+N+1;
while(document.getElementById(k).value==a[flag])
{
if((k%N)==0||parseInt(k/N)==M)
{
l++;
break;
}
k=k+N+1;
l++;
}
}
if(l==Z)
{
alert(flag+”方胜利!重新开始?”);
window.location.reload();
}
l=0;
k=num;
//判断右斜
if((k%N)!=0)
{
while((k%N)!=1&&(parseInt(k/N)+1)!=M&&document.getElementById(k).value==a[flag])
{
k=k+N-1;
}
if(document.getElementById(k).value!=a[flag]) k=k-N+1;
while(document.getElementById(k).value==a[flag])
{
if((k%N)==0||(parseInt(k/N)+1)==1)
{
l++;
break;
}
k=k-N+1;
l++;
}
}
else
{
while((k%N)!=1&&parseInt(k/N)!=M&&document.getElementById(k).value==a[flag])
{
k=k+N-1;
}
if(document.getElementById(k).value!=a[flag]) k=k-N+1;
while(document.getElementById(k).value==a[flag])
{
if((k%N)==0||parseInt(k/N)==1)
{
l++;
break;
}
k=k-N+1;
l++;
}
}
if(l==Z)
{
alert(flag+”方胜利!重新开始?”);
window.location.reload();
}
}
onload=huaqipan;
//–>
</script>
</body>
</html>