五子棋游戏源码和核心算法的讲解(简易五子棋web版)


 
 
  1. <style>
  2. *{margin:0;}/*解决浏览器的兼容问题*/
  3. #canvas{background:#f4f4f4;
  4. margin:100px auto auto auto;
  5. display:block;
  6. border:7px solid #3d3d3d;
  7. box-shadow:0 0 30px;
  8. }
  9. body{
  10. background:url(http://img.zcool.cn/community/018d4e554967920000019ae9df1533.jpg@900w_1l_2o_100sh.jpg);
  11. background-size:cover;;
  12. }
  13. button{
  14. height:40px;
  15. width:100px;
  16. display:block;
  17. margin:45px auto ;
  18. border-radius: 25px;
  19. }
  20. </style>
  21. </head>
  22. <body>
  23. <canvas id="canvas" height="450" width="450"> </canvas>
  24. <button id="restart">重新开始 </button>
  25. </body>

一、以上是界面的代码

二、js的部分代码


 
 
  1. //获得画板
  2. var chess= document.getElementById( "canvas");
  3. //获得画笔(上下文)
  4. var context=chess.getContext( "2d");
  5. //true为白棋,false为黑棋
  6. var me= false;
  7. //棋盘数组,0代表没有棋子,1代表白棋,2代表黑棋
  8. var chessBorad=[];
  9. for( var i= 0;i< 15;i++){
  10. chessBorad[i]=[];
  11. for( var j= 0;j< 15;j++){
  12. chessBorad[i][j]= 0;
  13. }
  14. }
  15. //获得按钮
  16. var restart= document.getElementById( "restart");

三、以下的代码将棋盘(的线)画出来


 
 
  1. //绘画棋盘的方法
  2. function drawChessBorad(){
  3. context.strokeStyle= "#4d4d4d"; //改变线条的颜色
  4. for( var i= 0;i< 15;i++){
  5. //棋盘的竖线
  6. context.moveTo( 15+i* 30, 15); //起点
  7. context.lineTo( 15+i* 30, 435); //终点
  8. context.stroke(); //连线
  9. //棋盘的横线
  10. context.moveTo( 15, 15+i* 30); //起点
  11. context.lineTo( 435, 15+i* 30); //终点
  12. context.stroke();
  13. }
  14. }
  15. window.οnlοad= function(){
  16. drawChessBorad();
  17. }

四、以下代码是用来绘画棋子的和重启游戏,以及画板的点击事件


 
 
  1. //画棋子
  2. function drawChess(i,j,me){ //i纵坐标,j横坐标
  3. context.beginPath();
  4. context.arc( 15+j* 30,i* 30+ 15, 13, 0, Math.PI* 2, false);
  5. context.closePath();
  6. context.stroke();
  7. //设置渐变色 径向渐变
  8. var grd=context.createRadialGradient( 15+j* 30+ 2,i* 30+ 15 -2, 10, 15+j* 30+ 2,i* 30+ 15 -2, 0);
  9. if(me){ //白棋
  10. grd.addColorStop( 0, "#d1d1d1");
  11. grd.addColorStop( 1, "#f9f9f9");
  12. chessBorad[i][j]= 1;
  13. } else{ //黑棋
  14. grd.addColorStop( 0, "#0a0a0a");
  15. grd.addColorStop( 1, "#636767");
  16. chessBorad[i][j]= 2;
  17. }
  18. context.fillStyle=grd; //设置填充色
  19. context.fill();
  20. }
  21. //画板的鼠标点击事件
  22. chess.οnclick= function(e){
  23. var x=e.offsetX;
  24. var y=e.offsetY;
  25. var i= Math.floor(y/ 30);
  26. var j= Math.floor(x/ 30);
  27. if(chessBorad[i][j]== 0){
  28. drawChess(i,j,me); //画棋子
  29. win(i,j,me);
  30. me=!me;
  31. }
  32. }
  33. //重新游戏
  34. restart.οnclick= function(){
  35. clearChess();
  36. }
  37. //清空棋子
  38. function clearChess(){ //当canvas的高度或者宽度重新设置时将清空画布
  39. chess.height=chess.height;
  40. drawChessBorad();
  41. }

五、判断游戏是哪方赢了(核心代码)

之前在网上看的大部分代码的算法大都是遍历了整个棋盘,以此来判断是否有哪一方已经达到赢的条件。个人觉得此算法的性能不是特别好。

以下的代码算法思想是:达成赢得条件时,那五个连成一直线的棋子中必然有一个是最后下的。由此获取最后棋子的坐标,向八方分别计算各个方向与其相同颜色的棋子个数。

统计好以上八个方向上(除了最后一个棋子)与最后一个棋子相同颜色的棋子,并且在遇到另一种颜色棋子时就不再进行统计,一个方向上最多统计4个棋子。

最后判断以下四个方向是否存在五个相同颜色的棋子(颜色为最后一个棋子的颜色),存在则达到了赢的条件,游戏结束。

代码的实现:


 
 
  1. //判断赢的方法
  2. function win(i,j,me){ //i纵坐标,j横坐标
  3. var count=[ 0, 0, 0, 0, 0, 0, 0, 0];
  4. var state=[ 1, 1, 1, 1, 1, 1, 1, 1]; //遇到相同颜色值为1
  5. var color= 1;
  6. if(me){color= 1;} else{color= 2;}
  7. for( var step= 1;step< 5;step++){
  8. if(state[ 0]== 1&&i-step>= 0&&j-step>= 0){
  9. if(chessBorad[i-step][j-step]==color){count[ 0]++;} else{state[ 0]= 2;} //遇到相异的颜色或者没有棋子
  10. }
  11. if(state[ 1]== 1&&i-step>= 0){
  12. if(chessBorad[i-step][j]==color){count[ 1]++;} else{state[ 1]= 2;}
  13. }
  14. if(state[ 2]== 1&&i-step>= 0&&j+step< 15){
  15. if(chessBorad[i-step][j+step]==color){count[ 2]++;} else{state[ 2]= 2;}
  16. }
  17. if(state[ 3]== 1&&j+step< 15){
  18. if(chessBorad[i][j+step]==color){count[ 3]++;} else{state[ 3]= 2;}
  19. }
  20. if(state[ 4]== 1&&i+step< 15&&j+step< 15){
  21. if(chessBorad[i+step][j+step]==color){count[ 4]++;} else{state[ 4]= 2;}
  22. }
  23. if(state[ 5]== 1&&i+step< 15){
  24. if(chessBorad[i+step][j]==color){count[ 5]++;} else{state[ 5]= 2;}
  25. }
  26. if(state[ 6]== 1&&i+step< 15&&j-step>= 0){
  27. if(chessBorad[i+step][j-step]==color){count[ 6]++;} else{state[ 6]= 2;}
  28. }
  29. if(state[ 7]== 1&&j-step>= 0){
  30. if(chessBorad[i][j-step]==color){count[ 7]++;} else{state[ 7]= 2;}
  31. }
  32. }
  33. if((count[ 0]+count[ 4]+ 1)>= 5||(count[ 1]+count[ 5]+ 1)>= 5||(count[ 2]+count[ 6]+ 1)>= 5||(count[ 3]+count[ 7]+ 1)>= 5){
  34. if(me){
  35. alert( "白棋赢了");
  36. } else{
  37. alert( "黑棋赢了");
  38. }
  39. }
  40. }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值