www.pudn.com > othello.rar > Othello.java


//filename Othello.java; 
//filename Othello.class; 
 
import java.applet.*; 
import java.awt.*; 
import java.awt.image.*; 
import java.awt.event.*; 
import java.io.PrintStream; 
import java.net.URL; 
 
public class Othello extends Applet implements Runnable,ActionListener,MouseListener 
{ 
  private MediaTracker imageTracker; 
  private Image redImage; 
  private Image blueImage; 
  private Image offScrImage; 
  private Graphics offScrGraphics; 
  private Font f; 
  private int fontHeight; 
  private int fontAscent; 
  private Button button; 
  private int buttonHeight; 
  private Choice choice; 
  private Choice moveFirst; 
  private boolean redMoveFirst; 
  private boolean illegalMove; 
  private boolean blueNotMoving; 
  private boolean animating; 
  private int redScore; 
  private int blueScore; 
  private Thread aThread; 
  private static final int EMPTY = 0; 
  private static final int RED = 2; 
  private static final int BLUE = 3; 
  private static final int BLUE_TEMP = 4; 
  private static final int RED_TEMP = 5; 
  private static final int VERYGOOD = 9999; 
  private static int DIM = 10; 
  private int boardSize = 400; 
  private int[] grid = new int[400]; 
 
  private synchronized void newGame() 
  { 
    DIM = (new Integer((String) choice.getSelectedItem())).intValue(); 
    int whoMoveFirst=moveFirst.getSelectedIndex(); 
    if(whoMoveFirst==0) 
   	  redMoveFirst = true; 
    else 
   		redMoveFirst = false; 
       		 
    int int1; 
    int int2; 
    for( int1 = 0; int1 < DIM; ++int1 ) 
    { 
      for( int2 = 0; int2 < DIM; ++int2 ) 
        grid[int1 * DIM + int2] = EMPTY; 
    } 
    int2 = DIM / 2; 
    grid[(int2 - 1) * DIM + (int2 - 1)] = RED; 
    grid[(int2 - 1) * DIM + int2] = BLUE; 
    grid[int2 * DIM + (int2 - 1)] = BLUE; 
    grid[int2 * DIM + int2] = RED; 
    offScrGraphics.setColor( Color.white ); 
    offScrGraphics.fillRect( 0, 0, boardSize, boardSize ); 
    redScore = blueScore = 0; 
    illegalMove = blueNotMoving = animating = false; 
    boardSize = -1; 
    repaint(); 
    if( !redMoveFirst ) 
    { 
      blueMove(); 
      checkScore(); 
      repaint(); 
    } 
  } 
 
  public synchronized void init() 
  { 
    aThread = null; 
    imageTracker = new MediaTracker( this ); 
    offScrImage = createImage( 400, 400 ); 
    offScrGraphics = offScrImage.getGraphics(); 
    f = new Font( "TimesRoman", 0, 12 ); 
    offScrGraphics.setFont( f ); 
    fontHeight = getFontMetrics( f ).getHeight(); 
    fontAscent = getFontMetrics( f ).getAscent(); 
    loadImages(); 
    if( button == null ) 
    { 
      button = new Button( "New Game" ); 
      button.addActionListener(this); 
      setLayout( new FlowLayout( ) ); 
      add( button ); 
      choice = new Choice(); 
      choice.addItem( "6" ); 
      choice.addItem( "8" ); 
      choice.addItem( "10" ); 
      choice.addItem( "12" ); 
      choice.addItem( "14" ); 
      add( choice ); 
      choice.select( "10" ); 
    } 
    if( moveFirst == null ) 
    { 
      moveFirst = new Choice(); 
      moveFirst.addItem( "You Move First" ); 
      moveFirst.addItem( "Computer Move First" ); 
      add( moveFirst ); 
      moveFirst.select( 0 ); 
      redMoveFirst = true; 
    } 
    addMouseListener(this); 
    newGame(); 
  } 
 
