HTML5 Canvas实现Web五子棋游戏:核心算法与完整代码解析

作者:竹影

时间:2026-10-28

浏览:507

本文介绍如何使用HTML5 Canvas和JavaScript开发一个基础的Web五子棋游戏。重点解析利用二维数组存储棋盘状态,并通过检测落子点周围八个方向的同色棋子数量来实现胜负判定的核心算法。文章提供了完整的HTML结构、CSS样式及JavaScript交互逻辑代码,适合前端初学者理解Canvas绘图与游戏逻辑结合的实现方式。

文章目录

HTML5 Canvas实现Web五子棋游戏:核心算法与完整代码解析

这是一个基于JavaScript和HTML5编写的简易程序,目前仅支持双人对战,尚未集成人机对战功能。


游戏采用二维数组来映射棋盘上的落子点状态。数组元素的值代表该位置的状态:0表示该点为空,无棋子;1表示该点已放置白棋;2表示该点已放置黑棋。


五子棋胜负判定的算法逻辑,正是通过对上述二维数组中落子点数据的遍历与操作来实现的。



判断五子棋赢棋算法

下文提供的函数实现了五子棋胜负判定的核心逻辑,开发者也可以参考相关教材中的其他算法进行替代实现。


该判定函数的参数xx和yy代表当前落子点在二维数组中的下标,而chess数组则作为数据结构,映射并保存整个棋盘的实时状态。


算法的核心思想是:以当前落子点的下标为基准点,向其周围的八个方向进行扫描搜索。若发现连续五个同色棋子,则判定获胜并返回对应结果;否则返回平局或继续状态。具体而言,返回1代表白棋获胜,返回2代表黑棋获胜,返回0则表示当前未出现获胜局面。


HTML5 Canvas实现Web五子棋游戏:核心算法与完整代码解析 
HTML5 Canvas实现Web五子棋游戏:核心算法与完整代码解析
HTML5 Canvas实现Web五子棋游戏:核心算法与完整代码解析 

具体实现代码如下:

 
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<style type="text/css">
body {
margin: 10px;
} 
}</style>
<script type="text/javascript">
var canvas;
var context;
var isWhite = true;//设置是否该轮到白棋
var isWell = false;//设置该局棋盘是否赢了,如果赢了就不能再走了
var img_b = new Image();
img_b.src = "images/b.png";//白棋图片
var img_w = new Image();
img_w.src = "images/w.png";//黑棋图片
var chessData = new Array(15);//这个为棋盘的二维数组用来保存棋盘信息,初始化0为没有走过的,1为白棋走的,2为黑棋走的
for (var x = 0; x < 15; x++) {
chessData[x] = new Array(15);
for (var y = 0; y < 15; y++) {
chessData[x][y] = 0;
} 
} 
function drawRect() {//页面加载完毕调用函数,初始化棋盘
canvas = document.getElementById("canvas");
context = canvas.getContext("2d");
for (var i = 0; i <= 640; i += 40) {//绘制棋盘的线
context.beginPath();
context.moveTo(0, i);
context.lineTo(640, i);
context.closePath();
context.stroke();
context.beginPath();
context.moveTo(i, 0);
context.lineTo(i, 640);
context.closePath();
context.stroke();
} 
} 
function play(e) {//鼠标点击时发生
var x = parseInt((e.clientX - 20) / 40);//计算鼠标点击的区域,如果点击了(65,65),那么就是点击了(1,1)的位置
var y = parseInt((e.clientY - 20) / 40);
if (chessData[x][y] != 0) {//判断该位置是否被下过了
alert("你不能在这个位置下棋");
return;
} 
if (isWhite) {
isWhite = false;
drawChess(1, x, y);
} 
} else {
isWhite = true;
drawChess(2, x, y);
} 
} 
function drawChess(chess, x, y) {//参数为,棋(1为白棋,2为黑棋),数组位置
if (isWell == true) {
alert("已经结束了,如果需要重新玩,请刷新");
return;
} 
if (x >= 0 && x < 15 && y >= 0 && y < 15) {
if (chess == 1) {
context.drawImage(img_w, x * 40 + 20, y * 40 + 20);//绘制白棋
chessData[x][y] = 1;
} 
} else {
context.drawImage(img_b, x * 40 + 20, y * 40 + 20);
chessData[x][y] = 2;
} 
judge(x, y, chess);
} 
} 
function judge(x, y, chess) {//判断该局棋盘是否赢了
var count1 = 0;
var count2 = 0;
var count3 = 0;
var count4 = 0;
//左右判断
for (var i = x; i >= 0; i--) {
if (chessData[x][y] != chess) {
break;
}
} 
count1++;
} 
for (var i = x + 1; i < 15; i++) {
if (chessData[x][y] != chess) {
break;
}
} 
count1++;
} 
//上下判断
for (var i = y; i >= 0; i--) {
if (chessData[x][i] != chess) {
break;
}
} 
count2++;
} 
for (var i = y + 1; i < 15; i++) {
if (chessData[x][i] != chess) {
break;
}
} 
count2++;
} 
//左上右下判断
for (var i = x, j = y; i >= 0, j >= 0; i--, j--) {
if (chessData[i][j] != chess) {
break;
}
} 
count3++;
} 
for (var i = x + 1, j = y + 1; i < 15, j < 15; i++, j++) {
if (chessData[i][j] != chess) {
break;
}
} 
count3++;
} 
//右上左下判断
for (var i = x, j = y; i >= 0, j < 15; i--, j++) {
if (chessData[i][j] != chess) {
break;
}
} 
count4++;
} 
for (var i = x + 1, j = y - 1; i < 15, j >= 0; i++, j--) {
if (chessData[i][j] != chess) {
break;
}
} 
count4++;
} 
if (count1 >= 5 || count2 >= 5 || count3 >= 5 || count4 >= 5) {
if (chess == 1) {
alert("白棋赢了");
} 
} else {
alert("黑棋赢了");
} 
isWell = true;//设置该局棋盘已经赢了,不可以再走了
} 
} 
</script>
</head>
<body onload="drawRect()">
<div>
<canvas width="640" id="canvas" onmousedown="play(event)" height="640">你的浏览器不支持HTML5 canvas,请使用 google chrome 浏览器 打开.
</canvas>
</div>
</body>
</html>

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章