我有一个 Flex 4.6 移动问题。我在屏幕上有 9 个盒子。当我单击第一个框(使用 ID 名称命名)时,它应该放置文本X。我想要的是让计算机通过插入O在剩余的一个框中生成下一步动作。我相信您应该使用 math.random 或数组?这是一个井字游戏。
任何帮助将非常感激。
谢谢。
我有一个 Flex 4.6 移动问题。我在屏幕上有 9 个盒子。当我单击第一个框(使用 ID 名称命名)时,它应该放置文本X。我想要的是让计算机通过插入O在剩余的一个框中生成下一步动作。我相信您应该使用 math.random 或数组?这是一个井字游戏。
任何帮助将非常感激。
谢谢。
我在 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"> </td>
<td align="center" valign="middle" width="20" height="20" onclick="javascript: makeUserMove(0, 1)" id="0,1"> </td>
<td align="center" valign="middle" width="20" height="20" onclick="javascript: makeUserMove(0, 2)" id="0,2"> </td>
</tr>
<tr>
<td align="center" valign="middle" width="20" height="20" onclick="javascript: makeUserMove(1, 0)" id="1,0"> </td>
<td align="center" valign="middle" width="20" height="20" onclick="javascript: makeUserMove(1, 1)" id="1,1"> </td>
<td align="center" valign="middle" width="20" height="20" onclick="javascript: makeUserMove(1, 2)" id="1,2"> </td>
</tr>
<tr>
<td align="center" valign="middle" width="20" height="20" onclick="javascript: makeUserMove(2, 0)" id="2,0"> </td>
<td align="center" valign="middle" width="20" height="20" onclick="javascript: makeUserMove(2, 1)" id="2,1"> </td>
<td align="center" valign="middle" width="20" height="20" onclick="javascript: makeUserMove(2, 2)" id="2,2"> </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>