五子棋案例

本文详细介绍了一款五子棋游戏的开发过程,包括HTML、CSS布局设计,JavaScript逻辑实现,以及如何判断游戏胜负的算法。通过具体代码示例,展示了如何创建棋盘,放置棋子,并检查水平、垂直和对角线上的连珠情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

五子棋案例

在这里插入图片描述

一,五子棋结构和样式:需要准备黑白棋子图片

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>象棋</title>
		<style>
			*{
				margin: 0;
				padding: 0;
			}
			html,body{
				overflow: hidden;
				height: 100%;
			}
			table,tbody{
				position: absolute;
				left: 0;
				top: 0;
				right: 0;
				bottom: 0;
				margin: auto;
				height: 600px;
				width: 900px;
				box-sizing: border-box;
				border-collapse: collapse;
			}
			td{
				border: 1px solid red;
				width: 60px;
				height: 60px;
			}
			.chess{
				width: 40px;
				height: 40px;
				background-size: 40px 40px;
				position: absolute;
			}
		</style>
	</head>
	<body>
      <table>
      	<tr>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      	</tr>
      	<tr>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      	</tr>
      	<tr>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      	</tr>
      	<tr>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      	</tr>
      	<tr>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      	</tr>
      	<tr>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      	</tr>
      	<tr>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      	</tr>
      	<tr>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      	</tr>
      	<tr>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      	</tr>
      	<tr>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      		<td></td>
      	</tr>
      </table>
	</body>
</html>
<script src="js/fiveChess.js"></script>

二,五子棋脚本

/*
 五子棋规则
   水平一道
   下面三道规则一样
   竖直一道
   倾斜两道
 * 
 * */


var oWrap=document.querySelector("table");//获取当前表格
var fiveChess=new FiveChess();//五子棋实例
oWrap.onclick=function(ev){
	fiveChess.count++;
	var ev=ev||event;
	var disX=ev.x-this.offsetLeft;
	var disY=ev.y-this.offsetTop;
	//获取落下的格子索引
	var numX=Math.round(disX/60);
	var numY=Math.round(disY/60);
	fiveChess.dragChess(numX,numY)
}
function FiveChess(){
	this.count=0;//奇数是白子
	this.whiteChess=[];//盛放白色棋子
	this.blackChess=[];//盛放黑色棋子
	this.dragChess=function(numX,numY){//绘制棋子
		  if(this.count%2==0){//表示双数
		  	  this.createChess(numX,numY,"black")
		  }else{//表示单数
		  	  this.createChess(numX,numY,"white")
		  }
	}
	this.createChess=function(numX,numY,color){//创建棋子
		var oChess = document.createElement("span");
		var obj = {};
		obj.Xindex = numX
		obj.Yindex = numY
		oChess.classList.add("chess");
		oChess.style.left = numX * 60 - 20 + "px";
		oChess.style.top = numY * 60 - 20 + "px";
		if(color == "black") {
			oChess.index = "b";
			oChess.style.backgroundImage = "url(image/black.png)"
			this.blackChess.push(obj);
		} else {
			oChess.index = "w";
			oChess.style.backgroundImage = "url(image/white.png)"
			this.whiteChess.push(obj)
		}
		oWrap.appendChild(oChess);
		this.countCurrentChess(numX, numY, color);//
	}
    this.countCurrentChess=function(numX, numY, color){//棋子输赢规则
	    	//因为白棋子优先,所以最先达到5个
	    
	  	 if(this.whiteChess.length>=5){
	 
 	      if(this.horizontalSearch(numX, numY,color) || this.verticalSearch(numX, numY,color)|| this.LT_BR(numX, numY,color) || this.LB_RT(numX, numY,color)){
 	      	   alert("win")
 	      }

	  	 }
    }
    this.verticalSearch=function(numX,numY,color){ 	  //首先计算水平方向,找出同一排的棋子
		 var VArr = this[color+"Chess"].filter(function(item) { //处置坐标
		 	return item.Xindex == numX;
		 })
		 
//		 return this.countUtils(VArr,numX,numY,true);
	     var nowX = numX;
		 var nowY = numY;
		 var count = 1;
		 var YVArr = []; //盛放数值点
		 VArr.forEach(function(item) {
		 	YVArr.push(item.Yindex);
		 })
		 //当前坐标向上查找
		 for(var i = 0; i < YVArr.length; i++) {
		 	nowY -= 1;
		 	if(YVArr.indexOf(nowY) != -1) { //说明有
		 		count++;
		 	} else {
		 		nowY = numY
		 		break;
		 	}
		 }
		 //当前坐标向右查找
		 for(var j = 0; j < YVArr.length; j++) {
		 	nowY += 1;
		 	if(YVArr.indexOf(nowY) != -1) { //说明有
		 		count++;
		 	} else {
		 		break;
		 	}
		 }
	
		 if(count >= 5) {
		 	console.log("win");
		 	return true;
		 }
	
		 return false;
    }
    this.horizontalSearch=function(numX,numY,color){ 	  //首先计算水平方向,找出同一排的棋子
		var HArr = this[color + "Chess"].filter(function(item) {
			return item.Yindex == numY;
		})
		return this.countUtils(HArr, numX, numY, false);
    }
    this.LT_BR=function(numX,numY,color){//从左上到右下
		var Arr = this[color + "Chess"].filter(function(item) { //进来的都是
			return item.Xindex - item.Yindex == numX - numY;
		})
		return this.countUtils(Arr, numX, numY, false);
    }
    this.LB_RT=function(numX,numY,color){//从左上到右下
		var Arr = this[color + "Chess"].filter(function(item) { //进来的都是
			return item.Xindex + item.Yindex == numX + numY;
		})
		return this.countUtils(Arr, numX, numY, false)
    }
   this.countUtils=function(Arr,numX,numY,dir){
    	var nowX = numX;
		var nowY = numY;
		var count = 1;
		var XHArr = [];
		Arr.forEach(function(item) {
			if(dir) {
				XHArr.push(item.Yindex);
			} else {
		
				XHArr.push(item.Xindex);
			}
		})
		
		//当前坐标向左查找
		for(var i = 0; i < XHArr.length; i++) {
			nowX -= 1;
			if(XHArr.indexOf(nowX) != -1) { //说明有
				count++;
			} else {
				nowX = numX
				break;
			}
		}
		//当前坐标向右查找
		for(var j = 0; j < XHArr.length; j++) {
			nowX += 1;
			if(XHArr.indexOf(nowX) != -1) { //说明有
				count++;
			} else {
				break;
			}
		}
		if(count >= 5) {
			console.log("win");
			return true;
		}
		
		return false;
		}
}