  public synchronized void loadImages() 
  { 
    int int3; 
    try 
    { 
      redImage = getImage( getDocumentBase(), "p2.gif" ); 
      blueImage = getImage( getDocumentBase(), "p1.gif" ); 
      offScrGraphics.drawImage( redImage, 0, 0, this ); 
      offScrGraphics.drawImage( blueImage, 0, 0, this ); 
    } 
    catch( Exception e1 ) 
    { 
      System.out.println( e1 ); 
    } 
    imageTracker.addImage( redImage, 0 ); 
    imageTracker.addImage( blueImage, 1 ); 
    for( int3 = 0; int3 < 2; ++int3 ) 
    { 
      try 
      { 
        imageTracker.checkID( int3, true ); 
        imageTracker.waitForID( int3 ); 
        showStatus( "Loading image P" + int3 + ".gif" ); 
      } 
      catch( Exception e2 ) 
      { 
        System.out.println( e2 ); 
      } 
    } 
  } 
 
  public void start() 
  { 
    aThread = new Thread( this ); 
    aThread.start(); 
    imageTracker.statusID( 0, true ); 
    imageTracker.statusID( 1, true ); 
  } 
     
  public void run() 
  { 
    for( ;; ) 
    { 
      try 
      { 
        Thread.sleep( 50L ); 
        continue; 
      } 
      catch( Exception unused1 ) 
      { 
        continue; 
      } 
    } 
  } 
 
  /*public void stop() 
  { 
    if( aThread != null && aThread.isAlive() ) 
      aThread.stop(); 
  }*/ 
 
  public void destroy() 
  { 
  } 
     
  public synchronized void blueMove() 
  { 
    int int1 = -1; 
    int int2 = -1; 
    int int3 = -1; 
    int int4 = -1; 
    int int5; 
 
    for( int5 = 0; int5 < DIM; ++int5 ) 
    { 
      int int6; 
      for( int6 = 0; int6 < DIM; ++int6 ) 
      { 
        if( grid[int5 * DIM + int6] == 0 ) 
        { 
          int2 = howGood( int5, int6, 3, 2 ); 
          if( int1 < int2 && int2 > 0 ) 
          { 
            int1 = int2; 
            int3 = int5; 
            int4 = int6; 
          } 
        } 
      } 
    } 
    blueNotMoving = false; 
    if( int1 > 0 ) 
    { 
      grid[int3 * DIM + int4] = BLUE; 
      turnPlys( int3, int4, 3, 2, 4 ); 
    } 
    else 
      blueNotMoving = true; 
  } 
     
