纯JS实现五子棋游戏


Posted in Javascript onMay 28, 2020

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

基本实现方式是表格,当时想用黑白圆棋代替的,但是尺寸没调好,就先上黑白底色了

纯JS实现五子棋游戏

说一下实现思路,刚开始是想每次落子的时候都把整个棋盘上的子遍历一遍,然后判断四个方向(横,竖,左斜,右斜)上的点数是不是想加等于5,做到一半的时候感觉这种效率太低了,也没必要,,然后就在每次落子之后判断它四个方向相加是不是等于5(不算落子本身),这是各个方向的最终效果

横向:

纯JS实现五子棋游戏

竖向:

纯JS实现五子棋游戏

左斜:

纯JS实现五子棋游戏

右斜:

纯JS实现五子棋游戏

横向和竖向的图是我修改过后的,加了一个定时器,所以先上色再弹窗
左斜和右斜的图,不知道为什么先弹窗再上色,这个待会研究一下

不多说,直接上代码:

<!DOCTYPE html>
<html>
 <head>
 <meta charset="UTF-8">
 <title></title>
 </head>
 <link rel="stylesheet" href="../bootstrap-3.3.7/dist/css/bootstrap.min.css" rel="external nofollow" />
 <script type="text/javascript" src="../js/jquery.min.js"></script>
 <body>
 <table id="tab" class="table table-bordered table-hover" style="width: 50%;">
  <tbody id="tb">
  </tbody>
 </table>
 <button id="reloadTb" class="btn btn-primary btn-block" style="width: 20%;">重置棋盘 </button>
 </body>
 <script type="text/javascript">
 var k = 1;
 var countRow = 14;

 $(function() {
  createTable();
 })
 
 $("#reloadTb").click(function() {
  $("#tb").empty();
  createTable();
 })

 var createTable = function() {
  for(let i = 0; i < countRow; i++) {
  let tr = $("<tr></tr>");
  for(var j = 0; j < countRow; j++) {
   let td = $("<td style='background-color: #FDF5E6;'></td>");
   td.css("height", "40px");
   td.css("width", "40px");
   tr.append(td);
   td.appendTo(tr).bind('click', tdClick);
  }
  $("#tb").append(tr);
  }
 }

 function tdClick() {
  var hang = $(this).parent("tr").prevAll().length;
  var lie = $(this).prevAll().length;
  hang = Number(hang); //字符串变为数字
  lie = Number(lie);
  //console.log("第" + hang + "行" + "第" + lie + "列");
  if(k == 1) {
  $(this).css("background-color", "black");
  $(this).css("color", "black");
  $(this).html(1);
  $(this).unbind("click");
  checksuc(hang, lie, 1);
  k++;
  } else {
  $(this).css("background-color", "white");
  $(this).css("color", "white");
  $(this).html(2);
  $(this).unbind("click");
  checksuc(hang, lie, 2);
  k--;
  }
 }

 function checksuc(hang, lie, flag) {
  let trArr = $("#tb").children();
  var leftNum = 0,rightNum = 0,i;
  /**
  * 左右判断
  */
  i = lie - 1;
  leftNum = caculate(i, hang, lie, flag, leftNum, trArr, 1, 1);
  i = lie + 1;
  rightNum = caculate(i, hang, lie, flag, rightNum, trArr, 2, 1);
  if(alert2((leftNum + rightNum), flag) != -1){
  return false;
  }
  /**
  * 上下判断
  */
  leftNum = 0;
  rightNum = 0;
  i = hang - 1;
  leftNum = caculate(i, hang, lie, flag, leftNum, trArr, 1, 2);
  i = hang + 1;
  rightNum = caculate(i, hang, lie, flag, rightNum, trArr, 2, 2);
  if(alert2((leftNum + rightNum), flag) != -1){
  return false;
  }

  leftNum = 0;
  rightNum = 0;//初始化数值
  let hang2,lie2;
  /**
  * 左斜判断
  */
  hang2 = hang;
  lie2 = lie;
  leftNum = obliqueCheck(hang2, lie2, trArr, flag, leftNum, 1, 1);
  hang2 = hang;
  lie2 = lie;
  rightNum = obliqueCheck(hang2, lie2, trArr, flag, rightNum, 2, 2);
  if(alert2((leftNum + rightNum), flag) != -1){
  return false;
  }
  
  leftNum = 0;
  rightNum = 0;//初始化数值
  hang2 = hang;
  lie2 = lie;
  /**
  * 右斜判断
  */
  leftNum = obliqueCheck(hang2, lie2, trArr, flag, leftNum, 2, 1);
  hang2 = hang;
  lie2 = lie; //初始化数值
  rightNum = obliqueCheck(hang2, lie2, trArr, flag, rightNum, 1, 2);
  alert2((leftNum + rightNum), flag);
 }

 function obliqueCheck(hang2, lie2, trArr, flag, num, subtractHang, subtractLie) {
  while(hang2 >= 0 && lie2 >= 0) {//左斜右斜判断的时候行和列的左边都必须大于0
  hang2 = subtractHang == 1 ? (hang2 - 1) : (hang2 + 1);
  lie2 = subtractLie == 1 ? (lie2 - 1) : (lie2 + 1);
  var val = trArr.eq(hang2).find("td").eq(lie2).html();
  if(flag == val) {
   num++;
  } else {
   break;
  }
  }
  return num;
 }
 
 function caculate(i, hang, lie, flag, num, trArr, ff, dd) {
  //ff用来判断while里的条件,dd判断列使用的哪个参数
  var result;
  result = (ff == 1) ? (i >= 0) : (i < countRow);
  while(result) {
  var val = trArr.eq(dd == 1 ? hang : i).find("td").eq(dd == 2 ? lie : i).html();
  if(flag == val) {
   num++;
  } else {
   break;
  }
  i = ff == 1 ? (i - 1) : (i + 1);
  result = (ff == 1) ? (i >= 0) : (i < countRow);
  }
  return num;
 }

 function alert2(count, flag) {
  if(count == 4) {//左边相同棋子加右边棋子为4则符合
  if(flag == 1) {
   alert("黑棋胜");
  } else {
   alert("白棋胜");
  }
  return 1;
  }
  return -1;
 }
 /*while(i >= 0) { //1
  var val = trArr.eq(hang).find("td").eq(i).html(); //1
  if(flag == val) {
   leftNum++;
  } else {
   break;
  }
  i--;
  }*/
 /*while(i < countRow) { //2
  var val = trArr.eq(hang).find("td").eq(i).html(); //1
  if(flag == val) {
  rightNum++;
  } else {
  break;
  }
  i++;
 }*/
 /*while(i >= 0) {
  var val = trArr.eq(i).find("td").eq(lie).html();
  if(flag == val) {
  leftNum++;
  } else {
  break;
  }
  i--;
 }
 i = hang + 1;
 while(i < countRow) {
  var val = trArr.eq(i).find("td").eq(lie).html();
  if(flag == val) {
  rightNum++;
  } else {
  break;
  }
  i++;
 }*/
 </script>
