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 相关文章推荐
javascript对象的property和prototype是这样一种关系
Mar 24 Javascript
jquery 最简单的属性菜单
Oct 08 Javascript
Js四则运算函数代码
Jul 21 Javascript
对于this和$(this)的个人理解
Sep 08 Javascript
JS实现一键回顶功能示例代码
Oct 28 Javascript
使用Chrome调试JavaScript的断点设置和调试技巧
Dec 16 Javascript
JS实现向表格中动态添加行的方法
Mar 30 Javascript
JavaScript获取网页中第一个图片id的方法
Apr 03 Javascript
浅谈jquery页面初始化的4种方式
Nov 27 Javascript
JavaScript基于Dom操作实现查找、修改HTML元素的内容及属性的方法
Jan 20 Javascript
详解.vue文件解析的实现
Jun 11 Javascript
JavaScript中break、continue和return的用法区别实例分析
Mar 02 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
中东人咖啡哲学
2021/03/03 咖啡文化
用cookies来跟踪识别用户
2006/10/09 PHP
smarty实例教程
2006/11/19 PHP
php环境配置 php5 MySQL5 apache2 phpmyadmin安装与配置图文教程
2007/03/16 PHP
smarty模板引擎基础知识入门
2015/03/30 PHP
smarty内部日期函数html_select_date()用法实例分析
2015/07/08 PHP
Laravel 5.1 on SAE环境开发教程【附项目demo源码】
2016/10/09 PHP
深入理解JavaScript系列(6):S.O.L.I.D五大原则之单一职责SRP
2012/01/15 Javascript
javascript向后台传送相同属性的参数即数组参数
2014/02/17 Javascript
自定义jQuery插件方式实现强制对象重绘的方法
2015/03/23 Javascript
javascript创建函数的20种方式汇总
2015/06/23 Javascript
jQuery插件cxSelect多级联动下拉菜单实例解析
2016/06/24 Javascript
jquery+html仿翻页相册功能
2016/12/20 Javascript
jQuery插件FusionCharts绘制的3D饼状图效果实例【附demo源码下载】
2017/03/03 Javascript
ionic+AngularJs实现获取验证码倒计时按钮
2017/04/22 Javascript
Web制作验证码功能实例代码
2017/06/19 Javascript
vue.js,ajax渲染页面的实例
2018/02/11 Javascript
vue 实现数字滚动增加效果的实例代码
2018/07/06 Javascript
vue3.0 CLI - 2.5 - 了解组件的三维
2018/09/14 Javascript
validform表单验证的实现方法
2019/03/08 Javascript
使用vue-cli4.0快速搭建一个项目的方法步骤
2019/12/04 Javascript
vue-quill-editor的使用及个性化定制操作
2020/08/04 Javascript
Python中的多重装饰器
2015/04/11 Python
python 简单照相机调用系统摄像头实现方法 pygame
2018/08/03 Python
Python的argparse库使用详解
2018/10/09 Python
Python生命游戏实现原理及过程解析(附源代码)
2019/08/01 Python
三星美国官网:Samsung美国
2017/02/06 全球购物
Julep官网:美容产品和指甲油
2017/02/25 全球购物
绩效考核实施方案
2014/03/18 职场文书
幼儿园师德演讲稿
2014/05/06 职场文书
我的中国梦演讲稿600字
2014/08/19 职场文书
中国梦演讲稿范文
2014/08/28 职场文书
超市店庆活动方案
2014/08/31 职场文书
个人学习党的群众路线教育实践活动心得体会
2014/11/05 职场文书
挂靠协议书
2015/01/27 职场文书
Golang 并发编程 SingleFlight模式
2022/04/26 Golang