持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第26天,点击查看活动详情
页面布局:
<div class="divs">
<P>恭喜白棋赢得胜利,获得宝马一辆</P>
<img src="./image/QQ图片20220607191156.jpg" alt="" class="imgs">
</div>
<div class="divs1">
<P>恭喜黑棋赢得胜利,获得宝马一辆</P>
<img src="./image/QQ图片20220607191156.jpg" alt="" class="imgs">
</div>
<div class="box_top">
<div class="box_top_btn">
<!-- 开始按钮 -->
<button class="beginGameBth" id="beginGameBth" onclick="beginGameBth()"></button>
<!-- 重新开始 -->
<button class="restarGameBth" id="restarGameBth" onclick="restarGameBth()"></button>
</div>
<!-- 定义一个棋子,白棋先走 -->
<div class="before_qz">
执子方:
<div class="before_qz_on" id="before_qz_on">白棋</div>
</div>
</div>
<div class="box_down">
<div class="box_down_tb">
<table>
<tr>
<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>
</tr>
<tr>
<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>
</tr>
<tr>
<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>
</tr>
<tr>
<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>
</tr>
<tr>
<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>
</tr>
</table>
</div>
</div>
页面样式:
<style>
* {
margin: 0;
padding: 0;
}
body {
width: 800px;
}
.box_top_btn {
margin: 20px auto;
width: 200px;
}
.box_top_btn #beginGameBth {
background-image: url(./image/微信图片_20220606111550.jpg);
width: 100px;
height: 30px;
background-size: cover;
float: left;
}
.box_top_btn #restarGameBth {
background-image: url(./image/微信图片_20220606111517.jpg);
width: 100px;
height: 30px;
background-size: cover;
/* float: right; */
}
.box_top>.before_qz {
margin: 0 auto;
width: 150px;
}
.box_down_tb {
margin: 0 auto;
width: 600px;
}
table {
width: 600px;
height: 600px;
border: 1px solid black;
border-collapse: collapse;
}
td {
width: 50px;
height: 50px;
border: 1px solid black;
}
.divs,
.divs1 {
border: 1px solid black;
width: 300px;
position: absolute;
display: none;
top: 350px;
left: 730px;
text-align: center;
}
.imgs {
width: 200px;
}
</style>
js
<script>
let divs = document.querySelector(".divs")
let divs1 = document.querySelector(".divs1")
定义执子方,如果是1是白棋 0 黑棋
let presentChess = 1
//开始游戏,0没有开始
let beginFlag = 0
//执子方
let before_qz_on;
数组记录下棋棋盘的情况
let chessboard = new Array(10)
遍历获取每个单元格
for (var i = 0; i < 10; i++) {
chessboard[i] = new Array(10)
// 初始化下棋的状态为-1,则是没有开始
for (var j = 0; j < 10; j++) {
chessboard[i][j] = -1
}
}
重新开始
function restarGameBth() {
//遍历让单元格清空
for (var i = 0; i < 100; i++) {
document.getElementsByTagName("td")[i].innerHTML = ""
}
//清除期盼的记录
for (var i = 0; i < 10; i++) {
for (var j = 0; j < 10; j++) {
chessboard[i][j] = -1
}
}
}
开始按钮游戏
function beginGameBth() {
//绑定棋盘格的点击事件
for (var i = 0; i < 100; i++) {
document.getElementsByTagName("td")[i].onclick = playChess
}
}
获取执子方
before_qz_on = document.getElementById("before_qz_on")
// 点击开始按钮后,开始下棋
function playChess() {
//先判断单元格是否为空,如果是则下棋,否则不操作
let text = this.innerHTML
if (text != "") {
return
}
放棋子图片
let bqstr = '<img src="./image/微信图片_20220606111457.jpg" width="100%" height="100%">'
let hqstr = '<img src="./image/微信图片_20220606111523.jpg" width="100%" height="100%">'
// let bqstr = '<span>八嘎</span>'
// let hqstr = '<span>拜登</span>'
1是白棋 0是黑棋
if (presentChess == 1) {
this.innerHTML = bqstr
// rowIndex 返回表格中行的序号(只读)
// cellIndex 返回单元格在行中的位置(只读)
// 点击后获取棋子在数组中的位置
chessboard[this.parentNode.rowIndex][this.cellIndex] = 1
if (ifWin(this.parentNode.rowIndex, this.cellIndex)) {
if (presentChess == 1) {
let tds = document.getElementsByTagName("td")
for (let i in tds) {
tds[i].innerHTML = ""
}
restarGameBth()
divs.style.display = "block"
setTimeout(function(){
divs.style.display = "none"
},1000)
// alert("白棋赢")
} else {
alert("黑棋获胜")
}
}
presentChess = 0
before_qz_on.innerHTML = "黑棋"
} else {
this.innerHTML = hqstr
chessboard[this.parentNode.rowIndex][this.cellIndex] = 0
if (ifWin(this.parentNode.rowIndex, this.cellIndex)) {
if (presentChess == 0) {
let tds = document.getElementsByTagName("td")
for (let i in tds) {
tds[i].innerHTML = ""
}
restarGameBth()
divs1.style.display = "block"
setTimeout(function(){
divs1.style.display = "none"
},1000)
// alert("黑棋获胜")
} else {
alert("白棋获胜")
}
}
presentChess = 1
before_qz_on.innerHTML = "白棋"
}
}
判断是否胜利,h(行),l(列)
function ifWin(h, l) {
//s表示棋子相连的个数
let s = 1;
初步判断有四条轴可以赢,上下左右
每条轴上加上下的棋子可以有九个棋子
当我们某种颜色棋子连续达到五个可以赢
4条轴上每个点的坐标是x,y 以我们下的棋子为中心,左上方的坐标为(x-1,y-1),右下角坐标(x+1,y+1) 所以说每个方向都是x,y 和1,-1,0,两两搭配
// 竖直方向
//判断棋子上方链接的数量
for (var i = 1; i <= (h > 4 ? 4 : h); i++) {
if (chessboard[h - i][l] == presentChess) {
s++
} else {
break;
}
}
判断棋子下方链接的数量
for (var i = 1; i <= (9 - h > 4 ? 4 : 9 - h); i++) {
if (chessboard[h + i][l] == presentChess) {
s++
} else {
break;
}
}
if (s >= 5) {
return 1;
}
判断水平方向
s = 1;
for (var i = 1; i <= (l > 4 ? 4 : l); i++) {
if (chessboard[h][l - i] == presentChess) {
s++
} else {
break
}
}
for (var i = 1; i <= (9 - l > 4 ? 4 : 9 - l); i++) {
if (chessboard[h][l + i] == presentChess) {
s++
} else {
break
}
}
if (s >= 5) {
return 1
}
左上到右下斜线方向
s = 1
//封装返回最小值
function min(x, y, z) {
return (x > y ? y : x) > z ? z : (x > y ? y : x)
}
左上角连续的棋子数
//一般可以指考虑较小的那个棋子半径
// min取值,最小值如果是0,则元素没有左上角,就不执行
for (var i = 1; i <= min(4, l, h); i++) {
if (chessboard[h - i][l - i] == presentChess) {
s++
} else {
break
}
}
右下角连续的棋子数
for (var i = 1; i <= min(4, 9 - l, 9 - h); i++) {
if (chessboard[h + i][l + i] == presentChess) {
s++
} else {
break
}
}
if (s >= 5) {
return 1
}
// 右上到左下
s = 1
for (vari = 1; i <= min(4, 9 - l, h); i++) {
if (chessboard[h - i][l + i] == presentChess) {
s++
} else {
break;
}
}
for (var i = 1; i <= min(4, l, 9 - h); i++) {
if (chessboard[h + i][l - i] == presentChess) {
s++
} else {
break
}
}
if (s >= 5) {
return 1
}
return 0
}
</script>
当棋子连在一起可以提示,并且所有棋子消失