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>