五子棋案例
一,五子棋结构和样式:需要准备黑白棋子图片
<!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;
}
}
三,五子棋备注
-
五子棋规律
-
水平方向:
- 根据当前棋子坐标索引先找到同一排的所有棋子放在一个数组中
- 把当前一排的棋子X索引放在另外一个数组中
- 使用一个变量统计相邻同色棋子出现的次数
- 先从当前棋子索引不断向一个方向查找,一旦找不到相邻的棋子则反方向查找,找打一次+1
-
竖直方向:
- 根据当前棋子坐标索引先找到同一排的所有棋子放在一个数组中
- 把当前一排的棋子Y索引放在另外一个数组中
- 使用一个变量统计相邻同色棋子出现的次数
- 先从当前棋子索引不断向一个方向查找,一旦找不到相邻的棋子则反方向查找,找打一次+1
-
倾斜方向:
- 左上到右下满足X索引-Y索引
- 根据当前棋子坐标索引先找到同一排的所有棋子放在一个数组中
- 把当前一排的棋子Y索引放在另外一个数组中
- 使用一个变量统计相邻同色棋子出现的次数
- 先从当前棋子索引不断向一个方向查找,一旦找不到相邻的棋子则反方向查找,找打一次+1
- 左下到右上满足X索引+Y索引
- 根据当前棋子坐标索引先找到同一排的所有棋子放在一个数组中
- 把当前一排的棋子Y索引放在另外一个数组中
- 使用一个变量统计相邻同色棋子出现的次数
- 先从当前棋子索引不断向一个方向查找,一旦找不到相邻的棋子则反方向查找,找打一次+1
- 左上到右下满足X索引-Y索引
-