JS+canvas实现的五子棋游戏【人机大战版】


Posted in Javascript onJuly 19, 2017

本文实例讲述了JS+canvas实现的五子棋游戏。分享给大家供大家参考,具体如下:

运行效果图:

JS+canvas实现的五子棋游戏【人机大战版】

html代码如下:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>五子棋</title>
    <link rel="stylesheet" type="text/css" href="css/style.css" rel="external nofollow" />
  </head>
  <body>
    <canvas id="chess" width="450px" height="450px"></canvas>
    <div id='restart' class="restart">
      <span>重新开始</span>
    </div>
    <script src="js/script.js" type="text/javascript" charset="utf-8"></script>
  </body>
</html>

style.css代码如下:

canvas{
  display: block;
  margin: 50px auto;
  box-shadow: -2px -2px 2px #efefef, 5px 5px 5px #b9b9b9;
}
.restart{
  text-align: center;
}
.restart>span{
  display: inline-block;
  padding: 10px 20px;
  color: #fff;
  background-color: #45c01a;
  border-radius: 5px;
}

script.js代码如下:

var over = false;
var me = true; //我
var chressBord = [];//棋盘
for(var i = 0; i < 15; i++){
  chressBord[i] = [];
  for(var j = 0; j < 15; j++){
    chressBord[i][j] = 0;
  }
}
//赢法的统计数组
var myWin = [];
var computerWin = [];
//赢法数组
var wins = [];
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++){
    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++;
  }
}
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 logo = new Image();
logo.src = 'img/logo.png';
logo.onload = function(){
  context.drawImage(logo,0,0,450,450);
  drawChessBoard();
}
document.getElementById("restart").onclick = function(){
  window.location.reload();
}
chess.onclick = function(e){
  if(over){
    return;
  }
  if(!me){
    return;
  }
  var x = e.offsetX;
  var y = e.offsetY;
  var i = Math.floor(x / 30);
  var j = Math.floor(y / 30);
  if(chressBord[i][j] == 0){
    oneStep(i,j,me);
    chressBord[i][j] = 1;//我
    for(var k = 0; k < count; k++){
      if(wins[i][j][k]){
        myWin[k]++;
        computerWin[k] = 6;//这个位置对方不可能赢了
        if(myWin[k] == 5){
          window.alert('你赢了');
          over = true;
        }
      }
    }
    if(!over){
      me = !me;
      computerAI();
    }
  }
}
//计算机下棋
var computerAI = function (){
  var myScore = [];
  var computerScore = [];
  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(chressBord[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);
  chressBord[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('计算机赢了');
        over = true;
      }
    }
  }
  if(!over){
    me = !me;
  }
}
//绘画棋盘
var drawChessBoard = function(){
  for(var i = 0; i < 15; i++){
    context.moveTo(15 + i * 30 , 15);
    context.lineTo(15 + i * 30 , 435);
    context.stroke();
    context.moveTo(15 , 15 + i * 30);
    context.lineTo(435 , 15 + i * 30);
    context.stroke();
  }
}
//画旗子
var oneStep = function(i,j,me){
  context.beginPath();
  context.arc(15 + i * 30, 15 + j * 30, 13, 0, 2 * Math.PI);//画圆
  context.closePath();
  //渐变
  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;
  context.fill();
}
Javascript 相关文章推荐
表单切换,用回车键替换Tab健(不支持IE)
Jul 20 Javascript
fancybox modal的完美解决(右上的X)
Oct 30 Javascript
DWR实现模拟Google搜索效果实现原理及代码
Jan 30 Javascript
JS简单实现登陆验证附效果图
Nov 19 Javascript
JQuery中上下文选择器实现方法
May 18 Javascript
jQuery 1.9.1源码分析系列(十五)之动画处理
Dec 03 Javascript
jQuery EasyUI API 中文帮助文档和扩展实例
Aug 01 Javascript
JQuery动态添加Select的Option元素实现方法
Aug 29 Javascript
Vue数据驱动模拟实现2
Jan 11 Javascript
实例详解BootStrap的动态模态框及静态模态框
Aug 13 Javascript
微信小程序自定义键盘 内部虚拟支付
Dec 20 Javascript
js判断非127开头的IP地址的实例代码
Jan 05 Javascript
Vue学习笔记进阶篇之vue-router安装及使用方法
Jul 19 #Javascript
Vue学习笔记进阶篇之单元素过度
Jul 19 #Javascript
jQuery实现可编辑表格并生成json结果(实例代码)
Jul 19 #jQuery
jQuery实现导航栏头部菜单项点击后变换颜色的方法
Jul 19 #jQuery
利用require.js与angular搭建spa应用的方法实例
Jul 19 #Javascript
ztree简介_动力节点Java学院整理
Jul 19 #Javascript
Angular 1.x个人使用的经验小结
Jul 19 #Javascript
You might like
64位windows系统下安装Memcache缓存
2015/12/06 PHP
PHP文件上传问题汇总(文件大小检测、大文件上传处理)
2015/12/24 PHP
PHP实现登陆表单提交CSRF及验证码
2017/01/24 PHP
原生PHP实现导出csv格式Excel文件的方法示例【附源码下载】
2019/03/07 PHP
使两个iframe的高度与内容自适应,且相等
2006/11/20 Javascript
javascript里的条件判断
2007/02/27 Javascript
js实现iframe动态调整高度的代码
2008/01/06 Javascript
JS中confirm,alert,prompt函数区别分析
2011/01/17 Javascript
Javascript基础教程之数据类型 (数值 Number)
2015/01/18 Javascript
JavaScript实现选择框按比例拖拉缩放的方法
2015/08/04 Javascript
深入探究AngularJS框架中Scope对象的超级教程
2016/01/04 Javascript
Node.js Mongodb 密码特殊字符 @的解决方法
2017/04/11 Javascript
Three.js利用dat.GUI如何简化试验流程详解
2017/09/26 Javascript
jQuery的Ajax接收java返回数据方法
2018/08/11 jQuery
解决包含在label标签下的checkbox在ie8及以下版本点击事件无效果兼容的问题
2019/10/27 Javascript
JavaScript冒泡算法原理与实现方法深入理解
2020/06/04 Javascript
javascript自定义加载loading效果
2020/09/15 Javascript
[01:03:50]DOTA2-DPC中国联赛 正赛 CDEC vs DLG BO3 第二场 2月7日
2021/03/11 DOTA
python开启多个子进程并行运行的方法
2015/04/18 Python
python条件变量之生产者与消费者操作实例分析
2017/03/22 Python
python数据处理实战(必看篇)
2017/06/11 Python
Python操作配置文件ini的三种方法讲解
2019/02/22 Python
python实现小球弹跳效果
2019/05/10 Python
django+echart数据动态显示的例子
2019/08/12 Python
Python使用PyQt5/PySide2编写一个极简的音乐播放器功能
2020/02/07 Python
使用Keras实现简单线性回归模型操作
2020/06/12 Python
使用iframe+postMessage实现页面跨域通信的示例代码
2020/01/14 HTML / CSS
英国最大线上综合鞋类商城:Office
2017/12/08 全球购物
Auguste The Label官网:澳大利亚一家精品女装时尚品牌
2020/06/14 全球购物
Shell脚本如何向终端输出信息
2014/04/25 面试题
技术副厂长岗位职责
2013/12/26 职场文书
简单英文演讲稿
2014/01/01 职场文书
总经理岗位职责描述
2014/02/08 职场文书
捐资助学倡议书
2014/04/15 职场文书
常务副总经理任命书
2014/06/05 职场文书
安全责任书怎么写
2014/07/28 职场文书