// Internet Explorer users, look here: http://krijnhoetmer.nl/stuff/html/bug-internet-explorer-submit-button/ import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class TicTacToe extends HttpServlet { public void init() { ServletContext c = getServletContext(); Integer[][] board = new Integer[3][3]; for (int i = 0; i<3; i++) for (int j = 0; j<3; j++) board[i][j] = new Integer(0); c.setAttribute("board", board); c.setAttribute("players", new Integer(0)); c.setAttribute("winner", new Integer(0)); c.setAttribute("next", new Integer(1)); c.setAttribute("free", new Integer(9)); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { doGet(request, response); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { boolean post = request.getMethod().equals("POST"); ServletContext c = getServletContext(); Integer[][] board; int next; int winner; int player; int free; synchronized(c) { if (post && request.getParameter("reset")!=null) { init(); for (int p = 1; p<=2; p++) { HttpSession s = (HttpSession)c.getAttribute("player"+p); if (s!=null) { try { s.invalidate(); } catch (IllegalStateException e) {} } } PrintWriter out = response.getWriter(); out.print("TicTacToe"); out.print("Service is reset!"); out.print("

"); out.print("
"); out.print(""); return; } board = (Integer[][])c.getAttribute("board"); next = ((Integer)c.getAttribute("next")).intValue(); winner = ((Integer)c.getAttribute("winner")).intValue(); free = ((Integer)c.getAttribute("free")).intValue(); HttpSession ses = request.getSession(false); if (ses==null) { ses = request.getSession(true); ses.setMaxInactiveInterval(60); ses.setAttribute("invalid", null); int players = ((Integer)c.getAttribute("players")).intValue(); if (players<2) { player = ++players; c.setAttribute("players", new Integer(players)); c.setAttribute("player"+player, ses); ses.setAttribute("player", new Integer(player)); } else{ response.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE, "Too many users!"); return; } } else { player = ((Integer)ses.getAttribute("player")).intValue(); String move = request.getParameter("move"); if (post && move!=null && next==player && winner==0) { int i = move.charAt(0)-'0'; int j = move.charAt(1)-'0'; if (board[i][j]==0) { board[i][j] = new Integer(player); if (next==1) next = 2; else next = 1; c.setAttribute("next", new Integer(next)); for (int p = 1; p<=2; p++) { if ((board[0][0]==p && board[0][1]==p && board[0][2]==p) || (board[1][0]==p && board[1][1]==p && board[1][2]==p) || (board[2][0]==p && board[2][1]==p && board[2][2]==p) || (board[0][0]==p && board[1][0]==p && board[2][0]==p) || (board[0][1]==p && board[1][1]==p && board[2][1]==p) || (board[0][2]==p && board[1][2]==p && board[2][2]==p) || (board[0][0]==p && board[1][1]==p && board[2][2]==p) || (board[2][0]==p && board[1][1]==p && board[0][2]==p)) { winner = p; c.setAttribute("winner", new Integer(p)); } } c.setAttribute("free", new Integer(--free)); } } } } boolean me = next==player; response.setDateHeader("Expires", 0); response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate"); response.setHeader("Pragma", "no-cache"); PrintWriter out = response.getWriter(); out.print("TicTacToe"); if (me || winner!=0) out.print(""); else out.print(""); out.print("

Player "+player+"

"); out.print("
"); for (int i = 0; i<3; i++) { out.write(""); for (int j = 0; j<3; j++) { Integer m = board[i][j]; String s = i+""+j; if (m.intValue()==1) out.write(""); else if (m.intValue()==2) out.write(""); else out.write(""); } out.write(""); } out.print("

"); if (winner!=0) { if (winner==player) out.print("You win :-)"); else out.print("Opponent wins :-("); } else if (free>0) { if (me) out.print("Your move!"); else out.print("Waiting for opponent..."); } else { out.print("It's a draw."); } out.print("

"); out.print("
"); out.print(""); } }