利用js canvas实现五子棋游戏


Posted in Javascript onOctober 11, 2020

本文实例为大家分享了canvas实现五子棋游戏的具体代码,供大家参考,具体内容如下

html部分

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body style="margin: 0;">
  <canvas style="margin-left: 20px;" id="five"></canvas>
  <h1 style="font-size: 40px;font-weight: bolder;margin-left: 200px;margin-top: 0;margin-bottom: 0;">五子棋</h1>
  <h2 style="font-size: 40px;font-weight: bolder;margin-left: 200px;margin-top: 0;" id="currole">轮到:黑</h2>
  <div id="res" style="font-size: 40px;font-weight: bolder;margin-left: 200px;">胜者:</div>
</body>
<script>
  let cav = document.getElementById('five')
  let ctx = cav.getContext('2d')
  let k = 50 //倍数
  let r = k/4
  cav.width = cav.height = 16*k
  ctx.strokeStyle="#000000";
  for(let i = 0;i<15;i++){
    ctx.beginPath();
    ctx.moveTo((i+1)*k,k);
    ctx.lineTo((i+1)*k,15*k);
    ctx.stroke();
  }
  for(let i = 0;i<15;i++){
    ctx.beginPath();
    ctx.moveTo(k,(i+1)*k);
    ctx.lineTo(15*k,(i+1)*k);
    ctx.stroke();
  }
  function initer(event){
    let x = event.offsetX - k
    let y = event.offsetY - k
    let xclose = close(x,0,14)
    let yclose = close(y,0,14)
    let nodearr = []
    let minxd = Math.abs(x-xclose[0]*k)<Math.abs(x-xclose[1]*k)?
      Math.abs(x-xclose[0]*k)<r?xclose[0]*k:undefined
      :
      Math.abs(x-xclose[1]*k)<r?xclose[1]*k:undefined
    let maxyd = Math.abs(y-yclose[0]*k)<Math.abs(y-yclose[1]*k)?
    Math.abs(y-yclose[0]*k)<r?yclose[0]*k:undefined
    :
    Math.abs(y-yclose[1]*k)<r?yclose[1]*k:undefined
    if((minxd!==undefined)&&(maxyd!==undefined)){
      nodearr = [minxd,maxyd]
    }
    if(nodearr.length!==0){
      setNode(nodearr)
    }
  }
  cav.addEventListener("click",initer)
  function close(coo,lort,rorb){
    coo<0?coo=0:coo=coo
    coo>14*k?coo=14*k:coo=coo
    let dect = rorb - lort
    if(dect===1){
      return [lort,rorb]
    }else{
      if(coo<(lort+Math.ceil(dect/2))*k){
        let nlort=lort
        let nrorb=lort+Math.ceil(dect/2)
        return close(coo,nlort,nrorb)
      }else{
        let nlort=lort+Math.ceil(dect/2)
        let nrorb=rorb
        return close(coo,nlort,nrorb)
      }
    }
  }
  let colorflag = 0
  function setNode(arr){
    if(gomoku[arr[0]/k][arr[1]/k]!==undefined){
      return
    }
    if(colorflag===0){
      ctx.fillStyle="black"
      ctx.beginPath();
      ctx.arc(arr[0]+k,arr[1]+k,r,0,2*Math.PI);
      ctx.stroke();
      ctx.fill();
      checkFinish([arr[0]/k,arr[1]/k])
      gomoku[arr[0]/k][arr[1]/k] = colorflag
      colorflag = 1
      document.getElementById('currole').innerHTML="轮到:白"
    }else{
      ctx.fillStyle="white"
      ctx.beginPath();
      ctx.arc(arr[0]+k,arr[1]+k,r,0,2*Math.PI);
      ctx.stroke();
      ctx.fill();
      checkFinish([arr[0]/k,arr[1]/k])
      gomoku[arr[0]/k][arr[1]/k] = colorflag
      colorflag = 0
      document.getElementById('currole').innerHTML="轮到:黑"
    }
  }

</script>
<script src="./five.js"></script>
</html>

外部js文件部分

let gomoku = new Array(15)
for(let i = 0;i<gomoku.length;i++){
  gomoku[i]=new Array(15)
}
//black 0 white 1

