Version Two:
1. Maintains features of version one
2. Detects and marks win
3. Clears board after end of game
4. Facilitates continuous play
5. Recognizes cat's game as end of game
Source Code:
T2.java
//Version Two: //Version One plus: //1. win marked //2. board cleared //3. continuous play import java.awt.*; import java.applet.*; import java.awt.event.*; import java.util.*; public class t2 extends Applet { TicTacToe t; Dimension d; public static final int YES=1; public static final int NO=0; public void init() { t=new TicTacToe(); t.init_game(); setBackground(Color.black); d=getSize(); addMouseListener(new ML()); } class ML extends MouseAdapter { public void mouseReleased(MouseEvent e) { if(t.GAMEOVER==YES) { t.init_game(); } plotMove(e); } } public void plotMove(MouseEvent e) { int x=e.getX(); int y=e.getY(); if(x>(2*d.width/3)) x=2; else if(x>d.width/3) x=1; else x=0; if(y>(2*d.height/3)) y=2; else if(y>d.height/3) y=1; else y=0; if(t.position[y][x]==t.EMPTY) { t.position[y][x]=t.TURN; t.TURN=(t.TURN==t.HUMAN) ? t.COMPUTER : t.HUMAN; } t.win(); repaint(); } public void drawBoard(Graphics g) { g.setColor(Color.yellow); int x = d.width/3; int y = d.height/3; g.drawLine(x, 0, x, d.height); g.drawLine(2*x, 0, 2*x, d.height); g.drawLine(0, y, d.width, y); g.drawLine(0, 2*y, d.width, 2*y); for(int i=0; i<3; i++) for(int j=0; j<3; j++) { if(t.position[i][j]==t.COMPUTER) { g.setColor(Color.red); g.drawOval(j*x+1, i*y+1, x-2, y-2); } else if(t.position[i][j]==t.HUMAN) { g.setColor(Color.cyan); g.drawLine(j*x+1, i*y+1, j*x+x-2, i*y+y-2); g.drawLine(j*x+1, i*y+y-2, j*x+x-2, i*y+1); } } } public void plotWin(Graphics g) { g.setColor(Color.magenta); if(t.DIRWIN==0) g.drawLine(0, d.height/6,d.width,d.height/6); if(t.DIRWIN==1) g.drawLine(0, d.height/2, d.width,d.height/2); if(t.DIRWIN==2) g.drawLine(0, 5*d.height/6, d.width, 5*d.height/6); if(t.DIRWIN==3) g.drawLine(d.width/6, 0, d.width/6, d.height); if(t.DIRWIN==4) g.drawLine(d.width/2, 0, d.width/2, d.height); if(t.DIRWIN==5) g.drawLine(5*d.width/6, 0, 5*d.width/6, d.height); if(t.DIRWIN==6) g.drawLine(0,0,d.width,d.height); if(t.DIRWIN==7) g.drawLine(0, d.height, d.width, 0); } public void paint(Graphics g) { drawBoard(g); plotWin(g); } }
TicTacToe.java
import java.util.*; class TicTacToe { public static final int EMPTY=0; public static final int COMPUTER=1; public static final int HUMAN=2; public static final int YES=1; public static final int NO=0; public int DIRWIN; public int GAMEOVER; public int WINNER; int TURN; int MOVES; int [][] position; public void init_game() { //********************************************************* //Initializes main variables used in game //********************************************************* MOVES=0; GAMEOVER=NO; DIRWIN=8; //winning directions 0-7, 8 is not a winning direction WINNER=EMPTY; Random r=new Random(); TURN=(r.nextInt()%2 == 1) ? HUMAN : COMPUTER; position = new int[3][3]; for(int i=0; i<3; i++) for(int j=0; j<3; j++) position[i][j]=EMPTY; } public void win() { for(int player=COMPUTER; player<=HUMAN; player++) { if(position[0][0]==player && position[0][1]==player && position[0][2]==player){ DIRWIN=0; WINNER=player; } if(position[1][0]==player && position[1][1]==player && position[1][2]==player){ DIRWIN=1; WINNER=player; } if(position[2][0]==player && position[2][1]==player && position[2][2]==player){ DIRWIN=2; WINNER=player; } if(position[0][0]==player && position[1][0]==player && position[2][0]==player){ DIRWIN=3; WINNER=player; } if(position[0][1]==player && position[1][1]==player && position[2][1]==player){ DIRWIN=4; WINNER=player; } if(position[0][2]==player && position[1][2]==player && position[2][2]==player){ DIRWIN=5; WINNER=player; } if(position[0][0]==player && position[1][1]==player && position[2][2]==player){ DIRWIN=6; WINNER=player; } if(position[0][2]==player && position[1][1]==player && position[2][0]==player){ DIRWIN=7; WINNER=player; } } //end for-loop if(WINNER!=EMPTY) GAMEOVER=YES; //check for cat's game MOVES++; if(MOVES==9) GAMEOVER=YES; } }