  public synchronized int howGood(int int1, int int2, int int3, int int4) 
  { 
    int int6 = 0; 
    int int5 = 0; 
    int int7; 
    int int8; 
    int int9; 
    int int10; 
    for( int8 = int2 + 1; int8 < DIM; ++int8 ) 
    { 
      if( grid[int1 * DIM + int8] == int4 ) 
        ++int5; 
      else 
      { 
        if( grid[int1 * DIM + int8] == int3 ) 
          break; 
        if( grid[int1 * DIM + int8] == 0 ) 
        { 
          int5 = 0; 
          break; 
        } 
      } 
    } 
    if( int8 >= DIM ) 
      int5 = 0; 
    int6 += int5; 
    int5 = 0; 
    for( int8 = int2 - 1; int8 >= 0; --int8 ) 
    { 
      if( grid[int1 * DIM + int8] == int4 ) 
        ++int5; 
      else 
      { 
        if( grid[int1 * DIM + int8] == int3 ) 
    	    break; 
        if( grid[int1 * DIM + int8] == 0 ) 
        { 
          int5 = 0; 
          break; 
        } 
      } 
    } 
    if( int8 <= -1 ) 
      int5 = 0; 
    int6 += int5; 
    int5 = 0; 
    for( int7 = int1 + 1; int7 < DIM; ++int7 ) 
    { 
      if( grid[int7 * DIM + int2] == int4 ) 
        ++int5; 
      else 
      { 
        if( grid[int7 * DIM + int2] == int3 ) 
          break; 
        if( grid[int7 * DIM + int2] == 0 ) 
        { 
          int5 = 0; 
          break; 
        } 
      } 
    } 
    if( int7 >= DIM ) 
      int5 = 0; 
    int6 += int5; 
    int5 = 0; 
    int7 = int1 - 1; 
    while( int7 >= 0 ) 
    { 
      if( grid[int7 * DIM + int2] == int4 ) 
        ++int5; 
      if( grid[int7 * DIM + int2] == int3 ) 
        break; 
      if( grid[int7 * DIM + int2] == 0 ) 
      { 
        int5 = 0; 
        break; 
      } 
      else 
        --int7; 
    } 
    if( int7 <= -1 ) 
      int5 = 0; 
    int6 += int5; 
    int5 = 0; 
    int9 = int2 + 1; 
    int10 = int1 - 1; 
    while( int9 >= 0 && int10 >= 0 ) 
    { 
      if( grid[int10 * DIM + int9] == int4 ) 
        ++int5; 
      if( grid[int10 * DIM + int9] == int3 ) 
        break; 
      if( grid[int10 * DIM + int9] == 0 ) 
      { 
        int5 = 0; 
        break; 
      } 
      else 
      { 
        ++int9; 
        --int10; 
      } 
    } 
    if( int9 >= DIM || int10 <= -1 ) 
      int5 = 0; 
    int6 += int5; 
    int5 = 0; 
    int9 = int2 + 1; 
    for( int10 = int1 + 1; int9 < DIM && int10 < DIM; ++int10 ) 
    { 
      if( grid[int10 * DIM + int9] == int4 ) 
        ++int5; 
      else 
      { 
        if( grid[int10 * DIM + int9] == int3 ) 
          break; 
        if( grid[int10 * DIM + int9] == 0 ) 
        { 
          int5 = 0; 
          break; 
        } 
      } 
      ++int9; 
    } 
    if( int9 >= DIM || int10 >= DIM ) 
      int5 = 0; 
    int6 += int5; 
    int5 = 0; 
    int9 = int2 - 1; 
    for( int10 = int1 - 1; int9 >= 0 && int10 >= 0; --int10 ) 
    { 
      if( grid[int10 * DIM + int9] == int4 ) 
        ++int5; 
      else 
      { 
        if( grid[int10 * DIM + int9] == int3 ) 
          break; 
        if( grid[int10 * DIM + int9] == 0 ) 
        { 
          int5 = 0; 
          break; 
        } 
      } 
      --int9; 
    } 
    if( int9 <= -1 || int10 <= -1 ) 
      int5 = 0; 
    int6 += int5; 
    int5 = 0; 
    int9 = int2 - 1; 
    for( int10 = int1 + 1; int9 < DIM && int10 < DIM; ++int10 ) 
    { 
      if( grid[int10 * DIM + int9] == int4 ) 
        ++int5; 
      else 
      { 
        if( grid[int10 * DIM + int9] == int3 ) 
          break; 
        if( grid[int10 * DIM + int9] == 0 ) 
        { 
          int5 = 0; 
          break; 
        } 
      } 
      --int9; 
    } 
    if( int9 <= -1 || int10 >= DIM ) 
      int5 = 0; 
    int6 += int5; 
    return int6; 
  } 
 