function checkFinish(curnode){
  for(let i =0;i<4;i++){
    let totalLength = 1
    let aflag = true
    let bflag = true
    for(let j=0;j<4;j++){
      let dictNum = j+1
      switch(i){
        case 0:
          if(aflag){
            (gomoku[curnode[0]+dictNum][curnode[1]]===colorflag)
            &&((curnode[0]+dictNum)<=14)?
            totalLength++:aflag=false
          }
          if(bflag){
            (gomoku[curnode[0]-dictNum][curnode[1]]===colorflag)
            &&((curnode[0]-dictNum)>=0)?
            totalLength++:bflag=false
          }
          break;
        case 1:
          if(aflag){
            (gomoku[curnode[0]][curnode[1]+dictNum]===colorflag)
            &&((curnode[1]+dictNum)<=14)?
            totalLength++:aflag=false
          }
          if(bflag){
            (gomoku[curnode[0]][curnode[1]-dictNum]===colorflag)
            &&((curnode[1]-dictNum)>=0)?
            totalLength++:bflag=false
          }
          break;
        case 2:
          if(aflag){
            (gomoku[curnode[0]+dictNum][curnode[1]+dictNum]===colorflag)
            &&((curnode[1]+dictNum)<=14)
            &&((curnode[0]+dictNum)<=14)?
            totalLength++:aflag=false
          }
          if(bflag){
            (gomoku[curnode[0]-dictNum][curnode[1]-dictNum]===colorflag)
            &&((curnode[1]-dictNum)>=0)
            &&((curnode[0]-dictNum)>=0)?
            totalLength++:bflag=false
          }
          break;
        case 3:
          if(aflag){
            (gomoku[curnode[0]+dictNum][curnode[1]-dictNum]===colorflag)
            &&((curnode[1]-dictNum)>=0)
            &&((curnode[0]+dictNum)<=14)?
            totalLength++:aflag=false
          }
          if(bflag){
            (gomoku[curnode[0]-dictNum][curnode[1]+dictNum]===colorflag)
            &&((curnode[1]+dictNum)<=14)
            &&((curnode[0]-dictNum)>=0)?
            totalLength++:bflag=false
          }
          break;
      }
      if(totalLength>=5){
        if(colorflag===0){
          document.getElementById('res').innerHTML='胜者:黑方'
          cav.removeEventListener("click",initer)
        }else{
          document.getElementById('res').innerHTML='胜者:白方'
          cav.removeEventListener("click",initer)
        }
        break;
      }
      if((aflag===false)&&(bflag===false)){
        break;
      }
    }
    if(totalLength>=5){
      break;
    }
  }
}
//all work and no play makes jack a dull boy

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
editable.js 基于jquery的表格的编辑插件
Oct 24 Javascript
javascript获取下拉列表框当中的文本值示例代码
Jul 31 Javascript
jquery parent和parents的区别分析
Oct 02 Javascript
jquery衣服颜色选取插件效果代码分享
Aug 28 Javascript
JavaScript学习小结(一)——JavaScript入门基础
Sep 02 Javascript
使用impress.js制作幻灯片
Sep 09 Javascript
dul无法加载bootstrap实现unload table/user恢复
Sep 29 Javascript
在webstorm开发微信小程序之使用阿里自定义字体图标的方法
Nov 15 Javascript
Vue+Koa2 打包后进行线上部署的教程详解
Jul 31 Javascript
webpack+vue.js构建前端工程化的详细教程
May 10 Javascript
Vue+Element ui 根据后台返回数据设置动态表头操作
Sep 21 Javascript
多个Vue项目部署到服务器的步骤记录
Oct 22 Javascript
H5+css3+js搭建带验证码的登录页面
Oct 11 #Javascript
原生js生成图片验证码
Oct 11 #Javascript
js实现石头剪刀布游戏
Oct 11 #Javascript
js+h5 canvas实现图片验证码
Oct 11 #Javascript
vue2和vue3的v-if与v-for优先级对比学习
Oct 10 #Javascript
如何手写简易的 Vue Router
Oct 10 #Javascript
如何手写一个简易的 Vuex
Oct 10 #Javascript
You might like
PHP中函数内引用全局变量的方法
2008/10/20 PHP
twig模板常用语句实例小结
2016/02/04 PHP
PHP数学运算与数据处理实例分析
2016/04/01 PHP
Ajax请求PHP后台接口返回信息的实例代码
2018/08/21 PHP
让人印象深刻的10个jQuery手风琴效果应用
2012/05/08 Javascript
JS获取地址栏参数的两种方法(简单实用)
2016/06/14 Javascript
jQuery实现弹出窗口弹出div层的实例代码
2017/01/09 Javascript
Angular ui.bootstrap.pagination分页
2017/01/20 Javascript
AngularJS自定义指令实现面包屑功能完整实例
2017/05/17 Javascript
微信小程序之绑定点击事件实例详解
2017/07/07 Javascript
jQuery 循环遍历改变a标签的href(实例讲解)
2017/07/12 jQuery
jQuery实现点击自身以外区域关闭弹出层功能完整示例【改进版】
2018/07/31 jQuery
JavaScript碰撞检测原理及其实现代码
2020/03/12 Javascript
[01:01:18]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#2COL VS LGD
2016/03/03 DOTA
Python使用正则匹配实现抓图代码分享
2015/04/02 Python
python中私有函数调用方法解密
2016/04/29 Python
Python 两个列表的差集、并集和交集实现代码
2016/09/21 Python
python操作mysql数据库
2017/03/05 Python
Python cookbook(数据结构与算法)保存最后N个元素的方法
2018/02/13 Python
Python二维码生成识别实例详解
2019/07/16 Python
python使用celery实现异步任务执行的例子
2019/08/28 Python
使用python脚本自动创建pip.ini配置文件代码实例
2019/09/20 Python
python3中关于excel追加写入格式被覆盖问题(实例代码)
2020/01/10 Python
TensorFlow2.0矩阵与向量的加减乘实例
2020/02/07 Python
Python基于smtplib协议实现发送邮件
2020/06/03 Python
美国成衣女装品牌:CHICO’S
2016/09/19 全球购物
英国领先的电视购物零售商:Ideal World
2019/03/18 全球购物
电子商务个人职业生涯规划范文
2014/02/12 职场文书
绿色城市实施方案
2014/03/19 职场文书
电子商务助理求职自荐信
2014/04/10 职场文书
支部书记四风对照材料
2014/08/28 职场文书
党员自我剖析材料(群众路线)
2014/10/06 职场文书
五一劳动节活动总结
2015/02/09 职场文书
员工辞职信怎么写
2015/02/27 职场文书
2015社区精神文明建设工作总结
2015/04/21 职场文书
优秀创业计划书分享
2019/07/19 职场文书