var?chessBoard=[];//二維數(shù)組來存儲交叉點落子情況
var?me=true;
var?over=false;
/*贏法數(shù)組(三維)*/
var?wins=[];
/*贏法的統(tǒng)計數(shù)組*/
var?mywin=[];
var?computerwin=[];
//二維數(shù)組來存儲交叉點落子情況
for(var?i=0;i<15;i++)
{
chessBoard[i]=[];
for(var?j=0;j<15;j++){
//初始化,0代表未落子為空
chessBoard[i][j]=0;
}
}
/*三維數(shù)組*/
for(var?i=0;i<15;i++){
wins[i]=[];
?for(var?j=0;j<15;j++){
? wins[i][j]=[];
?}
}
/*贏法種類的索引*/
var?count=0;/*橫線*/
for(var?i=0;i<15;i++){
for(var?j=0;j<11;j++){
//wins[0][0][0]=true;
//wins[0][1][0]=true;
//wins[0][2][0]=true;
//wins[0][3][0]=true;
//wins[0][4][0]=true;
for(var?k=0;k<5;k++){
wins[i][j+k][count]=true;
}
count++;
}
}
/*豎線*/
for(var?i=0;i<15;i++){
for(var?j=0;j<11;j++){
for(var?k=0;k<5;k++){
wins[j+k][i][count]=true;
}
count++;
}
}
/*斜線*/
for(var?i=0;i<11;i++){
for(var?j=0;j<11;j++){
for(var?k=0;k<5;k++){
wins[i+k][j+k][count]=true;
}
count++;
}
}
/*反斜線*/
for(var?i=0;i<11;i++){
for(var?j=14;j>3;j--){
for(var?k=0;k<5;k++){
wins[i+k][j-k][count]=true;
}
count++;
}
}
console.log(count);
//初始化贏法統(tǒng)計數(shù)組
for(var?i=0;i<count;i++){
mywin[i]=0;
computerwin[i]=0;
}
var?chess=document.getElementById('chess');
var?context=chess.getContext('2d');
context.strokeStyle="BFBFBF";
var?icon=new?Image();
icon.src="../css/images/icon.png";
icon.onload=function(){
?//繪制北背景圖
context.drawImage(icon,0,0,450,450);
?//繪制五子棋棋盤
drawChessBoard();
?
}
//畫棋盤
var?drawChessBoard=function(){
for(var?i=0;i<15;i++)
{
context.moveTo(15+i*30,15);/*畫橫線,垂直坐標(biāo)不變*/
context.lineTo(15+i*30,435);
context.stroke();
context.moveTo(15,15+i*30);/*畫豎線,橫坐標(biāo)不變*/
context.lineTo(435,15+i*30);
context.stroke();//stroke是用來描邊的
}
}
?var?oneStep=function(i,j,me){
? ?//繪制棋子
context.beginPath();
context.arc(15+i*30,15+j*30,13,0,2*Math.PI);/*圓心坐標(biāo),半徑,弧度*/
context.closePath();
//實現(xiàn)漸變
var?gradient=context.createRadialGradient(15+i*30+2,15+j*30-2,13,15+i*30+2,15+j*30-2,0);
if(me){
gradient.addColorStop(0,"#0A0A0A");
gradient.addColorStop(1,"#636766");}
else?{gradient.addColorStop(0,"#D1D1D1");
gradient.addColorStop(1,"#f9f9f9");}
context.fillStyle=gradient;
//fill是用來填充
context.fill();
}
//落子
chess.onclick=function(e){
if(over){
return;
}//onclick只有在我方下棋時才有效
if(!me){return;}
var?x=e.offsetX;
var?y=e.offsetY;
var?i=Math.floor(x/30);
var?j=Math.floor(y/30);
if(chessBoard[i][j]==0){
oneStep(i,j,me);
chessBoard[i][j]=1;
for(var?k=0;k<count;k++){
if(wins[i][j][k]){
//若存在一個K,使得myWin【k】=5,說明第k種贏法被實現(xiàn)
mywin[k]++;
//6為異常情況,表示不可能贏
computerwin[k]=6;
if(mywin[k]==5){
window.alert("你贏了");
????????????????????over=true;
}
}
}//若沒結(jié)束,下棋權(quán)利給計算機(jī)
if(!over){
me=!me;
computerAI();
}
}
}
var?computerAI=function(){
??var?myScore=[];
??var?computerScore=[]
??//保存最高分?jǐn)?shù)
??var?max=0;
??var?u=0,v=0;
??for(var?i=0;i<15;i++){
?? myScore[i]=[];
?? computerScore[i]=[];
?? for(var?j=0;j<15;j++){
?? myScore[i][j]=0;
?? computerScore[i][j]=0;
?? }
??}
??for(var?i=0;i<15;i++){
?? for(var?j=0;j<15;j++){
?? if(chessBoard[i][j]==0){
?? for(var?k=0;k<count;k++){
?? if(wins[i][j][k]){
?? if(mywin[k]==1){
?? myScore[i][j]+=200;
?? }
?? else?if(mywin[k]==2){
?? myScore[i][j]+=400;
?? }
?? else?if(mywin[k]==3){
?? myScore[i][j]+=2000;
?? }
?? else?if(mywin[k]==4){
?? myScore[i][j]+=10000;
?? }
?? if(computerwin[k]==1){
?? computerScore[i][j]+=220;
?? }
?? else?if(computerwin[k]==2){
?? computerScore[i][j]+=420;
?? }
?? else?if(computerwin[k]==3){
?? computerScore[i][j]+=2100;
?? }
?? else?if(computerwin[k]==4){
?? computerScore[i][j]+=20000;
?? }
?? }
?? }
?? if(myScore[i][j]>max){
?? max=myScore[i][j];
?? u=i;
?? v=j;
?? }
?? else?if(myScore[i][j]==max){
?? if(computerScore[i][j]>computerScore[u][v]){
?? u=i;
?? v=j;
?? }
?? }
?? if(computerScore[i][j]>max){
?? max=computerScore[i][j];
?? u=i;
?? v=j;
?? }
?? else?if(computerScore[i][j]==max){
?? if(myScore[i][j]>myScore[u][v]){
?? u=i;
?? v=j;
?? }
?? }
?? }
?? }
??}
?
?oneStep(u,v,false);
//計算機(jī)落子
?chessBoard[u][v]=2;
for(var?k=0;k<count;k++){
if(wins[u][v][k]){
computerwin[k]++;
mywin[k]=6;
if(computerwin[k]==5){
window.alert("計算機(jī)贏了");
????????????????????over=true;
}
}
}
if(!over){
me=!me;
}
}