</html>

刚开始实现的时候直接写了8个for循环,两百多行,最后优化了一下,把相同的合并到一个while里了,自己随便写着玩的,之前用的while没删直接注释在最后边了,有的命名不太规范请见谅!

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

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

Javascript 相关文章推荐
张孝祥JavaScript学习阶段性总结(2)--(X)HTML学习
Feb 03 Javascript
键盘 keycode的值 javascript时触发事件时很有用的要素
Nov 02 Javascript
JS 屏蔽按键效果与改变按键效果的示例代码
Dec 24 Javascript
使用jQuery和Bootstrap实现多层、自适应模态窗口
Dec 22 Javascript
Node.js编写组件的三种实现方式
Feb 25 Javascript
浅谈js的html元素的父节点,子节点
Aug 06 Javascript
jquery.Callbacks的实现详解
Nov 30 Javascript
手动用webpack搭建第一个ReactApp的示例
Apr 11 Javascript
使用Vue-cli 3.0搭建Vue项目的方法
Jun 07 Javascript
小程序自定义导航栏兼容适配所有机型(附完整案例)
Apr 26 Javascript
js+canvas实现转盘效果(两个版本)
Sep 13 Javascript
js 实现验证码输入框示例详解
Sep 23 Javascript
js实现简单五子棋游戏
May 28 #Javascript
js实现双人五子棋小游戏
May 28 #Javascript
vue实现五子棋游戏
May 28 #Javascript
用vue 实现手机触屏滑动功能
May 28 #Javascript
Jquery高级应用Deferred对象原理及使用实例
May 28 #jQuery
JQuery插件tablesorter表格排序实现过程解析
May 28 #jQuery
JS替换字符串中指定位置的字符(多种方法)
May 28 #Javascript
You might like
解决dede生成静态页和动态页转换的一些问题,及火车采集入库生成动态的办法
2007/03/29 PHP
PHP中文件上传的一个问题
2010/09/04 PHP
对象失去焦点时自己动提交数据的实现代码
2012/11/06 PHP
ThinkPHP模板替换与系统常量及应用实例教程
2014/08/22 PHP
PHP内核学习教程之php opcode内核实现
2016/01/27 PHP
PHP实现仿百度文库,豆丁在线文档效果(word,excel,ppt转flash)
2016/03/10 PHP
JavaScript 模仿vbs中的 DateAdd() 函数的代码
2007/08/13 Javascript
JavaScript函数、方法、对象代码
2008/10/29 Javascript
深入理解JavaScript作用域和作用域链
2011/10/21 Javascript
完美解决IE低版本不支持call与apply的问题
2013/12/05 Javascript
href下载文件根据id取url并下载
2014/05/28 Javascript
Javascript表单验证要注意的事项
2014/09/29 Javascript
jQuery实现动态添加和删除一个div
2015/08/12 Javascript
jquery validate表单验证的基本用法入门
2016/01/18 Javascript
详解vue指令与$nextTick 操作DOM的不同之处
2018/08/02 Javascript
微信小程序实现工作时间段选择
2019/02/15 Javascript
微信小程序实现侧边分类栏
2019/10/21 Javascript
Python 面向对象 成员的访问约束
2008/12/23 Python
python实现多线程暴力破解登陆路由器功能代码分享
2015/01/04 Python
Python制作Windows系统服务
2017/03/25 Python
Python实现冒泡排序的简单应用示例
2017/12/11 Python
使用PIL(Python-Imaging)反转图像的颜色方法
2019/01/24 Python
python selenium firefox使用详解
2019/02/26 Python
python range实例用法分享
2020/02/06 Python
CSS3实现的文本3D效果附图
2014/09/03 HTML / CSS
NARS化妆品官方商店:美国彩妆品牌
2017/08/26 全球购物
英国音乐设备和乐器商店:Gear4music
2017/10/16 全球购物
新加坡网上美容店:Hermo新加坡
2019/06/19 全球购物
财务出纳岗位职责
2015/03/31 职场文书
2016社区平安家庭事迹材料
2016/02/26 职场文书
提升Nginx性能的一些建议
2021/03/31 Servers
超详细Python解释器新手安装教程
2021/05/10 Python
关于flex 上下文中自动 margin的问题(完整例子)
2021/05/20 HTML / CSS
适合后台管理系统开发的12个前端框架(小结)
2021/06/29 Javascript
试用1103暨1103、1101同门大比武 [ DAIWEI ]
2022/04/05 无线电
移除Selenium中window.navigator.webdriver值
2022/06/10 Python