三,五子棋备注

  1. 五子棋规律

    1. 水平方向:

      1. 根据当前棋子坐标索引先找到同一排的所有棋子放在一个数组中
      2. 把当前一排的棋子X索引放在另外一个数组中
      3. 使用一个变量统计相邻同色棋子出现的次数
      4. 先从当前棋子索引不断向一个方向查找,一旦找不到相邻的棋子则反方向查找,找打一次+1
    2. 竖直方向:

      1. 根据当前棋子坐标索引先找到同一排的所有棋子放在一个数组中
      2. 把当前一排的棋子Y索引放在另外一个数组中
      3. 使用一个变量统计相邻同色棋子出现的次数
      4. 先从当前棋子索引不断向一个方向查找,一旦找不到相邻的棋子则反方向查找,找打一次+1
    3. 倾斜方向:

      1. 左上到右下满足X索引-Y索引
        1. 根据当前棋子坐标索引先找到同一排的所有棋子放在一个数组中
        2. 把当前一排的棋子Y索引放在另外一个数组中
        3. 使用一个变量统计相邻同色棋子出现的次数
        4. 先从当前棋子索引不断向一个方向查找,一旦找不到相邻的棋子则反方向查找,找打一次+1
      2. 左下到右上满足X索引+Y索引
        1. 根据当前棋子坐标索引先找到同一排的所有棋子放在一个数组中
        2. 把当前一排的棋子Y索引放在另外一个数组中
        3. 使用一个变量统计相邻同色棋子出现的次数
        4. 先从当前棋子索引不断向一个方向查找,一旦找不到相邻的棋子则反方向查找,找打一次+1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

如鹰展翅上腾

谢谢老板

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值