帮我写 js如何在canvas画布上实现五子棋悔棋功能的代码
时间: 2023-06-09 12:07:35 浏览: 132
好的,我可以为您提供代码来实现五子棋悔棋功能。
以下是示例代码:
```
// 初始化变量
var chessData = []; // 保存棋盘中的棋子数据
var steps = []; // 保存每一步棋的数据,用于悔棋
var isBlack = true; // 当前下棋的颜色
var isOver = false; // 游戏是否结束
// 初始化棋盘数据
for (var i = 0; i < 15; i++) {
chessData[i] = [];
for (var j = 0; j < 15; j++) {
chessData[i][j] = 0;
}
}
// 绑定棋盘点击事件
canvas.addEventListener('click', function(e) {
if (isOver) return; // 如果游戏已结束,直接返回
var x = Math.floor(e.offsetX / 30); // 获取点击位置的横坐标
var y = Math.floor(e.offsetY / 30); // 获取点击位置的纵坐标
if (chessData[x][y] !== 0) return; // 如果该位置已有棋子,直接返回
steps.push({
x: x,
y: y,
color: isBlack ? 1 : 2
}); // 保存该步棋的数据
chessData[x][y] = isBlack ? 1 : 2; // 在棋盘数据中标记该位置
drawChess(x, y, isBlack ? '#000' : '#fff'); // 在棋盘上绘制该位置的棋子
isBlack = !isBlack; // 切换下棋颜色
checkWin(x, y); // 检查是否获胜或平局
});
// 绑定悔棋按钮点击事件
document.getElementById('btnBack').addEventListener('click', function() {
if (isOver || steps.length === 0) return; // 如果游戏已结束或者没有可悔的棋步,直接返回
var lastStep = steps.pop(); // 取出最后一步棋的数据
chessData[lastStep.x][lastStep.y] = 0; // 在棋盘数据中清空该位置
clearChess(lastStep.x, lastStep.y); // 在棋盘上清除该位置的棋子
isBlack = !isBlack; // 切换下棋颜色
});
// 绘制棋子
function drawChess(x, y, color) {
var ctx = canvas.getContext('2d');
ctx.beginPath();
ctx.arc(x * 30 + 15, y * 30 + 15, 13, 0, 2 * Math.PI);
ctx.closePath();
ctx.fillStyle = color;
ctx.fill();
}
// 清除棋子
function clearChess(x, y) {
var ctx = canvas.getContext('2d');
ctx.clearRect(x * 30, y * 30, 30, 30);
}
// 检查是否获胜或平局
function checkWin(x, y) {
var count = 0;
var color = isBlack ? 1 : 2;
// 横向检查
for (var i = x - 4; i <= x; i++) {
if (i < 0) continue;
if (i + 4 > 14) break;
count = 0;
for (var j = i; j <= i + 4; j++) {
if (chessData[j][y] === color) {
count++;
} else {
break;
}
}
if (count === 5) {
gameOver(color);
return;
}
}
// 竖向检查
for (var i = y - 4; i <= y; i++) {
if (i < 0) continue;
if (i + 4 > 14) break;
count = 0;
for (var j = i; j <= i + 4; j++) {
if (chessData[x][j] === color) {
count++;
} else {
break;
}
}
if (count === 5) {
gameOver(color);
return;
}
}
// 撇向检查
for (var i = x - 4, j = y - 4; i <= x && j <= y; i++, j++) {
if (i < 0 || j < 0) continue;
if (i + 4 > 14 || j + 4 > 14) break;
count = 0;
for (var k = 0; k < 5; k++) {
if (chessData[i+k][j+k] === color) {
count++;
} else {
break;
}
}
if (count === 5) {
gameOver(color);
return;
}
}
// 捺向检查
for (var i = x + 4, j = y - 4; i >= x && j <= y; i--, j++) {
if (i > 14 || j < 0) continue;
if (i - 4 < 0 || j + 4 > 14) break;
count = 0;
for (var k = 0; k < 5; k++) {
if (chessData[i-k][j+k] === color) {
count++;
} else {
break;
}
}
if (count === 5) {
gameOver(color);
return;
}
}
// 平局检查
for (var i = 0; i < 15; i++) {
for (var j = 0; j < 15; j++) {
if (chessData[i][j] === 0) {
return;
}
}
}
gameOver(0);
}
// 游戏结束
function gameOver(winner) {
isOver = true;
var message;
switch (winner) {
case 0:
message = '平局';
break;
case 1:
message = '黑方获胜';
break;
case 2:
message = '白方获胜';
break;
}
alert(message);
}
```
请将上述代码复制到您的项目中,然后在 HTML 中添加一个 Canvas 元素,设置宽度为 450px,高度为 450px,即可看到一个五子棋棋盘,并能够进行下棋和悔棋操作。
注意:此代码仅为示例,未经过严格测试和验证,请在使用前自行检查和修改。
阅读全文