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;
}
}