📄 blackvswhite.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 BlackVSWhite 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 n1;
int n2;
for( n1 = 0; n1 < DIM; ++n1 )
{
for( n2 = 0; n2 < DIM; ++n2 )
grid[n1 * DIM + n2] = EMPTY;
}
n2 = DIM / 2;
grid[(n2 - 1) * DIM + (n2 - 1)] = RED;
grid[(n2 - 1) * DIM + n2] = BLUE;
grid[n2 * DIM + (n2 - 1)] = BLUE;
grid[n2 * DIM + n2] = 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( "新游戏" );
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( "玩家先走" );
moveFirst.addItem( "电脑先走" );
add( moveFirst );
moveFirst.select( 0 );
redMoveFirst = true;
}
addMouseListener(this);
newGame();
}
public synchronized void loadImages()
{
int i;
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( i = 0; i < 2; ++i )
{
try
{
imageTracker.checkID( i, true );
imageTracker.waitForID( i );
showStatus( "Loading image P" + i + ".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 num1 = -1;
int num2 = -1;
int num3 = -1;
int num4 = -1;
int num5;
for( num5 = 0; num5 < DIM; ++num5 )
{
int num6;
for( num6 = 0; num6 < DIM; ++num6 )
{
if( grid[num5 * DIM + num6] == 0 )
{
num2 = isGood( num5, num6, 3, 2 );
if( num1 < num2 && num2 > 0 )
{
num1 = num2;
num3 = num5;
num4 = num6;
}
}
}
}
blueNotMoving = false;
if( num1 > 0 )
{
grid[num3 * DIM + num4] = BLUE;
change( num3, num4, 3, 2, 4 );
}
else
blueNotMoving = true;
}
public synchronized int isGood(int num1, int num2, int num3, int num4)
{
int num6 = 0;
int num5 = 0;
int num7;
int num8;
int num9;
int num10;
for( num8 = num2 + 1; num8 < DIM; ++num8 )
{
if( grid[num1 * DIM + num8] == num4 )
++num5;
else
{
if( grid[num1 * DIM + num8] == num3 )
break;
if( grid[num1 * DIM + num8] == 0 )
{
num5 = 0;
break;
}
}
}
if( num8 >= DIM )
num5 = 0;
num6 += num5;
num5 = 0;
for( num8 = num2 - 1; num8 >= 0; --num8 )
{
if( grid[num1 * DIM + num8] == num4 )
++num5;
else
{
if( grid[num1 * DIM + num8] == num3 )
break;
if( grid[num1 * DIM + num8] == 0 )
{
num5 = 0;
break;
}
}
}
if( num8 <= -1 )
num5 = 0;
num6 += num5;
num5 = 0;
for( num7 = num1 + 1; num7 < DIM; ++num7 )
{
if( grid[num7 * DIM + num2] == num4 )
++num5;
else
{
if( grid[num7 * DIM + num2] == num3 )
break;
if( grid[num7 * DIM + num2] == 0 )
{
num5 = 0;
break;
}
}
}
if( num7 >= DIM )
num5 = 0;
num6 += num5;
num5 = 0;
num7 = num1 - 1;
while( num7 >= 0 )
{
if( grid[num7 * DIM + num2] == num4 )
++num5;
if( grid[num7 * DIM + num2] == num3 )
break;
if( grid[num7 * DIM + num2] == 0 )
{
num5 = 0;
break;
}
else
--num7;
}
if( num7 <= -1 )
num5 = 0;
num6 += num5;
num5 = 0;
num9 = num2 + 1;
num10 = num1 - 1;
while( num9 >= 0 && num10 >= 0 )
{
if( grid[num10 * DIM + num9] == num4 )
++num5;
if( grid[num10 * DIM + num9] == num3 )
break;
if( grid[num10 * DIM + num9] == 0 )
{
num5 = 0;
break;
}
else
{
++num9;
--num10;
}
}
if( num9 >= DIM || num10 <= -1 )
num5 = 0;
num6 += num5;
num5 = 0;
num9 = num2 + 1;
for( num10 = num1 + 1; num9 < DIM && num10 < DIM; ++num10 )
{
if( grid[num10 * DIM + num9] == num4 )
++num5;
else
{
if( grid[num10 * DIM + num9] == num3 )
break;
if( grid[num10 * DIM + num9] == 0 )
{
num5 = 0;
break;
}
}
++num9;
}
if( num9 >= DIM || num10 >= DIM )
num5 = 0;
num6 += num5;
num5 = 0;
num9 = num2 - 1;
for( num10 = num1 - 1; num9 >= 0 && num10 >= 0; --num10 )
{
if( grid[num10 * DIM + num9] == num4 )
++num5;
else
{
if( grid[num10 * DIM + num9] == num3 )
break;
if( grid[num10 * DIM + num9] == 0 )
{
num5 = 0;
break;
}
}
--num9;
}
if( num9 <= -1 || num10 <= -1 )
num5 = 0;
num6 += num5;
num5 = 0;
num9 = num2 - 1;
for( num10 = num1 + 1; num9 < DIM && num10 < DIM; ++num10 )
{
if( grid[num10 * DIM + num9] == num4 )
++num5;
else
{
if( grid[num10 * DIM + num9] == num3 )
break;
if( grid[num10 * DIM + num9] == 0 )
{
num5 = 0;
break;
}
}
--num9;
}
if( num9 <= -1 || num10 >= DIM )
num5 = 0;
num6 += num5;
return num6;
}
public synchronized void change(int num1, int num2, int num3, int num4, int num5)
{
int num6 = 0;
int num8 = num2 + 1;
int num7;
int num9;
int num10;
int num11;
int num12;
int num13;
int num14;
int num15;
int num16;
int num17;
int num18;
int num19;
while( num8 < DIM )
{
num7 = num1 * DIM + num8;
if( grid[num7] != num4 )
{
if( grid[num7] == num3 )
num6 = 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -