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 相关文章推荐
window.opener用法和用途实例介绍
Aug 19 Javascript
引入JS文件IE6报语法错误或缺少对象问题的解决方法
Jan 09 Javascript
jQuery截取指定长度字符串的实现原理及代码
Jul 01 Javascript
JQuery select(下拉框)操作方法汇总
Apr 15 Javascript
jQuery过滤选择器用法示例
Sep 12 Javascript
Angularjs中controller的三种写法分享
Sep 21 Javascript
JS 调用微信扫一扫功能
Dec 22 Javascript
JS实现多张图片预览同步上传功能
Jun 23 Javascript
老生常谈Bootstrap媒体对象
Jul 06 Javascript
Bootstrap Table快速完美搭建后台管理系统
Sep 20 Javascript
Nuxt.js nuxt-link与router-link的区别说明
Nov 06 Javascript
layui使用及简单的三级联动实现教程
Dec 01 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
yii2.0框架数据库操作简单示例【添加,修改,删除,查询,打印等】
2020/04/13 PHP
让IE8支持DOM 2(不用框架!)
2009/12/31 Javascript
浅析onsubmit校验表单时利用ajax的return false无效问题
2013/07/10 Javascript
Javascript 学习笔记之 对象篇(二) : 原型对象
2014/06/24 Javascript
JavaScript通过字符串调用函数的实现方法
2015/03/18 Javascript
JQuery简单实现锚点链接的平滑滚动
2015/05/03 Javascript
javascript匀速动画和缓冲动画详解
2016/10/20 Javascript
AngularJS中isolate scope的用法分析
2016/11/22 Javascript
vue 中filter的多种用法
2018/04/26 Javascript
jQuery实现侧边栏隐藏与显示的方法详解
2018/12/22 jQuery
jQuery实现王者荣耀手风琴效果
2020/01/17 jQuery
JavaScript Window窗口对象属性和使用方法
2020/01/19 Javascript
Vue中keep-alive组件的深入理解
2020/08/23 Javascript
利用python批量检查网站的可用性
2016/09/09 Python
python中os模块详解
2016/10/14 Python
浅谈Django自定义模板标签template_tags的用处
2017/12/20 Python
Python基于递归算法求最小公倍数和最大公约数示例
2018/07/27 Python
详解Python 爬取13个旅游城市,告诉你五一大家最爱去哪玩?
2019/05/07 Python
基于python的socket实现单机五子棋到双人对战
2020/03/24 Python
详解Python打包分发工具setuptools
2019/08/05 Python
Python中BeautifuSoup库的用法使用详解
2019/11/15 Python
使用Pandas将inf, nan转化成特定的值
2019/12/19 Python
python 调用Google翻译接口的方法
2020/12/09 Python
html5 canvas合成海报所遇问题及解决方案总结
2017/08/03 HTML / CSS
详解HTML5常用的语义化标签
2019/09/27 HTML / CSS
英国领先的露营和露营车品牌之一:OLPRO
2019/08/06 全球购物
运动会跳远广播稿
2014/02/04 职场文书
企业军训感言
2014/02/08 职场文书
趣味活动策划方案
2014/02/08 职场文书
开学季活动策划方案
2014/02/28 职场文书
《第一次抱母亲》教学反思
2014/04/16 职场文书
房地产公司财务总监岗位职责
2015/04/03 职场文书
预备党员入党感言
2015/08/01 职场文书
javascript canvas实现雨滴效果
2021/06/09 Javascript
MySQL开启事务的方式
2021/06/26 MySQL
Python Matplotlib绘制两个Y轴图像
2022/04/13 Python