原生JavaScript实现五子棋游戏


Posted in Javascript onNovember 09, 2020

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

1.HTML部分

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, user-scalable=no">
  <title>五子棋</title>
  <style>
    * {
      margin: 0px;
      padding: 0px;
    }

    .box {
      border-spacing: 0px;
      border: 1px solid #3c3c3c;
      background-color: #e1e1e2;
      margin: auto;
    }
    
    .piece {
      border-spacing: 0px;
      border: 1px solid;    
    }
  </style>

</head>

<body>
  <script type="text/javascript" src="./Gobang.js"></script>
</body>

</html>

2.JavaScript部分

var ScreenWidth = {
  documentWidth: 500,
  containerWidth: 400, // 容器默认宽度
  cellWidth: 20 // 单元格宽度
}
if (document.documentElement.clientWidth < 500) {
  ScreenWidth.documentWidth = document.documentElement.clientWidth;
  ScreenWidth.containerWidth = ScreenWidth.documentWidth * 0.8;
  ScreenWidth.cellWidth = ScreenWidth.containerWidth * 0.05;
}
//常量
var reg = /\d{1,2}/g;
var white = []; // 放白子
var black = []; // 放黑子
var tempKey = false; // 判断是走黑子还是白子
var notOver = true; // 判断游戏是否结束
var tips = "白棋走"; // 提示走棋
var count = 0;//相连的个数
var bv = false; // 黑棋胜利
var wv = false; // 白棋胜利 
var yCanWin = [];// 同一竖元素存放的数组
var xCanWin = [];// 同一横元素存放的数组
var xyCanWin = [];// 同一正斜存放的数组
var yxCanWin = [];// 同一反斜存放的数组
// 用计时器监听是否胜利
var time = setInterval(function () {
  if (bv) {
    tips = "黑棋胜利";
    document.getElementsByTagName("span")[0].innerText = tips;
    for (var i = 0; i < document.getElementsByClassName("pieceBox").length; i++) {
      document.getElementsByClassName("pieceBox")[i].onclick = null;
    }
    clearInterval(time);
  }
  if (wv) {
    tips = "白棋胜利";
    document.getElementsByTagName("span")[0].innerText = tips;
    for (var i = 0; i < document.getElementsByClassName("pieceBox").length; i++) {
      document.getElementsByClassName("pieceBox")[i].onclick = null;
    }
    clearInterval(time);
  }
}, 100);
newGame();// 开始游戏
function newGame() {
  if (document.getElementsByTagName("table").length) {
    for (var i = 0; i < document.getElementsByTagName("table").length; i++) {
      document.getElementsByTagName("table")[i].remove();
    }
  }
  // 初始化以下内容
  bgInit();
  pieceInit();
  spanFn();
  white = [];
  black = [];
  tempKey = false;
  notOver = true;
  tips = "白棋走";
  count = 0;
  bv = false;
  xCanWin = [];
  yCanWin = [];
  xyCanWin = [];
  yxCanWin = [];
}

function spanFn() {
  var span = document.createElement("span");
  document.body.insertBefore(span, document.getElementsByTagName("script")[0]);
  span.innerText = tips;
}
// 棋盘初始化
function bgInit() {
  var table = document.createElement("table");
  table.className = "box"
  for (var y = 0; y < 20; y++) {
    var tr = document.createElement("tr");
    for (var x = 0; x < 20; x++) {
      var td = "<td class='box-" + y + "-" + x + "' style='width: " + ScreenWidth.cellWidth + "px; height: " + ScreenWidth.cellWidth + "px;border:1px solid #9c9c9c'></td>";
      tr.innerHTML += td;
    }
    table.appendChild(tr);
  }
  document.body.insertBefore(table, document.getElementsByTagName("script")[0]);
}

// 棋子初始化
function pieceInit() {
  var table = document.createElement("table");
  table.className = "piece"
  table.style = "position: absolute; top: 0; left:50%; margin-left:-" + (ScreenWidth.containerWidth + 42) / 2 + "px";
  for (var y = 0; y < 20; y++) {
    var tr = document.createElement("tr");
    for (var x = 0; x < 20; x++) {
      var td = "<td class='piece-" + y + "-" + x + " pieceBox' style='width: " + ScreenWidth.cellWidth + "px; height: " + ScreenWidth.cellWidth + "px;border:1px solid transparent;border-radius: 50%;'></td>";
      tr.innerHTML += td;
    }
    table.appendChild(tr);
  }
  document.body.insertBefore(table, document.getElementsByTagName("script")[0]);
}

