【发布时间】:2015-09-17 16:00:16
【问题描述】:
我们应该设计一个井字游戏 servlet,使用会变成 x 或 o 的按钮。这适用于href,但不适用于submit:
out.print("<input type=submit name=row + column >Play</a>");
out.print("<a href=\"TicTacToe?row=" + row + "&column=" + column + "\">Play</a>");
href 版本在运行时会显示一个 3x3 的超链接数组,这些超链接会根据玩家的回合切换到 x 和 o。
button 版本什么都不做...我已经搜索了所有内容,但不确定如何使其工作。
编辑这是其余的代码我尝试了 Andreas 提到的更改没有运气,但我确实看到了如何做一些新的事情向下滚动直到你看到整个页面的星号
package TicTacToe;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Random;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(
description = "Game request and response handler",
urlPatterns = {
"/TicTacToe"
})
public class TicTacToe extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 1L;
private char[][] board; // 3 x 3 array
private final static char[] markers = {'O', 'X'};
private int currentPlayer; // 0 or 1
private int moveCount; // set to 9 when the game is over
private final Random random = new Random();
public TicTacToe() {
super();
reset();
}
private void generateCell(int row, int column, PrintWriter out) {
out.print("<td>");
if (board[row][column] == 0) {
if (moveCount < 9) {
****************************************************************************
out.print("<button type=\"button\" onclick=\"document.location='TicTacToe?row=" + row + "&column=" + column + "\">Play</button>");
****************************************************************************
} else {
// empty cell do nothing
}
} else {
out.print(board[row][column]);
}
out.print("</td>");
}
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
if (request.getParameter("reset") != null) {
reset();
} else if (request.getParameter("computer") != null) {
computeMove();
} else if (request.getParameter("row") != null) {
int row = Integer.valueOf(request.getParameter("row"));
int column = Integer.valueOf(request.getParameter("column"));
if (board[row][column] == 0) {
board[row][column] = markers[currentPlayer];
currentPlayer = (currentPlayer + 1) % 2;
moveCount += 1;
}
}
PrintWriter out = response.getWriter();
String docType
= "<!doctype html public \"-//w3c//dtd html 4.0 "
+ "transitional//en\">\n";
out.println(docType
+ "<html>\n"
+ "<head><title>Tic Tac Toe</title></head>\n"
+ "<h1 align=\"center\">Tic Tac Toe</h1>\n"
+ "<table align=\"center\">\n");
String message = markers[currentPlayer] + " turn";
Character winner = checkWinner();
if (winner != null) {
message = winner + " wins";
moveCount = 9;
} else if (moveCount == 9) {
message = "No moves";
}
for (int row = 0; row < 3; ++row) {
out.print(" <tr>\n");
for (int column = 0; column < 3; ++column) {
generateCell(row, column, out);
}
out.println("</tr>");
}
out.println("</table>");
out.println(
"<h5 align=\"center\">" + message + "</h5>");
if (moveCount != 9) {
out.println("<h5 align=\"center\"><a href=\"TicTacToe?computer=1\">Computed move</a></h5>");
}
out.println("<a href=\"TicTacToe?reset=1\">Reset</a>"
+ "</body>\n"
+ "</html>");
}
private void reset() {
board = new char[3][3];
currentPlayer = 0;
moveCount = 0;
}
// return Character as opposed to char because it returns null when there is no winner
private Character checkWinner() {
// check rows
for (int row = 0; row < 3; ++row) {
if (board[row][0] != 0 && board[row][0] == board[row][1] && board[row][2] == board[row][1]) {
return board[row][0];
}
}
// check columns
for (int column = 0; column < 3; ++column) {
if (board[0][column] != 0 && board[0][column] == board[1][column] && board[2][column] == board[1][column]) {
return board[0][column];
}
}
// check diagonals
if (board[1][1] != 0 && board[0][0] == board[1][1] && board[2][2] == board[1][1]) {
return board[1][1];
}
if (board[1][1] != 0 && board[2][0] == board[1][1] && board[0][2] == board[1][1]) {
return board[1][1];
}
return null;
}
// play markerToPlay if markerToCheck can win
private boolean moveToWin(char markerToCheck, char markerToPlay) {
for (int row = 0; row < 3; ++row) {
for (int column = 0; column < 3; ++column) {
if (board[row][column] == 0) {
board[row][column] = markerToCheck;
if (checkWinner() != null) {
board[row][column]=markerToPlay;
return true;
} else {
board[row][column] = 0;
}
}
}
}
return false;
}
// naive strategy: occupy the center or a corner in the first move
// then find a winning move
// if it does exist block a winning move from opponent
// if there is no move from the previous line, just pick a move at random
private void computeMove() {
if (moveCount >= 9) { // should not happen, but checking anyway
return;
}
if (moveCount == 0) { // occupy center cell
board[1][1] = markers[currentPlayer];
} else if (moveCount == 1) {
if (board[1][1] == 0) {
board[1][1] = markers[currentPlayer];
} else { // occupy corner
board[0][0] = markers[currentPlayer];
}
} else {
// first check if there is a winning play
boolean played = moveToWin(markers[currentPlayer], markers[currentPlayer]);
// then move to block the one to win
if (!played) {
played = moveToWin(markers[(currentPlayer + 1) % 2], markers[currentPlayer]);
}
// if we did not get a move from above, we just pick a cell at random
while (!played) {
int row = random.nextInt(3);
int column = random.nextInt(3);
if (board[row][column] == 0) {
played = true;
board[row][column] = markers[currentPlayer];
}
}
}
currentPlayer = (currentPlayer + 1) % 2;
moveCount += 1;
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
processRequest(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
processRequest(request, response);
}
}
【问题讨论】:
-
通过 CSS 将 显示为按钮(可能,但不能凭记忆说,我不是设计师)
-
真正“按钮”的典型生命周期是带有动作 POST 的 FORM