【问题标题】:JAVA Servlet Tict Tac Toe w/Buttons带有/按钮的 JAVA Servlet 井字游戏
【发布时间】: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);
           }

        }

【问题讨论】:

标签: java html


【解决方案1】:

“提交”按钮只有在&lt;form&gt; 中才会执行某些操作,在这种情况下,它会将表单字段发布到表单action

如果您像这样构建按钮,则独立(非表单)按钮将起作用:

// Using <input>
out.print("<input type=\"button\" onclick=\"document.location='TicTacToe?row=" + row + "&column=" + column + "\" value=\"Play\">");

// Using <button>
out.print("<button type=\"button\" onclick=\"document.location='TicTacToe?row=" + row + "&column=" + column + "\">Play</button>");

您甚至可以将&lt;form&gt;&lt;input type="hidden"&gt; 用于rowcolumn,但使用onclick 更容易。

【讨论】:

    猜你喜欢
    • 2015-06-12
    • 2013-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多