// 走棋
for (var i = 0; i < document.getElementsByClassName("pieceBox").length; i++) {
  document.getElementsByClassName("pieceBox")[i].onclick = function () {
    if (tempKey) {
      this.style.backgroundColor = "#000";// 黑子
      tempKey = false;
      black.push(this.className.match(reg));
      victory(black, 0);//判断黑棋胜利与否
      if (notOver) {
        tips = tipsGo(tempKey);
        document.getElementsByTagName("span")[0].innerText = tips;
      }
    } else {
      this.style.backgroundColor = "#fff";// 白子
      tempKey = true;
      white.push(this.className.match(reg));
      victory(white, 1);//判断白棋胜利与否
      if (notOver) {
        tips = tipsGo(tempKey);
        document.getElementsByTagName("span")[0].innerText = tips;
      }
    }
    this.onclick = null;// 点击之后取消点击事件
  }
}

// 提示走黑还是走白
function tipsGo(tempKey) {
  if (tempKey) {
    return "黑棋走";
  } else {
    return "白棋走";
  }
}

/**
 *判断各种赢的方式
 *x代表很坐标,y代表纵坐标
 *1.竖赢,就是x值相同,取y值排序后比较
 *2.横赢,就是y值相同,取x值排序后比较
 *3.正斜赢,x+y相同的值,取x或y排序后比较
 *4.反斜赢,x-y相同的值,取x或y排序后比较
 */
function victory(target, c) {
  if (target.length >= 5) {
    // 1.竖赢yCanWin
    for (var i = 0; i < target.length; i++) {
      for (var j = 0; j < target.length; j++) {
        if (target[j][1] == target[i][1]) {
          yCanWin.push(target[j]);//把x相同的值放入数组yCanWin
        }
      }
      yWin(yCanWin, c);
      yCanWin = [];
    }
    // 2.横赢xCanWin
    for (var m = 0; m < target.length; m++) {
      for (var n = 0; n < target.length; n++) {
        if (target[n][0] == target[m][0]) {
          xCanWin.push(target[n]);//把y相同的值放入数组xCanWin
        }
      }
      xWin(xCanWin, c);
      xCanWin = [];
    }
    // 3.正斜赢xyCanWin(左下到右上)
    for (var a = 0; a < target.length; a++) {
      for (var b = 0; b < target.length; b++) {
        if (parseInt(target[b][0]) + parseInt(target[b][1]) == parseInt(target[a][0]) + parseInt(target[a][1])) {
          xyCanWin.push(target[b])
        }
      }
      yWin(xyCanWin, c);
      xyCanWin = [];
    }
    // 4.反斜赢yxCanWin(左上到右下)
    for (var v = 0; v < target.length; v++) {
      for (var w = 0; w < target.length; w++) {
        if (parseInt(target[w][0]) - parseInt(target[w][1]) == parseInt(target[v][0]) - parseInt(target[v][1])) {
          yxCanWin.push(target[w])
        }
      }
      xWin(yxCanWin, c);
      yxCanWin = [];
    }
  }
}
// 棋的竖赢条件(棋的正斜赢条件)
function yWin(yCanWin, c) { // c = 0代表黑子 c = 1代表白子
  var sortArray = [];//排序数组  
  for (var i = 0; i < yCanWin.length; i++) {
    sortArray.push(yCanWin[i][0]);
  }
  sortArray.sort(function (x, y) {
    return x - y;
  });
  // 数组排序后,前数和后数加一相比(注意数值类型的转换)
  for (var j = 0; j < sortArray.length; j++) {
    if (sortArray[j + 1]) {
      if (parseInt(sortArray[j]) + 1 == parseInt(sortArray[j + 1])) {
        count++; // 每有一个连续则加一,一次不连续就清零
        if (count == 4 && c == 0) {
          bv = true;
          notOver = false;// 游戏结束
          return;
        } else if (count == 4 && c == 1) {
          wv = true;
          notOver = false;
          return;
        }
      } else {
        count = 0;
      }
    }
  }
  count = 0;
}
// 棋的横赢条件(棋的反斜赢条件)
function xWin(xCanWin, c) {
  var sortArray = [];
  for (var i = 0; i < xCanWin.length; i++) {
    sortArray.push(xCanWin[i][1]);
  }
  sortArray.sort(function (x, y) {
    return x - y;
  });
  for (var j = 0; j < sortArray.length; j++) {
    if (sortArray[j + 1]) {
      if (parseInt(sortArray[j]) + 1 == parseInt(sortArray[j + 1])) {
        count++;
        if (count == 4 && c == 0) {
          bv = true;
          notOver = false;
          return;
        } else if (count == 4 && c == 1) {
          wv = true;
          notOver = false;
          return;
        }
      } else {
        count = 0;
      }
    }
  }
  count = 0;
}

