var ChessType=true;
var GameOver=false;
//赢法总数
var WinTotal=0;
//棋盘数组,用于记录棋子位置
var ChessBoard=[];
//赢法数组,用于记录所有的赢法
var ChessWinList=[];
//赢法统计数组,用于统计棋子赢法
var ChessWinCnt=[];
var ChessWinList=[];
for(var i=0;i<19;i++)
{
ChessBoard[i]=[];
for(var j=0;j<19;j++)
{
ChessBoard[i][j]=0;
}
}
for(var i=0;i<19;i++)
{
ChessWinList[i]=[];
for(var j=0;j<19;j++)
{
ChessWinList[i][j]=[];
}
}
//横向赢法
for(var i=0;i<19;i++)
{
for(var j=0;j<15;j++)
{
for(var k=0;k<5;k++)
{
ChessWinList[i][j+k][WinTotal]=true;
}
WinTotal++;
}
}
//纵向赢法
for(var j=0;j<19;j++)
{
for(var i=0;i<15;i++)
{
for(var k=0;k<5;k++)
{
ChessWinList[i+k][j][WinTotal]=true;
}
WinTotal++;
}
}
//左对角线赢法
for(var i=0;i<15;i++)
{
for(var j=18;j>3;j--)
{
for(var k=0;k<5;k++)
{
ChessWinList[i+k][j-k][WinTotal]=true;
}
WinTotal++;
}
}
//右对角线赢法
for(var i=0;i<15;i++)
{
for(var j=0;j<15;j++)
{
for(var k=0;k<5;k++)
{
ChessWinList[i+k][j+k][WinTotal]=true;
}
WinTotal++;
}
}
//初始化黑白棋子占所有赢法个数均为0
for(var i=0;i<WinTotal;i++)
{
ChessWinCnt[i]=[];
//0表示黑子占此赢法棋子个数,1表示白子占此赢法棋子个数
ChessWinCnt[i][0]=0;
ChessWinCnt[i][1]=0;
}
/*绘制棋盘*/
function DrowChessBoard() {
var mycanvs=document.getElementById("mycanvas");
var ctx=mycanvs.getContext("2d");
ctx.strokeStyle="#BFBFBF";
for(i=0;i<19;i++)
{
/*横向线条*/
ctx.moveTo(30,30+i*30);
ctx.lineTo(570,30+i*30);
ctx.stroke();
/*纵向线条*/
ctx.moveTo(30+i*30,30);
ctx.lineTo(30+i*30,570);
ctx.stroke();
}
mycanvs.οnclick=PutChess;
ctx.font ="12px Arial"
ctx.fillText('重置',280,600);
}
/*绘制棋子*/
function DrowChess(pos) {
var mycanvs=document.getElementById("mycanvas");
var ctx=mycanvs.getContext("2d");
ctx.beginPath();
ctx.arc(pos[0]*30+30,pos[1]*30+30,15,0,2*Math.PI);
var chessstyle=ctx.createRadialGradient(pos[0]*30+32,pos[1]*30+28,15,pos[0]*30+32,pos[1]*30+28,1);
/* chesstype true 为黑子*/
if(ChessType)
{chessstyle.addColorStop(0,"#0A0A0A");
chessstyle.addColorStop(1,"#636766");
}
else{chessstyle.addColorStop(0,"#D1D1D1");
chessstyle.addColorStop(1,"#F9F9F9");
}
ctx.fillStyle=chessstyle;
ctx.fill();
ctx.closePath();
ChessType=!ChessType;
}
//获取棋子在棋盘中的位置
function GetPosIndex(pos)
{
return [Math.round(pos[0]/30-1),Math.round(pos[1]/30-1)]
}
//是否可以放置棋子
function PosCanPut(pos)
{
if(ChessBoard[pos[0]][pos[1]]==0)
{
return true;
}
else{
return false;
}
}
//计算机放置棋子
function ComputerPutChess()
{
var score=0;
var posscore=0;
var pos=[0,0];
for(var i=0;i<19;i++)
{
for(var j=0;j<19;j++)
{
if(PosCanPut([i,j]))
{
posscore=CalPosScore([i,j])
}
if(posscore>score)
{
score=posscore;
pos=[i,j]
}
}
}
//电脑放置棋子
ChessStep(pos);
}
//计算pos位置的得分
function CalPosScore(pos)
{
var posscore=0;
for(var k=0;k<WinTotal;k++)
{
if(ChessWinList[pos[0]][pos[1]][k]
&&ChessWinCnt[k][1]>=0)
{
switch(ChessWinCnt[k][1])
{
case 0:
posscore=posscore+2;
break;
case 1:
posscore=posscore+10;
break;
case 2:
posscore=posscore+50;
break;
case 3:
posscore=posscore+200;
break;
case 4:
posscore=posscore+10000;
break;
}
}
if(ChessWinList[pos[0]][pos[1]][k]
&&ChessWinCnt[k][0]>=0)
{
switch(ChessWinCnt[k][0])
{
case 0:
posscore=posscore+2;
break;
case 1:
posscore=posscore+8;
break;
case 2:
posscore=posscore+40;
break;
case 3:
posscore=posscore+500;
break;
case 4:
posscore=posscore+9000;
break;
}
}
}
return posscore;
}
//更新棋盘
function UpdateChessBoard(chesspos)
{
if(ChessType)
{
ChessBoard[chesspos[0]][chesspos[1]]=1;
}
else{ChessBoard[chesspos[0]][chesspos[1]]=2;}
}
//更新赢法数组
function UpdateChessWinList(chesspos)
{
for(var i=0;i<WinTotal;i++)
{
if(ChessWinList[chesspos[0]][chesspos[1]][i])
{
if(!ChessType)
{
ChessWinCnt[i][0]++;
ChessWinCnt[i][1]=-1;
}
else{ChessWinCnt[i][1]++;
ChessWinCnt[i][0]=-1;}
if(ChessWinCnt[i][0]==5)
{
alert("you win!");
GameOver=true;
}
if(ChessWinCnt[i][1]==5)
{
alert("computer win!");
GameOver=true;
}
}
}
}
//放置棋子处理步骤
function ChessStep(chesspos)
{
//更新棋盘
UpdateChessBoard(chesspos);
//绘制棋子
DrowChess(chesspos);
//更新赢法统计数组
UpdateChessWinList(chesspos);
}
//玩家放置棋子
function PutChess(e)
{
e=e||window.event;
var chesspos=GetPosIndex([e.offsetX,e.offsetY])
if(e.offsetY>585&&e.offsetX>250&&e.offsetX<350)
{
ReSet();
}
else if(!GameOver&&ChessType&&PosCanPut(chesspos))
{
ChessStep(chesspos)
//电脑放置棋子
ComputerPutChess();
}
}
//玩家放置棋子
function ReSet()
{
ChessType=true;
GameOver=false;
for(var i=0;i<19;i++)
{
for(var j=0;j<19;j++)
{
ChessBoard[i][j]=0;
}
}
console.log(WinTotal);
for(var i=0;i<WinTotal;i++)
{
//0表示黑子占此赢法棋子个数,1表示白子占此赢法棋子个数
ChessWinCnt[i][0]=0;
ChessWinCnt[i][1]=0;
}
var mycanvs=document.getElementById("mycanvas");
var ctx=mycanvs.getContext("2d");
ctx.beginPath();
ctx.clearRect(0,0,mycanvs.width,mycanvs.height);
ctx.closePath();
DrowChessBoard();
}
var GameOver=false;
//赢法总数
var WinTotal=0;
//棋盘数组,用于记录棋子位置
var ChessBoard=[];
//赢法数组,用于记录所有的赢法
var ChessWinList=[];
//赢法统计数组,用于统计棋子赢法
var ChessWinCnt=[];
var ChessWinList=[];
for(var i=0;i<19;i++)
{
ChessBoard[i]=[];
for(var j=0;j<19;j++)
{
ChessBoard[i][j]=0;
}
}
for(var i=0;i<19;i++)
{
ChessWinList[i]=[];
for(var j=0;j<19;j++)
{
ChessWinList[i][j]=[];
}
}
//横向赢法
for(var i=0;i<19;i++)
{
for(var j=0;j<15;j++)
{
for(var k=0;k<5;k++)
{
ChessWinList[i][j+k][WinTotal]=true;
}
WinTotal++;
}
}
//纵向赢法
for(var j=0;j<19;j++)
{
for(var i=0;i<15;i++)
{
for(var k=0;k<5;k++)
{
ChessWinList[i+k][j][WinTotal]=true;
}
WinTotal++;
}
}
//左对角线赢法
for(var i=0;i<15;i++)
{
for(var j=18;j>3;j--)
{
for(var k=0;k<5;k++)
{
ChessWinList[i+k][j-k][WinTotal]=true;
}
WinTotal++;
}
}
//右对角线赢法
for(var i=0;i<15;i++)
{
for(var j=0;j<15;j++)
{
for(var k=0;k<5;k++)
{
ChessWinList[i+k][j+k][WinTotal]=true;
}
WinTotal++;
}
}
//初始化黑白棋子占所有赢法个数均为0
for(var i=0;i<WinTotal;i++)
{
ChessWinCnt[i]=[];
//0表示黑子占此赢法棋子个数,1表示白子占此赢法棋子个数
ChessWinCnt[i][0]=0;
ChessWinCnt[i][1]=0;
}
/*绘制棋盘*/
function DrowChessBoard() {
var mycanvs=document.getElementById("mycanvas");
var ctx=mycanvs.getContext("2d");
ctx.strokeStyle="#BFBFBF";
for(i=0;i<19;i++)
{
/*横向线条*/
ctx.moveTo(30,30+i*30);
ctx.lineTo(570,30+i*30);
ctx.stroke();
/*纵向线条*/
ctx.moveTo(30+i*30,30);
ctx.lineTo(30+i*30,570);
ctx.stroke();
}
mycanvs.οnclick=PutChess;
ctx.font ="12px Arial"
ctx.fillText('重置',280,600);
}
/*绘制棋子*/
function DrowChess(pos) {
var mycanvs=document.getElementById("mycanvas");
var ctx=mycanvs.getContext("2d");
ctx.beginPath();
ctx.arc(pos[0]*30+30,pos[1]*30+30,15,0,2*Math.PI);
var chessstyle=ctx.createRadialGradient(pos[0]*30+32,pos[1]*30+28,15,pos[0]*30+32,pos[1]*30+28,1);
/* chesstype true 为黑子*/
if(ChessType)
{chessstyle.addColorStop(0,"#0A0A0A");
chessstyle.addColorStop(1,"#636766");
}
else{chessstyle.addColorStop(0,"#D1D1D1");
chessstyle.addColorStop(1,"#F9F9F9");
}
ctx.fillStyle=chessstyle;
ctx.fill();
ctx.closePath();
ChessType=!ChessType;
}
//获取棋子在棋盘中的位置
function GetPosIndex(pos)
{
return [Math.round(pos[0]/30-1),Math.round(pos[1]/30-1)]
}
//是否可以放置棋子
function PosCanPut(pos)
{
if(ChessBoard[pos[0]][pos[1]]==0)
{
return true;
}
else{
return false;
}
}
//计算机放置棋子
function ComputerPutChess()
{
var score=0;
var posscore=0;
var pos=[0,0];
for(var i=0;i<19;i++)
{
for(var j=0;j<19;j++)
{
if(PosCanPut([i,j]))
{
posscore=CalPosScore([i,j])
}
if(posscore>score)
{
score=posscore;
pos=[i,j]
}
}
}
//电脑放置棋子
ChessStep(pos);
}
//计算pos位置的得分
function CalPosScore(pos)
{
var posscore=0;
for(var k=0;k<WinTotal;k++)
{
if(ChessWinList[pos[0]][pos[1]][k]
&&ChessWinCnt[k][1]>=0)
{
switch(ChessWinCnt[k][1])
{
case 0:
posscore=posscore+2;
break;
case 1:
posscore=posscore+10;
break;
case 2:
posscore=posscore+50;
break;
case 3:
posscore=posscore+200;
break;
case 4:
posscore=posscore+10000;
break;
}
}
if(ChessWinList[pos[0]][pos[1]][k]
&&ChessWinCnt[k][0]>=0)
{
switch(ChessWinCnt[k][0])
{
case 0:
posscore=posscore+2;
break;
case 1:
posscore=posscore+8;
break;
case 2:
posscore=posscore+40;
break;
case 3:
posscore=posscore+500;
break;
case 4:
posscore=posscore+9000;
break;
}
}
}
return posscore;
}
//更新棋盘
function UpdateChessBoard(chesspos)
{
if(ChessType)
{
ChessBoard[chesspos[0]][chesspos[1]]=1;
}
else{ChessBoard[chesspos[0]][chesspos[1]]=2;}
}
//更新赢法数组
function UpdateChessWinList(chesspos)
{
for(var i=0;i<WinTotal;i++)
{
if(ChessWinList[chesspos[0]][chesspos[1]][i])
{
if(!ChessType)
{
ChessWinCnt[i][0]++;
ChessWinCnt[i][1]=-1;
}
else{ChessWinCnt[i][1]++;
ChessWinCnt[i][0]=-1;}
if(ChessWinCnt[i][0]==5)
{
alert("you win!");
GameOver=true;
}
if(ChessWinCnt[i][1]==5)
{
alert("computer win!");
GameOver=true;
}
}
}
}
//放置棋子处理步骤
function ChessStep(chesspos)
{
//更新棋盘
UpdateChessBoard(chesspos);
//绘制棋子
DrowChess(chesspos);
//更新赢法统计数组
UpdateChessWinList(chesspos);
}
//玩家放置棋子
function PutChess(e)
{
e=e||window.event;
var chesspos=GetPosIndex([e.offsetX,e.offsetY])
if(e.offsetY>585&&e.offsetX>250&&e.offsetX<350)
{
ReSet();
}
else if(!GameOver&&ChessType&&PosCanPut(chesspos))
{
ChessStep(chesspos)
//电脑放置棋子
ComputerPutChess();
}
}
//玩家放置棋子
function ReSet()
{
ChessType=true;
GameOver=false;
for(var i=0;i<19;i++)
{
for(var j=0;j<19;j++)
{
ChessBoard[i][j]=0;
}
}
console.log(WinTotal);
for(var i=0;i<WinTotal;i++)
{
//0表示黑子占此赢法棋子个数,1表示白子占此赢法棋子个数
ChessWinCnt[i][0]=0;
ChessWinCnt[i][1]=0;
}
var mycanvs=document.getElementById("mycanvas");
var ctx=mycanvs.getContext("2d");
ctx.beginPath();
ctx.clearRect(0,0,mycanvs.width,mycanvs.height);
ctx.closePath();
DrowChessBoard();
}