Tic-Tac-Toe
<%!
Boolean p1=false,p2=false;
String p1name,p2name;
class Game{
int[][] game;
int turns;
String winner;
public Game() {
restart();
};
public void restart(){
turns = 0;
game = new int[3][3];
winner = "";
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
game[i][j]=0;
};
public void play(int r, int c){
game[r][c] = (turns%2==0)?1:2;
turns++;
};
public String read(int r, int c){
if (game[r][c] == 0) return " ";
if (game[r][c] == 1) return "X";
return "O";
};
public boolean is_free(int r, int c){
return game[r][c]==0;
};
public String get_winner(){
return winner;
};
public String current_player(){
if(turns%2==0) return "X";
return "O";
};
public boolean is_done(){
for(int i=0;i<3;i++){
if(game[i][0]==1 &&
game[i][1]==1 &&
game[i][2]==1){
winner = "X";
return true;
}
if(game[0][i]==1 &&
game[1][i]==1 &&
game[2][i]==1){
winner = "X";
return true;
}
}
if(game[0][0]==1 &&
game[1][1]==1 &&
game[2][2]==1){
winner = "X";
return true;
}
if(game[0][2]==1 &&
game[1][1]==1 &&
game[2][0]==1){
winner = "X";
return true;
}
for(int i=0;i<3;i++){
if(game[i][0]==2 &&
game[i][1]==2 &&
game[i][2]==2){
winner = "O";
return true;
}
if(game[0][i]==2 &&
game[1][i]==2 &&
game[2][i]==2){
winner = "O";
return true;
}
}
if(game[0][0]==2 &&
game[1][1]==2 &&
game[2][2]==2){
winner = "O";
return true;
}
if(game[0][2]==2 &&
game[1][1]==2 &&
game[2][0]==2){
winner = "O";
return true;
}
return false;
};
};
Game mygame = new Game();
%>
<% if(request.getParameter("p1")!=null && !p1 ){
session.setAttribute("p1",true);
session.setAttribute("thisPlayer","X");
p1name = request.getParameter("p1name");
p1 = true;
}%>
<% if(request.getParameter("p2")!=null && !p2){
session.setAttribute("p2",true);
session.setAttribute("thisPlayer","O");
p2name = request.getParameter("p2name");
p2 = true;
}%>
<% if(request.getParameter("leave")!=null){
if(session.getAttribute("p1")!=null){
session.removeAttribute("p1");
p1 = false;
}
if(session.getAttribute("p2")!=null){
session.removeAttribute("p2");
p2 = false;
}
session.removeAttribute("thisPlayer");
}%>
<% if(!p1 && session.getAttribute("p2")==null){
%>
Play as player X!
<%}%>
<% if(!p2 && session.getAttribute("p1")==null ){
%>
Play as player O!
<%}%>
<% if(session.getAttribute("p1")!=null||session.getAttribute("p2")!=null){
%>
You are currently playing as player <%= session.getAttribute("p1")!=null?"X":"O" %>
<% if(!(p1&&p2)){
%>
Current status: waiting for opponent to join
<%}%>
<%
}
%>
<% if(p1&&p2){ //Main game
%>
Players:
| X: | <%= p1name %> |
| O: | <%= p2name %> |
<% if(request.getParameter("x")!=null){ //Play move
int r = Integer.parseInt(request.getParameter("x"));
int c = Integer.parseInt(request.getParameter("y"));
if(r>2 || r<0 || c>2 || c<0 || !mygame.is_free(r,c)){
%>
Invalid move!
<%
}else{
mygame.play(r,c);
}
}
if(request.getParameter("restart")!=null){ mygame.restart(); }
%>
<%for(int i=0;i<3;i++){%>
<%for(int j=0;j<3;j++){%>
| <%= mygame.read(i,j)%> |
<%}%>
<%}%>
Current Status:
<% if(mygame.is_done()){
%>
Player <%= mygame.get_winner()%> won!
<%}else{%>
Player <%= mygame.current_player()%> to play
<% if(mygame.current_player().equals(session.getAttribute("thisPlayer"))){ //is it my turn?
%>
<%}else{%>
<%}%>
<%}%>
<%
}
%>