更多有趣的经典小游戏实现专题,分享给大家:

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

Javascript 相关文章推荐
JS中简单的实现像C#中using功能(有源码下载)
Jan 09 Javascript
jquery实现居中弹出层代码
Aug 25 Javascript
js将json格式内容转换成对象的方法
Nov 01 Javascript
jquery dialog open后,服务器端控件失效的快速解决方法
Dec 19 Javascript
JS实现的Select三级下拉菜单代码
Aug 20 Javascript
Ajax与服务器(JSON)通信实例代码
Nov 05 Javascript
详解ES6中的let命令
Apr 05 Javascript
详解自动生成博客目录案例
Dec 09 Javascript
常用jQuery选择器汇总
Feb 02 Javascript
详解使用angularjs的ng-options时如何设置默认值(初始值)
Jul 18 Javascript
深入理解React Native原生模块与JS模块通信的几种方式
Jul 24 Javascript
基于vue实现网站前台的权限管理(前后端分离实践)
Jan 13 Javascript
Nuxt的动态路由和参数校验操作
Nov 09 #Javascript
jQuery实现移动端扭蛋机抽奖
Nov 08 #jQuery
JS实现炫酷轮播图
Nov 15 #Javascript
JS实现购物车基本功能
Nov 08 #Javascript
Vue实现购物车基本功能
Nov 08 #Javascript
vue实现顶部菜单栏
Nov 08 #Javascript
Vue实现菜单切换功能
Nov 08 #Javascript
You might like
PHP syntax error, unexpected $end 错误的一种原因及解决
2008/10/25 PHP
CodeIgniter安全相关设置汇总
2014/07/03 PHP
Laravel中间件实现原理详解
2016/10/09 PHP
PHP实现网站应用微信登录功能详解
2019/04/11 PHP
javascript 支持链式调用的异步调用框架Async.Operation
2009/08/04 Javascript
jQuery 使用手册(四)
2009/09/23 Javascript
SyntaxHighlighter语法高亮插件使用说明
2011/08/14 Javascript
iframe里的页面禁止右键事件的方法
2014/06/10 Javascript
JavaScript实现搜索框的自动完成功能(一)
2016/02/25 Javascript
BootStrap智能表单实战系列(六)表单编辑页面的数据绑定
2016/06/13 Javascript
AngularJS 过滤与排序详解及实例代码
2016/09/14 Javascript
JavaScript通过filereader接口读取文件
2017/05/10 Javascript
Vue内容分发slot(全面解析)
2017/08/19 Javascript
vue中格式化时间过滤器代码实例
2019/04/17 Javascript
Vue实现图片与文字混输效果
2019/12/04 Javascript
js实现左右轮播图
2020/01/09 Javascript
node.JS二进制操作模块buffer对象使用方法详解
2020/02/06 Javascript
Nodejs 数组的队列以及forEach的应用详解
2021/02/25 NodeJs
python自动格式化json文件的方法
2015/03/11 Python
python使用opencv进行人脸识别
2017/04/07 Python
python画折线图的程序
2018/07/26 Python
pycharm运行程序时在Python console窗口中运行的方法
2018/12/03 Python
浅谈Django中view对数据库的调用方法
2019/07/18 Python
聊聊python中的异常嵌套
2020/09/01 Python
详解查看Python解释器路径的两种方式
2020/10/15 Python
用python进行视频剪辑
2020/11/02 Python
html5 http的轮询和Websocket原理
2018/10/19 HTML / CSS
前端H5 Video常见使用场景简介
2020/08/21 HTML / CSS
什么是组件架构
2016/05/15 面试题
采购部主管岗位职责
2014/01/01 职场文书
中秋节礼品促销方案
2014/02/02 职场文书
中药学专业求职信
2014/05/31 职场文书
九一八事变演讲稿范文
2014/09/14 职场文书
中共广东省委常委会党的群众路线教育实践活动整改方案
2014/09/23 职场文书
Python爬虫 简单介绍一下Xpath及使用
2022/04/26 Python
Pytorch中expand()的使用(扩展某个维度)
2022/07/15 Python