  public synchronized void turnPlys(int int1, int int2, int int3, int int4, int int5) 
  { 
    int int6 = 0; 
    int int8 = int2 + 1; 
    int int7; 
    int int9; 
    int int10; 
    int int11; 
    int int12; 
    int int13; 
    int int14; 
    int int15; 
    int int16; 
    int int17; 
    int int18; 
    int int19; 
 
    while( int8 < DIM ) 
    { 
      int7 = int1 * DIM + int8; 
      if( grid[int7] != int4 ) 
      { 
        if( grid[int7] == int3 ) 
          int6 = 1; 
        break; 
      } 
      else 
        ++int8; 
    } 
    if( int6 != 0 ) 
    { 
      for( int9 = int2 + 1; int9 < DIM; ++int9 ) 
      { 
        int7 = int1 * DIM + int9; 
        if( grid[int7] == int4 ) 
          grid[int7] = int5; 
        else if( grid[int7] == int3 ) 
          break; 
      } 
    } 
    int6 = 0; 
    int9 = int2 - 1; 
    while( int9 >= 0 ) 
    { 
      int7 = int1 * DIM + int9; 
      if( grid[int7] != int4 ) 
      { 
        if( grid[int7] == int3 ) 
          int6 = 1; 
        break; 
      } 
      else 
        --int9; 
    } 
    if( int6 != 0 ) 
    { 
      for( int10 = int2 - 1; int10 >= 0; --int10 ) 
      { 
        int7 = int1 * DIM + int10; 
        if( grid[int7] == int4 ) 
          grid[int7] = int5; 
        else if( grid[int7] == int3 ) 
          break; 
      } 
    }  
    int6 = 0; 
    int10 = int1 + 1; 
    while( int10 < DIM ) 
    { 
      int7 = int10 * DIM + int2; 
      if( grid[int7] != int4 ) 
      { 
        if( grid[int7] == int3 ) 
          int6 = 1; 
        break; 
      } 
      else 
        ++int10; 
    } 
    if( int6 != 0 ) 
    { 
      for( int11 = int1 + 1; int11 < DIM; ++int11 ) 
      { 
        int7 = int11 * DIM + int2; 
        if( grid[int7] == int4 ) 
          grid[int7] = int5; 
        else if( grid[int7] == int3 ) 
          break; 
      } 
    } 
    int6 = 0; 
    int11 = int1 - 1; 
    while( int11 >= 0 ) 
    { 
  	  int7 = int11 * DIM + int2; 
    	if( grid[int7] != int4 ) 
    	{ 
     		if( grid[int7] == int3 ) 
        	int6 = 1; 
	      break; 
  	  } 
    	else 
      	--int11; 
  	} 
    if( int6 != 0 ) 
    { 
      for( int12 = int1 - 1; int12 >= 0; --int12 ) 
      { 
        int7 = int12 * DIM + int2; 
        if( grid[int7] == int4 ) 
     		  grid[int7] = int5; 
        if( grid[int7] == int3 ) 
          break; 
      } 
    } 
    int6 = 0; 
    int12 = int2 + 1; 
    int13 = int1 - 1; 
    while( int12 < DIM && int13 >= 0 ) 
    { 
      int7 = int13 * DIM + int12; 
      if( grid[int7] != int4 ) 
      { 
        if( grid[int7] == int3 ) 
          int6 = 1; 
        break; 
      } 
      else 
      { 
        ++int12; 
        --int13; 
      } 
    } 
    if( int6 != 0 ) 
    { 
      int14 = int2 + 1; 
      for( int15 = int1 - 1; int14 < DIM && int15 >= 0; --int15 ) 
      { 
        int7 = int15 * DIM + int14; 
        if( grid[int7] == int4 ) 
          grid[int7] = int5; 
        if( grid[int7] == int3 ) 
          break; 
        ++int14; 
      } 
    } 
    int6 = 0; 
    int14 = int2 + 1; 
    int15 = int1 + 1; 
    while( int14 < DIM && int15 < DIM ) 
    { 
      int7 = int15 * DIM + int14; 
      if( grid[int7] != int4 ) 
      { 
        if( grid[int7] == int3 ) 
          int6 = 1; 
        break; 
      } 
      else 
      { 
        ++int14; 
        ++int15; 
      } 
    } 
    if( int6 != 0 ) 
    { 
      int16 = int2 + 1; 
      for( int17 = int1 + 1; int16 < DIM && int17 < DIM; ++int17 ) 
      { 
        int7 = int17 * DIM + int16; 
        if( grid[int7] == int4 ) 
          grid[int7] = int5; 
        if( grid[int7] == int3 ) 
          break; 
        ++int16; 
      } 
    } 
    int6 = 0; 
    int16 = int2 - 1; 
    int17 = int1 - 1; 
    while( int16 >= 0 && int17 >= 0 ) 
    { 
      int7 = int17 * DIM + int16; 
      if( grid[int7] != int4 ) 
      { 
        if( grid[int7] == int3 ) 
          int6 = 1; 
        break; 
      } 
      else 
      { 
        --int16; 
        --int17; 
      } 
    } 
    if( int6 != 0 ) 
    { 
      int18 = int2 - 1; 
      for( int19 = int1 - 1; int18 >= 0 && int19 >= 0; --int19 ) 
      { 
        int7 = int19 * DIM + int18; 
        if( grid[int7] == int4 ) 
          grid[int7] = int5; 
        if( grid[int7] == int3 ) 
          break; 
        --int18; 
      } 
    } 
    int6 = 0; 
    int18 = int2 - 1; 
    int19 = int1 + 1; 
    while( int18 >= 0 && int19 < DIM ) 
    { 
      int7 = int19 * DIM + int18; 
      if( grid[int7] != int4 ) 
      { 
        if( grid[int7] == int3 ) 
          int6 = 1; 
        break; 
      } 
      else 
      { 
        --int18; 
        ++int19; 
      } 
    } 
    if( int6 != 0 ) 
    { 
      int int20 = int2 - 1; 
      int int21; 
      for( int21 = int1 + 1; int20 >= 0 && int21 < DIM; ++int21 ) 
      { 
        int7 = int21 * DIM + int20; 
        if( grid[int7] == int4 ) 
          grid[int7] = int5; 
        if( grid[int7] == int3 ) 
          break; 
        --int20; 
      } 
    } 
    animating = true; 
  } 
 
