原生JavaScript实现简单五子棋游戏


Posted in Javascript onJune 28, 2021

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

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>

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经典小游戏汇总的全部文章,请参考专题进行学习。

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

Javascript 相关文章推荐
document对象execCommand的command参数介绍
Aug 01 Javascript
Jquery创建层显示标题和内容且随鼠标移动而移动
Jan 26 Javascript
原生js的弹出层且其内的窗口居中
May 14 Javascript
jQuery中Form相关知识汇总
Jan 06 Javascript
jQuery 1.9.1源码分析系列(十三)之位置大小操作
Dec 02 Javascript
详解angularJs中自定义directive的数据交互
Jan 13 Javascript
angular2路由切换改变页面title的示例代码
Aug 23 Javascript
js实现点击按钮复制文本功能
Jul 20 Javascript
Angular使用ControlValueAccessor创建自定义表单控件
Mar 08 Javascript
node.js使用http模块创建服务器和客户端完整示例
Feb 10 Javascript
JS 数组和对象的深拷贝操作示例
Jun 06 Javascript
在Vue里如何把网页的数据导出到Excel的方法
Sep 30 Javascript
javascript拖曳互换div的位置实现示例
Node实现搜索框进行模糊查询
React + Threejs + Swiper 实现全景图效果的完整代码
Vue实现tab导航栏并支持左右滑动功能
React列表栏及购物车组件使用详解
React如何创建组件
Jun 27 #Javascript
Vue3.0写自定义指令的简单步骤记录
You might like
PHP动态分页函数,PHP开发分页必备啦
2011/11/07 PHP
PHP常用字符串函数小结(推荐)
2018/08/05 PHP
PHP单例模式模拟Java Bean实现方法示例
2018/12/07 PHP
关于extjs treepanel复选框选中父节点与子节点的问题
2013/04/02 Javascript
js动态添加onclick事件可传参数与不传参数
2014/07/29 Javascript
浅谈Javascript变量作用域问题
2014/12/16 Javascript
JavaScript Math.floor方法(对数值向下取整)
2015/01/09 Javascript
JavaScript中property和attribute的区别详细介绍
2015/03/03 Javascript
jQuery复制表单元素附源码分享效果演示
2015/09/30 Javascript
Bootstrap网格系统详解
2016/04/26 Javascript
第十篇BootStrap轮播插件使用详解
2016/06/21 Javascript
深入解析js轮播插件核心代码的实现过程
2017/04/14 Javascript
用Vue写一个分页器的示例代码
2018/04/22 Javascript
webpack4 + react 搭建多页面应用示例
2018/08/03 Javascript
D3.js的基础部分之数组的处理数组的排序和求值(v3版本)
2019/05/09 Javascript
完美解决通过IP地址访问VUE项目的问题
2020/07/18 Javascript
[01:14:31]Secret vs VG 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
从零学Python之hello world
2014/05/21 Python
从零学python系列之新版本导入httplib模块报ImportError解决方案
2014/05/23 Python
Python数据结构之翻转链表
2017/02/25 Python
Python中property属性实例解析
2018/02/10 Python
Python cookbook(数据结构与算法)根据字段将记录分组操作示例
2018/03/19 Python
小白入门篇使用Python搭建点击率预估模型
2018/10/12 Python
python requests证书问题解决
2019/09/05 Python
python找出列表中大于某个阈值的数据段示例
2019/11/24 Python
HTML5地理定位与第三方工具百度地图的应用
2016/11/17 HTML / CSS
潘多拉意大利官方网上商城:网上选购PANDORA珠宝
2018/10/07 全球购物
物流专员岗位职责
2014/02/17 职场文书
意向协议书范本
2014/04/23 职场文书
听课评语大全
2014/04/30 职场文书
微电影大赛策划方案
2014/06/05 职场文书
小学安全汇报材料
2014/08/14 职场文书
报表员工作失误检讨书范文
2014/09/19 职场文书
拯救大兵瑞恩观后感
2015/06/09 职场文书
诚信考试主题班会
2015/08/17 职场文书
2016年基层党组织公开承诺书
2016/03/25 职场文书