javascript实现五子棋代码

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();
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值