create a Tic Tac Toe game using JSP Scripting elements and a

create a Tic Tac Toe game using JSP Scripting elements and a JSP page.

Solution

//basically you need three files for this
//index.jsp
//play.jsp
//TicTacToe.java ..... i have put the contents and
//commented between program lines wherever neceasary..thankyou .....


//contents of index.jsp file

< %@ page import = \"javax.servlet.*\" %>
<%@ page import = \"javax.servlet.http.*\" %>
<%@ page import = \"tictactoe.TicTacToe\" %>

<HTML>

<%
HttpSession sess = request.getSession(true);
session.setAttribute(\"board\", new TicTacToe());
%>

<BODY bgcolor=\"white\">


<FORM TYPE=POST ACTION=play.jsp>
<BR>
<font size=5 color=\"red\">
Who shall go first?

<br>

<INPUT TYPE=radio name=\"first\" Value=\"user\"> I\'ll go first!
<br>
<INPUT TYPE=radio name=\"first\" Value=\"computer\" checked> The computer can go.
<br>
<INPUT TYPE=submit name=submit Value=\"Play!\">

</FORM>

</font>

</BODY>
</HTML>

--------------

//contents of play.jsp file

---------:------::========

<%@ page import = \"javax.servlet.*\" %>
<%@ page import = \"javax.servlet.http.*\" %>
<%@ page import = \"tictactoe.TicTacToe\" %>

<html>
<body bgcolor=\"white\">
<font size=5 color=\"red\">

<%
HttpSession sess = request.getSession(true);
TicTacToe board = (TicTacToe)session.getAttribute(\"board\");
String first = request.getParameterValues(\"first\")[0];
String[] moves = request.getParameterValues(\"move\");
if (moves != null)
{
String move = moves[0];
boolean moveResult = false;
try {
int actualMove = new Integer(move);
if (actualMove >= 1 && actualMove <= 9) {
moveResult = board.move(actualMove);
}
} catch (Exception e) {
out.println(\"well that didn\'t work.\");
}
if (!moveResult) {
out.println(\"not quite. give it another go!\");
}
if (moveResult)
out.println(\"<br>\");
} else {
out.println(\"<br>\");
}
if (first.equals(\"computer\")) {
if (board.getTurn(true) == \'X\') {
board.move(board.evaluateBestMove());
}
}
else {
if (board.getTurn(true) == \'O\') {
board.move(board.evaluateBestMove());
}
}
%>

<pre>
<%
out.println(board);
%>
</pre>

<%
if (board.isGameOver()) {
out.println(\"The winner is: \");
if (board.getWinner() == \' \') {
out.println(\"a tie!\");
} else {
out.println(board.getWinner());
}
} else {
%>

<p>Enter a move:</p>
<pre>
1|2|3
-----
4|5|6
-----
7|8|9
</pre>
<form method=\"get\" action=\"play.jsp\">
<input type=\"text\" name=\"move\" value=\"\">
<input type=\"hidden\" name=\"first\" value=\"<%out.print(first);%>\">
<input type=\"submit\" name=\"submit\" value=\"Play move\">
</form>
<%
}
%>


<p>
<a href=\"index.jsp\">new game</a>
</p>

</font>
</body>
</html>


-----:::::::::---------

//contents of TicTacToe.java file


package tictactoe;

public class TicTacToe {

// 3x3 array of tic tac toe board
//
// 1|2|3
// -----
// 4|5|6
// -----
// 7|8|9
//
private char board[][];

// the current board \"orientation\", used to detect isomorphic boards
private int boardPosition;

// which turn are we on?
private int turn;

// Has the game ended?
private boolean gameOver = false;

// Turn on which we found a winner.
private int hasWinner = 0;

public boolean isGameOver() {
return gameOver;
}

public TicTacToe() {
// initialize empty board, empty spaces having \' \' character.
board = new char[3][3];

for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
board[i][j] = \' \';
}
}

// At the \"0th\", or non-rotated board position
boardPosition = 0;

// First person\'s turn!
turn = 0;
}

/**
* Places a piece on the board at the specificed position.
* Either an X or an O is played, depending on whose turn it is.
* X always goes first.
*
* @param p Place where we want to make our move; integer [1..9]
* @return true if move was successful, false if not (eg, tried to move to
* a spot already taken.)
*/
public boolean move(int p) {
if (gameOver) {
// the game is over, stop trying to make moves!
return false;
}
if (p == 0) {
return false;
}

// 0-based indexing is easier.
p--;

// Get x and y array coords of board position
int x = p%3;
int y = p/3;

// check for illegal move
if (board[y][x] != \' \')
{
return false;
}

// whose turn is it?
char token = getTurn(true);

// set the board
board[y][x] = token;

// set it to its un-isomorphic original state after making move
revertBoard();

// next player\'s turn!
turn++;

// filled up the board, game is over
if (turn == 9) {
gameOver = true;
}

// someone has won, game is over
if (hasWinner > 0) {
gameOver = true;
}

return true;
}


/**
* Determines the next optimal move for the current player.
* This basically uses the strategy outlined here:
* http://en.wikipedia.org/wiki/Tic-tac-toe#Strategy
*
* @return Board position of where the next move should be made.
* Returns 0 if no optimal move is found (which would be a bug.)
*/
public int evaluateBestMove() {
int move = 0;

// First try to win
move = playWin(true);

// Otherwise, block opponent\'s win
if (move == 0) {
move = playWin(false);
}

// Try to create a fork scenario, where we could win two ways
if (move == 0) {
move = playFork();
}

// If opponent is about to have a fork, block it!
if (move == 0) {
move = blockFork();
}

// Play the center, if we can
if (move == 0) {
if (getPos(5) == \' \') {
move = 5;
}
}

// Play a corner opposite opponent, if we can
if (move == 0) {
move = playOppositeCorner();
}

// Play just any corner
if (move == 0) {
move = playEmptyCorner();
}

// Or play a side
if (move == 0) {
move = playEmptySide();
}

return move; //bad if move == 0
}

/**
* Returns the token {X, O} of either the current player or the opponent.
*
* @param thisPlayer Whether we want the token of ourselves (true) or the
* opponent (false)
*/
public char getTurn(boolean thisPlayer) {
return ((turn%2 == 0) == thisPlayer) ? \'X\' : \'O\';
}

/**
* Attempt to find and play a \"fork\"
*
* @return The board position for an optimal fork move to make.
* returns 0 if none exists.
*/

public int playFork() {
int rc = 0;

// Look for different board positions which could give us a fork.

rc = lookForPattern(getTurn(true), new int[] {7, 2, 3}, true, false, true, false, false, false, false, false, false);

if (rc == 0) {
rc = lookForPattern(getTurn(true), new int[] {5, 7, 9}, true, false, true, false, false, false, false, false, false);
}

if (rc == 0) {
rc = lookForPattern(getTurn(true), new int[] {3, 7, 9}, true, false, false, false, true, false, false, false, false);
}
  
if (rc == 0) {
rc = lookForPattern(getTurn(true), new int[] {3,2,7}, true, false, false, false, true, false, false, false, false);
}
if (rc == 0) {
rc = lookForPattern(getTurn(true), new int[] {3, 2, 4}, true, false, false, false, false, false, false, false, true);
}

return rc;
}

/**
* Attempt to find and play a corner opposite opponent
*
* @return The board position for an optimal fork move to make.
* returns 0 if none exists.
*/
public int playOppositeCorner() {
return lookForPattern(getTurn(false), 9, true, false, false, false, false, false, false, false, false);
}

/**
* Attempt to find and play any corner
*
* @return The board position for an optimal fork move to make.
* returns 0 if none exists.
*/
public int playEmptyCorner() {
return lookForPattern(getTurn(false), 1, false, false, false, false, false, false, false, false, false);
}

/**
* Attempt to find and play any side
*
* @return The board position for an optimal fork move to make.
* returns 0 if none exists.
*/
public int playEmptySide() {
return lookForPattern(getTurn(false), 2, false, false, false, false, false, false, false, false, false);
}

/**
* Attempt to find and and block an opportunity for opponent to create a fork
*
* @return The board position for an optimal fork move to make.
* returns 0 if none exists.
*/
public int blockFork() {
int rc = 0;

rc = lookForPattern(getTurn(false), 4, true, false, false, false, false, false, false, false, true);

if (rc == 0) {
rc = lookForPattern(getTurn(false), 3, true, false, false, false, true, false, false, false, false);
}

if (rc == 0) {
rc = lookForPattern(getTurn(false), 2, true, false, true, false, false, false, false, false, false);
}

if (rc == 0) {
rc = lookForPattern(getTurn(false), 3, false, true, false, false, false, true, false, false, false);
}

return rc;
}

/**
* Attempt to find and play in a position which would result in a win.
* used by both player and opponent to either win or block a win.
*
* @param iWin true if I am looking for a way to win. false if I seek to
* block the opponent from an impending win. The stragety to
* find the \"winning\" position is the same, the only question
* is whether we\'re looking for a win for ourselves or for
* the opponent.
*
* @return The board position for an optimal fork move to make.
* returns 0 if none exists.
*/

public int playWin(boolean iWin) {
int rc = 0;

rc = lookForPattern(getTurn(iWin), 3, true, true, false, false, false, false, false, false, false);
if (rc == 0) {
rc =
lookForPattern(getTurn(iWin), 9, true, false, false, false, true, false, false, false, false);
}

if (rc == 0) {
rc = lookForPattern(getTurn(iWin), 6, false, false, false, true, true, false, false, false, false);
}
if (rc == 0) {
rc =
lookForPattern(getTurn(iWin), 2, true, false, true, false, false, false, false, false, false);
}
if (rc == 0) {
rc =
lookForPattern(getTurn(iWin), 5, true, false, false, false, false, false, false, false, true);
}
if (rc == 0) {
rc =
lookForPattern(getTurn(iWin), 5, false, false, false, true, false, true, false, false, false);
}

if ((rc > 0) && (iWin)) {
hasWinner = turn;
}

return rc;
}

public char getWinner() {
if (hasWinner > 0) {
return (hasWinner%2 == 0) ? \'X\' : \'O\';
}

return \' \';
}

public int lookForPattern( char t,
int position,
boolean t1,
boolean t2,
boolean t3,
boolean t4,
boolean t5,
boolean t6,
boolean t7,
boolean t8,
boolean t9) {

  
int[] inputPosition = new int[1];
inputPosition[0] = position;
  

return lookForPattern(t,inputPosition, t1, t2, t3, t4, t5, t6, t7, t8, t9);
}

/**
* Looks for a particular pattern on the board and sees if a desired move
* is legal. If so, we return that board position. Otherwise we return 0.
* This code searches all isomorphic board variations for the given pattern.
*
* @param t Which token we\'re looking for with our pattern. Are we searching
* for X or O pieces with this pattern?
* @param position If we find this pattern, this is the position we want to
* play as a result. If that position is not available,
* then that \"pattern\" does not exist and we move to the
* next one.
* @param t1..t9 basically a \"a bitmask of positions\". Do we want a token
* to be in position 1? Then set t1 = true. Etc.
* @return Board position to place a token. 0 if our desired position is
* invalid (beacuse someone else has already moved there.)
*/
public int lookForPattern( char t,
int[] positions,
boolean t1,
boolean t2,
boolean t3,
boolean t4,
boolean t5,
boolean t6,
boolean t7,
boolean t8,
boolean t9) {

// Okay. We want to look for the given pattern. So we look 8 times:
// current layout, horiz flip, vert flip, 2 diagonal flips,
// and 3 rotations.

// To make this easier, we coerce both our current board and the pattern
// we\'re looking for into a bit mask. Then we can xor to see if there
// is a match. You can tell I\'m a C guy at heart.
int pattern = 0;
pattern |= (1 & (t1 ? 1 : 0)) << 0;
pattern |= (1 & (t2 ? 1 : 0)) << 1;
pattern |= (1 & (t3 ? 1 : 0)) << 2;
pattern |= (1 & (t4 ? 1 : 0)) << 3;
pattern |= (1 & (t5 ? 1 : 0)) << 4;
pattern |= (1 & (t6 ? 1 : 0)) << 5;
pattern |= (1 & (t7 ? 1 : 0)) << 6;
pattern |= (1 & (t8 ? 1 : 0)) << 7;
pattern |= (1 & (t9 ? 1 : 0)) << 8;

  

// loop through each of the 8 isomorphic board configurations to search
// for our pattern
for (int i = 0; i < 8; i++) {
flipBoard(i);
boolean foundMatch = (pattern ^ (boardToBits(t)&pattern)) == 0;
if (foundMatch) {
for (int position : positions) {
if (getPos(position) != \' \') {
foundMatch = false;
revertBoard();
break;
}
}
if (foundMatch) {
return positions[0];
}
} else {
revertBoard();
}

if (foundMatch) {
break;
}
}

return 0;
}


/**
* Reverts board from \"isomorphic\" state to its original board state
*/
public void revertBoard() {
switch (this.boardPosition) {
case 0:
case 1:
case 2:
case 3:
case 4:
flipBoard(this.boardPosition);
break;
case 5:
// fall through to rotate 3 times
rotateClockwise(1);
case 6:
// fall through to rotate 2 times
rotateClockwise(1);
case 7:
// fall through to rotate once
rotateClockwise(1);
break;
}
this.boardPosition = 0;
}

/**
* Flips board to one of 8 isomorphic positions. We can search for
* different configurations by flipping the board around.
*/
public void flipBoard(int position) {
switch (position) {
case 0:
// just a placeholder for \"don\'t modify board\"
break;
case 1:
swapPositions(1, 3);
swapPositions(4, 6);
swapPositions(7, 9);
break;
case 2:
swapPositions(1, 7);
swapPositions(2, 8);
swapPositions(3, 9);
break;
case 3:
swapPositions(1, 9);
swapPositions(2, 6);
swapPositions(4, 8);
break;
case 4:
swapPositions(2, 4);
swapPositions(3, 7);
swapPositions(6, 8);
break;
case 5:
rotateClockwise(1);
break;
case 6:
rotateClockwise(2);
break;
case 7:
rotateClockwise(3);
break;

}

boardPosition = position;
}

/**
* Rotate tic-tac-toe board clockwise.
*
* @param numberRotations How many times we want to rotate the board
*/
public void rotateClockwise(int numberRotations) {
for (int rotation = 0; rotation < numberRotations; rotation++) {
char[][] newBoard = new char[3][3];
for (int i=2;i>=0;--i)
{
for (int j=0;j<3;++j)
{
newBoard[2-i][j] = board[j][i];
}
}
board = newBoard;
}
}

/**
* Swaps the positions of two tokens on the board
*/
public void swapPositions(int a, int b) {
a--;
b--;
int a_x = a%3;
int a_y = a/3;
int b_x = b%3;
int b_y = b/3;

char tmp = board[a_y][a_x];
board[a_y][a_x] = board[b_y][b_x];
board[b_y][b_x] = tmp;
}

/**
* Takes a game board and converts it to a bitmask, which
* makes searching for different configurations easy.
*
* @param p Bitmask of what kind of pieces - X or O?
* @return bitmask representing board state
*/
public int boardToBits(char p) {
//TODO: Make this function lossless for both X and O information.
int pattern = 0;

for (int i = 0; i < 9; i++) {
int x = i%3;
int y = i/3;
char token = board[y][x];

pattern |= (1 & (token == p ? 1 : 0)) << i;
}

return pattern;
}

/**
* Gets token on board at a given position
*
* @param p Position we want token of. Alternately, position of which we
* want the token, if you have a perscriptivist aversion to
* stranded prepositions.
*/
public char getPos(int p) {
p--;
int x = p%3;
int y = p/3;

return board[y][x];
}


public String toString() {
String s = (\"%c|%c|%c\ \" +
\"-----\ \" +
\"%c|%c|%c\ \" +
\"-----\ \" +
\"%c|%c|%c\ \ \ Turn: %d\");

return String.format (s,
board[0][0],
board[0][1],
board[0][2],
board[1][0],
board[1][1],
board[1][2],
board[2][0],
board[2][1],
board[2][2],
this.turn
);
}

public static void main(String[] args) {
TicTacToe t = new TicTacToe();
t.move(6);
t.move(t.evaluateBestMove());
t.move(8);
t.move(t.evaluateBestMove());
t.move(1);
t.move(t.evaluateBestMove());
t.move(7);
t.move(t.evaluateBestMove());
t.move(2);


if (t.isGameOver()) {
System.out.print(\"Winner: \");
if (t.getWinner() == \' \')
System.out.println(\"Tie\");
else
System.out.println(t.getWinner());
}

System.out.println(t);
}

}

create a Tic Tac Toe game using JSP Scripting elements and a JSP page.Solution//basically you need three files for this //index.jsp //play.jsp //TicTacToe.java
create a Tic Tac Toe game using JSP Scripting elements and a JSP page.Solution//basically you need three files for this //index.jsp //play.jsp //TicTacToe.java
create a Tic Tac Toe game using JSP Scripting elements and a JSP page.Solution//basically you need three files for this //index.jsp //play.jsp //TicTacToe.java
create a Tic Tac Toe game using JSP Scripting elements and a JSP page.Solution//basically you need three files for this //index.jsp //play.jsp //TicTacToe.java
create a Tic Tac Toe game using JSP Scripting elements and a JSP page.Solution//basically you need three files for this //index.jsp //play.jsp //TicTacToe.java
create a Tic Tac Toe game using JSP Scripting elements and a JSP page.Solution//basically you need three files for this //index.jsp //play.jsp //TicTacToe.java
create a Tic Tac Toe game using JSP Scripting elements and a JSP page.Solution//basically you need three files for this //index.jsp //play.jsp //TicTacToe.java
create a Tic Tac Toe game using JSP Scripting elements and a JSP page.Solution//basically you need three files for this //index.jsp //play.jsp //TicTacToe.java
create a Tic Tac Toe game using JSP Scripting elements and a JSP page.Solution//basically you need three files for this //index.jsp //play.jsp //TicTacToe.java
create a Tic Tac Toe game using JSP Scripting elements and a JSP page.Solution//basically you need three files for this //index.jsp //play.jsp //TicTacToe.java
create a Tic Tac Toe game using JSP Scripting elements and a JSP page.Solution//basically you need three files for this //index.jsp //play.jsp //TicTacToe.java
create a Tic Tac Toe game using JSP Scripting elements and a JSP page.Solution//basically you need three files for this //index.jsp //play.jsp //TicTacToe.java

Get Help Now

Submit a Take Down Notice

Tutor
Tutor: Dr Jack
Most rated tutor on our site