File size: 3,656 Bytes
f28a59d 57be814 f28a59d 57be814 f28a59d 57be814 83c29bc af4d999 57be814 af4d999 f28a59d 83c29bc 57be814 26a1eab 57be814 26a1eab 57be814 83c29bc 26a1eab 83c29bc 26a1eab 83c29bc 26a1eab 83c29bc 26a1eab 57be814 26a1eab 57be814 26a1eab 57be814 26a1eab 57be814 83c29bc 57be814 f28a59d | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 | <?php
$boardSize = 15;
?>
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>五子棋:人机对战(智能版)</title>
<style>
table { border-collapse: collapse; margin: 20px auto; }
td {
width: 30px; height: 30px;
border: 1px solid #333;
text-align: center;
font-size: 24px;
cursor: pointer;
}
.black { color: black; }
.white { color: red; background-color: transparent; }
h2 { text-align: center; }
</style>
</head>
<body>
<h2>五子棋:人机对战(智能版)</h2>
<table id="board">
<?php for ($i = 0; $i < $boardSize; $i++): ?>
<tr>
<?php for ($j = 0; $j < $boardSize; $j++): ?>
<td data-x="<?= $i ?>" data-y="<?= $j ?>"></td>
<?php endfor; ?>
</tr>
<?php endfor; ?>
</table>
<script>
const boardSize = <?= $boardSize ?>;
const board = Array.from({ length: boardSize }, () => Array(boardSize).fill(0));
let gameOver = false;
function checkWin(x, y, player) {
const directions = [[1,0],[0,1],[1,1],[1,-1]];
for (let [dx, dy] of directions) {
let count = 1;
for (let dir = -1; dir <= 1; dir += 2) {
let nx = x + dx * dir;
let ny = y + dy * dir;
while (
nx >= 0 && ny >= 0 && nx < boardSize && ny < boardSize &&
board[nx][ny] === player
) {
count++;
nx += dx * dir;
ny += dy * dir;
}
}
if (count >= 5) return true;
}
return false;
}
function scorePosition(x, y, player) {
let score = 0;
const directions = [[1,0],[0,1],[1,1],[1,-1]];
for (let [dx, dy] of directions) {
let count = 0;
for (let dir = -1; dir <= 1; dir += 2) {
let nx = x + dx * dir;
let ny = y + dy * dir;
while (
nx >= 0 && ny >= 0 && nx < boardSize && ny < boardSize &&
board[nx][ny] === player
) {
count++;
nx += dx * dir;
ny += dy * dir;
}
}
score += count * count; // 连子越多,分数越高
}
return score;
}
function computerMove() {
if (gameOver) return;
let bestScore = -1;
let move = null;
for (let i = 0; i < boardSize; i++) {
for (let j = 0; j < boardSize; j++) {
if (board[i][j] !== 0) continue;
// 评分:进攻 + 防守
let attack = scorePosition(i, j, 2); // 电脑
let defense = scorePosition(i, j, 1); // 玩家
let total = attack + defense * 1.5; // 防守权重更高
if (total > bestScore) {
bestScore = total;
move = [i, j];
}
}
}
if (!move) return;
const [x, y] = move;
board[x][y] = 2;
const cell = document.querySelector(`td[data-x="${x}"][data-y="${y}"]`);
cell.classList.add('white');
cell.textContent = '○';
if (checkWin(x, y, 2)) {
alert('电脑获胜!');
gameOver = true;
}
}
document.querySelectorAll('td').forEach(cell => {
cell.addEventListener('click', () => {
if (gameOver) return;
const x = parseInt(cell.dataset.x);
const y = parseInt(cell.dataset.y);
if (board[x][y] !== 0) return;
board[x][y] = 1;
cell.classList.add('black');
cell.textContent = '●';
if (checkWin(x, y, 1)) {
alert('你赢了!');
gameOver = true;
return;
}
setTimeout(computerMove, 300);
});
});
</script>
</body>
</html>
|