  public void checkScore() 
  { 
    int int2; 
 
    redScore = blueScore = 0; 
    for( int2 = 0; int2 < DIM; ++int2 ) 
    { 
      int int3; 
      for( int3 = 0; int3 < DIM; ++int3 ) 
      { 
        int int1 = int2 * DIM + int3; 
 
        if( grid[int1] == 2 || grid[int1] == 5 ) 
          ++redScore; 
        else if( grid[int1] == 3 || grid[int1] == 4 ) 
          ++blueScore; 
      } 
    } 
  } 
 
  public synchronized void paint(Graphics g) 
  { 
    if( !imageTracker.checkAll() ) 
    { 
      g.setColor( getForeground() ); 
      g.drawString( "Loading images", 50, 50 ); 
    } 
    else 
    { 
      int int2; 
      int int3; 
      int int4; 
      int int5; 
      int int6; 
 
      buttonHeight = button.getSize().height + button.getLocation().y * 2; 
      getFontMetrics( f ); 
      int2 = getSize().width - fontHeight * 3 - buttonHeight; 
      int3 = getSize().height - fontHeight * 3 - buttonHeight; 
      if( int2 != boardSize ) 
      { 
        if( int2 > int3 ) 
          boardSize = int3 / DIM * DIM; 
        else 
          boardSize = int2 / DIM * DIM; 
      } 
      if( boardSize > 400 ) 
        boardSize = 400; 
      offScrGraphics.setColor(getBackground() ); 
      offScrGraphics.fillRect( 0, 0, getSize().width, getSize().height ); 
      offScrGraphics.setColor( Color.white ); 
      offScrGraphics.fillRect( 0, 0, boardSize, boardSize ); 
      int4 = boardSize / DIM; 
      offScrGraphics.setColor( Color.red ); 
      for( int5 = 0; int5 < DIM; ++int5 ) 
      { 
        offScrGraphics.drawLine( 0, int5 * int4, boardSize - 1, int5 * int4 ); 
        for( int6 = 0; int6 < DIM; ++int6 ) 
        { 
          offScrGraphics.drawLine( int6 * int4, 0, int6 * int4, boardSize - 1 ); 
          if( grid[int5 * DIM + int6] == 2 ) 
            offScrGraphics.drawImage( redImage, int6 * int4 + 1, int5 * int4 + 1, int4 - 2, int4 - 2, this ); 
          else if( grid[int5 * DIM + int6] == 3 ) 
            offScrGraphics.drawImage( blueImage, int6 * int4 + 1, int5 * int4 + 1, int4 - 2, int4 - 2, this ); 
        } 
      } 
      offScrGraphics.drawLine( boardSize - 1, 0, boardSize - 1, boardSize - 1 ); 
      offScrGraphics.drawLine( 0, boardSize - 1, boardSize - 1, boardSize - 1 ); 
      offScrGraphics.setColor( getForeground() ); 
      if( illegalMove ) 
        offScrGraphics.drawString( "Illegal Move", button.getLocation().x, boardSize + fontAscent ); 
      else if( blueNotMoving ) 
        offScrGraphics.drawString( "Computer Pass", button.getLocation().x, boardSize + fontAscent ); 
      offScrGraphics.drawImage( redImage, button.getLocation().x, boardSize + fontHeight * 2 - fontAscent, fontAscent, fontAscent, this ); 
        offScrGraphics.drawString( " You: " + (String.valueOf( redScore )), button.getLocation().x + fontAscent, boardSize + fontHeight * 2 ); 
      offScrGraphics.drawImage( blueImage, button.getLocation().x, boardSize + fontHeight * 3 - fontAscent, fontAscent, fontAscent, this ); 
      offScrGraphics.drawString( " Computer: " + (String.valueOf( blueScore )), button.getLocation().x + fontAscent, boardSize + fontHeight * 3 ); 
      offScrGraphics.setColor( Color.white ); 
      int6 = 0; 
      if( animating ) 
      { 
        int6 = int4 - 2; 
        while( int6 > 0 ) 
        { 
          int int7; 
          for( int7 = 0; int7 < DIM; ++int7 ) 
          { 
            int int8; 
            for( int8 = 0; int8 < DIM; ++int8 ) 
            { 
              if( grid[int7 * DIM + int8] == 5 ) 
              { 
                offScrGraphics.fillRect( int8 * int4 + 1, int7 * int4 + 1, int4 - 1, int4 - 1 ); 
                offScrGraphics.drawImage( blueImage, int8 * int4 + 1 + int4 / 2 - int6 / 2, int7 * int4 + 1 + int4 / 2 - int6 / 2, int6, int6, this ); 
                if( int6 <= 2 ) 
                  grid[int7 * DIM + int8] = 2; 
              } 
              else if( grid[int7 * DIM + int8] == 4 ) 
              { 
                offScrGraphics.fillRect( int8 * int4 + 1, int7 * int4 + 1, int4 - 1, int4 - 1 ); 
                offScrGraphics.drawImage( redImage, int8 * int4 + 1 + int4 / 2 - int6 / 2, int7 * int4 + 1 + int4 / 2 - int6 / 2, int6, int6, this ); 
                if( int6 <= 2 ) 
                  grid[int7 * DIM + int8] = 3; 
              } 
            } 
          } 
          g.drawImage( offScrImage, button.getLocation().x, buttonHeight, this ); 
          int6 -= 3; 
          try 
          { 
            Thread.sleep( 50L ); 
            continue; 
          } 
          catch( Exception unused9 ) 
          { 
            continue; 
          } 
        } 
        animating = false; 
        paint( g ); 
      } 
      if((redScore+blueScore)==DIM*DIM ) 
      { 
      	if(redScore!=blueScore) 
      		offScrGraphics.drawString((redScore>blueScore)?"You Win!":"You Lose!",button.getLocation().x, boardSize + fontAscent); 
       	else 
       		offScrGraphics.drawString("No One Win!",button.getLocation().x, boardSize + fontAscent); 
      } 
      g.drawImage( offScrImage, button.getLocation().x, buttonHeight, this ); 
    } 
  } 
    
