0

我有一个 Flex 4.6 移动问题。我在屏幕上有 9 个盒子。当我单击第一个框(使用 ID 名称命名)时,它应该放置文本X。我想要的是让计算机通过插入O在剩余的一个框中生成下一步动作。我相信您应该使用 math.random 或数组?这是一个井字游戏。

任何帮助将非常感激。

谢谢。

4

1 回答 1

0

我在 html/javascript 中制作了这个,是一个使用 minimax AI 的井字游戏示例,希望它作为您的 flex 项目的参考实现有所帮助(要对其进行测试,只需将代码复制并粘贴到空白 html 文档中并使用您喜欢的浏览器运行它):

<html>
<head>
<script type="text/javascript">
<!-- 
 var board = new Array();
 var CPU = 1;
 var USER = 2;
 var EMPTY = 0;
 var lockBoard = false;
 var X = "X";
 var O = "O";
 var MAX_DEPTH = 10;

 // Updates the HTML table using the "board" array 
 function updateHTMLTable() {
    for (i = 0; i < 3; i++)
       for (j = 0; j < 3; j++) {
          var cell = document.getElementById(i + "," + j);
          switch (board[i * 3 + j]) {
             case USER: cell.innerHTML = X; break;
             case CPU:  cell.innerHTML = O; break;
             default: cell.innerHTML = " "; break;
          }
       }
 }

 function makeUserMove(x, y) {
    // Check either cpu is playing or game is over
    if (lockBoard) return;

    // Check if the cell is free to place the player movement
    if (board[x * 3 + y] == EMPTY) {
       board[x * 3 + y] = USER;
       c = document.getElementById(x + "," + y);
       c.innerHTML = X;
    } else {
       alert("Move not allowed, is already filled in");
    }
    if (wins(USER, board)) {
       alert("You Win");
       lockBoard = true;
       return;
    }
    cpuPlay();
 }

 function startGame() {
    for (i = 0; i < 9; i++)
        board[i] = EMPTY;
    updateHTMLTable();
    lockBoard = false;
 }

 // Check if there is no space left on the board to play 
 function isBoardFull(b) {
    for (var i = 0; i < 9; i++)
       if (b[i] == EMPTY) return false;
    return true;
 }

 function simulateUserMove(board, depth) {
    if (wins(CPU, board)) return {value: 1, board: board};
    if (wins(USER, board)) return {value: -1, board: board};
    if (isBoardFull(board) || depth == MAX_DEPTH) return {value: 0, board: board};

    var userMovement = {value: 999999, board: undefined};
    for (var i = 0; i < 9; i++) {
       if (board[i] == EMPTY) {
          var boardCopy = board.slice(0); // creates a copy of the array
          boardCopy[i] = USER;

          var cpuMovement = cpuMove(boardCopy, depth + 1);

          if (cpuMovement.value < userMovement.value) { 
             userMovement.value = cpuMovement.value;
             userMovement.board = boardCopy;
          } 
       }  
    }
    return userMovement;
 }

 function cpuMove(board, depth) { 
    if (wins(CPU, board)) return {value: 1, board: board};
    if (wins(USER, board)) return {value: -1, board: board};
    if (isBoardFull(board) || depth == MAX_DEPTH) return {value: 0, board: board};

    var cpuMovement = {value: -999999, board: undefined};
    for (var i = 0; i < 9; i++) {
       if (board[i] == EMPTY) {
          var boardCopy = board.slice(0); // creates a copy of the array
          boardCopy[i] = CPU;

          var userMovement = simulateUserMove(boardCopy, depth + 1);

          if (userMovement.value > cpuMovement.value) { 
             cpuMovement.value = userMovement.value;
             cpuMovement.board = boardCopy;
          } 
       }  
    }
    return cpuMovement;
 }

 // This function make the cpu movement using a "kind of" greedy approach, is not very smart 
 function cpuPlay() {
    lockBoard = true;
    var move = cpuMove(board, 0);
    board = move.board;
    updateHTMLTable();

    if (wins(CPU, board))
       alert("I win!"); 
    else 
       lockBoard = false;
 }

 function wins(player, board) {
    // Iterate the board to find if the player identified by the parameter "player" winned

    // First, check rows 
    var enemy = (player == USER) ? CPU : USER;
    var won = false;
    for (var i = 0; i < 3; i++) {
       won = true;
       for (var j = 0; j < 3; j++) {
          if (board[i * 3 + j] == enemy || board[i * 3 + j] == EMPTY) {
             won = false;
             break;
          }
       }
       if (won) return true;
    }
    // Then, check columns
    for (var i = 0; i < 3; i++) {
       won = true;
       for (var j = 0; j < 3; j++) {
          if (board[j * 3 + i] == enemy || board[j * 3 + i] == EMPTY) {
             won = false;
             break;
          }
       }
       if (won) return true;
    }
    // Last, the 2 diagonals
    for (var i = 0; i < 9; i += 4) {
       won = true;
       if (board[i] == enemy || board[i] == EMPTY) {
          won = false;
          break;
       }
    }
    if (won) return true;
    for (var i = 2; i < 7; i += 2) {
       won = true;
       if (board[i] == enemy || board[i] == EMPTY) {
          won = false;
          break;
       }
    }
    return won;
 }
//-->
</script>

</head>
<body>
  <table align="center" border="1">
    <tr>
       <td align="center" valign="middle" width="20" height="20" onclick="javascript: makeUserMove(0, 0)" id="0,0">&nbsp;</td>
       <td align="center" valign="middle" width="20" height="20" onclick="javascript: makeUserMove(0, 1)" id="0,1">&nbsp;</td>
       <td align="center" valign="middle" width="20" height="20" onclick="javascript: makeUserMove(0, 2)" id="0,2">&nbsp;</td>
    </tr>
    <tr>
       <td align="center" valign="middle" width="20" height="20" onclick="javascript: makeUserMove(1, 0)" id="1,0">&nbsp;</td>
       <td align="center" valign="middle" width="20" height="20" onclick="javascript: makeUserMove(1, 1)" id="1,1">&nbsp;</td>
       <td align="center" valign="middle" width="20" height="20" onclick="javascript: makeUserMove(1, 2)" id="1,2">&nbsp;</td>
    </tr>
    <tr>
       <td align="center" valign="middle" width="20" height="20" onclick="javascript: makeUserMove(2, 0)" id="2,0">&nbsp;</td>
       <td align="center" valign="middle" width="20" height="20" onclick="javascript: makeUserMove(2, 1)" id="2,1">&nbsp;</td>
       <td align="center" valign="middle" width="20" height="20" onclick="javascript: makeUserMove(2, 2)" id="2,2">&nbsp;</td>
    </tr>
  </table><br>
  <p align="center">
     <input type="button" value="Play Again!" onclick="javascript: startGame()">
  </p>

  <script type="text/javascript"> 
     // start game
     startGame();
  </script>
</body>
</html>
于 2012-12-03T03:17:29.007 回答