  public synchronized void update(Graphics g) 
  { 
    paint( g ); 
  } 
     
  public void actionPerformed(ActionEvent e) 
  { 
  	newGame(); 
  } 
     
  public void mousePressed(MouseEvent e){} 
  public void mouseClicked(MouseEvent e){} 
  public void mouseEntered(MouseEvent e){} 
  public void mouseExited(MouseEvent e){} 
  public synchronized void mouseReleased(MouseEvent e) 
  { 
    int x=e.getX(); 
    int y=e.getY(); 
    if( imageTracker.checkID( 0, true ) ) 
    { 
      int int4 = (x - button.getLocation().x) * DIM / boardSize; 
      int int5 = (y - buttonHeight) * DIM / boardSize; 
      if( int5 < DIM && int4 < DIM && grid[int5 * DIM + int4] == 0 ) 
      { 
        illegalMove = false; 
        if( howGood( int5, int4, 2, 3 ) <= 0 ) 
        { 
          illegalMove = true; 
          paint(getGraphics() ); 
          return; 
        } 
        else 
        { 
          grid[int5 * DIM + int4] = 2; 
          turnPlys( int5, int4, 2, 3, 5 ); 
          checkScore(); 
          paint( getGraphics() ); 
          try 
          { 
            Thread.sleep( 1000L ); 
          } 
          catch( Exception unused6 ) 
          { 
          } 
          blueMove(); 
          checkScore(); 
          paint( getGraphics() ); 
        } 
      } 
      else if( int5 < DIM && int4 < DIM && grid[int5 * DIM + int4] == 3 ) 
      { 
        illegalMove = true; 
        paint( getGraphics() ); 
        return; 
      } 
    } 
    return; 
  }   
}