📄 world.java
字号:
}
return true;
}
boolean nextToARobot( Integer robotId )
{
Robot current = getRobot( robotId, false );
Enumeration enumeration = robots.elements();
while( enumeration.hasMoreElements() )
{
Robot currentRobot = (Robot) enumeration.nextElement();
if( current.avenue == currentRobot.avenue && current.street == currentRobot.street && current != currentRobot )
return true;
}
return false;
}
boolean nextToABeeper( Integer robotId )
{
Robot current = getRobot( robotId, false );
Enumeration enumeration = beepers.elements();
while( enumeration.hasMoreElements() )
{
Beepers currentBeepers = (Beepers) enumeration.nextElement();
if( current.avenue == currentBeepers.avenue && current.street == currentBeepers.street )
return true;
}
return false;
}
/**
* Move the denoted Robot one step (to the next crossing) in its direction.
* If the route it would be using is blocked, this method throws a RuntimeException.
*/
void move( Integer robotId )
{
Robot current = getRobot( robotId, true );
Enumeration enumeration = walls.elements();
switch( current.direction )
{
case direction.NORTH_VALUE :
while( enumeration.hasMoreElements() )
{
Wall currentWall = (Wall) enumeration.nextElement();
if( ( currentWall.street == current.street ) && ( currentWall.avenue == current.avenue) && currentWall.isEastWest )
throw new RuntimeException( "Cannot move through wall." );
}
current.street++;
break;
case direction.SOUTH_VALUE :
while( enumeration.hasMoreElements() )
{
Wall currentWall = (Wall) enumeration.nextElement();
if( ( currentWall.street == current.street - 1 ) && ( currentWall.avenue == current.avenue ) && currentWall.isEastWest )
throw new RuntimeException( "Cannot move through wall." );
}
if( current.street == 1 )
throw new RuntimeException( "Cannot move through wall." );
current.street--;
break;
case direction.WEST_VALUE :
while( enumeration.hasMoreElements() )
{
Wall currentWall = (Wall) enumeration.nextElement();
if( ( currentWall.avenue == current.avenue - 1 ) && ( currentWall.street == current.street) && currentWall.isNorthSouth )
throw new RuntimeException( "Cannot move through wall." );
}
if( current.avenue == 1 )
throw new RuntimeException( "Cannot move through wall." );
current.avenue--;
break;
case direction.EAST_VALUE :
while( enumeration.hasMoreElements() )
{
Wall currentWall = (Wall) enumeration.nextElement();
if( ( currentWall.avenue == current.avenue ) && ( currentWall.street == current.street ) && currentWall.isNorthSouth )
throw new RuntimeException( "Cannot move through wall." );
}
current.avenue++;
break;
}
trace( current );
update();
}
/**
* Turns the denoted Robot left by 90 degrees.
*/
void turnLeft( Integer robotId )
{
Robot current = getRobot( robotId, true );
switch( current.direction )
{
case direction.NORTH_VALUE :
current.direction = West.getValue();
break;
case direction.SOUTH_VALUE :
current.direction = East.getValue();
break;
case direction.WEST_VALUE :
current.direction = South.getValue();
break;
case direction.EAST_VALUE :
current.direction = North.getValue();
break;
}
trace( current );
update();
}
/**
* Picks up a beeper and puts it into the denoted Robot's beeperbag, if the Robot
* stands on a crossroad where there is also at least one beeper. If no beeper
* is present, this method throws a RuntimeException.
*/
void pickBeeper( Integer robotId )
{
Robot current = getRobot( robotId, true );
synchronized( this )
{
Enumeration enumeration = beepers.elements();
while( enumeration.hasMoreElements() )
{
Beepers currentBeepers = (Beepers) enumeration.nextElement();
if( ( currentBeepers.street == current.street ) && ( currentBeepers.avenue == current.avenue ) )
{
if( currentBeepers.count == 1 )
beepers.remove( currentBeepers );
else if(currentBeepers.count == 0)
throw new RuntimeException("No beepers to pick up.");
else
currentBeepers.count--;
if( current.beepers >= 0 )
current.beepers++;
trace( current );
update();
return;
}
}
}
throw new RuntimeException( "No beepers to pick up." );
}
/**
* Puts a beeper from the denoted Robot's beeperbag onto the crossroad where it is#
* standing. If the Robot has no beepers, a RuntimeException is thrown.
*/
void putBeeper( Integer robotId )
{
Robot current = getRobot( robotId, true );
if( current.beepers == 0 )
throw new RuntimeException( "Has no beepers." );
if( current.beepers > 0 )
current.beepers--;
placeBeepers( current.street, current.avenue, 1 );
trace( current );
update();
}
/**
* Turns of the denoted Robot.
*/
void turnOff( Integer robotId )
{
Robot current = getRobot( robotId, true );
current.on = false;
trace( current );
update();
}
//------------------------------------------------------------------------------
/**
* This class is used to paint the World into a JFrame.
*/
private class SwingWorld extends JComponent
{
private Image crossroad;
private Image wallImgs[] = new Image [ 4 ] ;
private Image beepersImgs[] = new Image [ 10 ] ;
private Image karel[] = new Image [ 4 ] ;
public SwingWorld()
{
// Load the gif images for painting the world. Use the Class.getResource() method. So
// the images are loaded using the classloader and can, p.e. be in a jar archive.
crossroad = Toolkit.getDefaultToolkit().createImage( World.class.getResource( "crossroad.gif" ) );
beepersImgs[0] = Toolkit.getDefaultToolkit().createImage( World.class.getResource( "beepersx.gif" ) );
for( int i = 1; i <= 9; i++ )
beepersImgs[i] = Toolkit.getDefaultToolkit().createImage( World.class.getResource( "beepers" + i + ".gif" ) );
karel[North.getValue()] = Toolkit.getDefaultToolkit().createImage( World.class.getResource( "karelnorth.gif" ) );
karel[East.getValue()] = Toolkit.getDefaultToolkit().createImage( World.class.getResource( "kareleast.gif" ) );
karel[South.getValue()] = Toolkit.getDefaultToolkit().createImage( World.class.getResource( "karelsouth.gif" ) );
karel[West.getValue()] = Toolkit.getDefaultToolkit().createImage( World.class.getResource( "karelwest.gif" ) );
wallImgs[North.getValue()] = Toolkit.getDefaultToolkit().createImage( World.class.getResource( "wallnorth.gif" ) );
wallImgs[East.getValue()] = Toolkit.getDefaultToolkit().createImage( World.class.getResource( "walleast.gif" ) );
wallImgs[South.getValue()] = Toolkit.getDefaultToolkit().createImage( World.class.getResource( "wallsouth.gif" ) );
wallImgs[West.getValue()] = Toolkit.getDefaultToolkit().createImage( World.class.getResource( "wallwest.gif" ) );
for(int i = 0; i < beepersImgs.length; i++)
Toolkit.getDefaultToolkit().prepareImage(beepersImgs[i], -1, -1, null);
for(int i = 0; i < karel.length; i++)
Toolkit.getDefaultToolkit().prepareImage(karel[i], -1, -1, null);
for(int i = 0; i < wallImgs.length; i++)
Toolkit.getDefaultToolkit().prepareImage(wallImgs[i], -1, -1, null);
}
public void paint( Graphics g )
{
int avDist = getWidth() / ( avenues );
int stDist = getHeight() / ( streets );
for( int a = 0; a < avenues; a++ )
for( int s = 0; s < streets; s++ )
drawImage( g, crossroad, a, s, avDist, stDist );
for( int a = 0; a < avenues; a++ )
drawImage( g, wallImgs[South.getValue()], a, 0, avDist, stDist );
for( int s = 0; s < streets; s++ )
drawImage( g, wallImgs[West.getValue()], 0, s, avDist, stDist );
Enumeration enumeration = walls.elements();
while( enumeration.hasMoreElements() )
{
Wall current = (Wall) enumeration.nextElement();
if( current.isEastWest )
drawImage( g, wallImgs[North.getValue()], current.avenue - 1, current.street - 1, avDist, stDist );
else if( current.isNorthSouth )
drawImage( g, wallImgs[East.getValue()], current.avenue - 1, current.street - 1, avDist, stDist );
}
enumeration = beepers.elements();
while( enumeration.hasMoreElements() )
{
Beepers current = (Beepers) enumeration.nextElement();
if(current.count == 0)
break;
int index = current.count;
if( current.count > 9 )
index = 0;
drawImage( g, beepersImgs[index], current.avenue - 1, current.street - 1, avDist, stDist );
}
enumeration = robots.elements();
while( enumeration.hasMoreElements() )
{
Robot current = (Robot) enumeration.nextElement();
drawImage( g, karel[current.direction], current.avenue - 1, current.street - 1, avDist, stDist );
}
Toolkit.getDefaultToolkit().sync();
}
private void drawImage( Graphics g, Image image, int x, int y, int width, int height )
{
g.drawImage( image, x * width, getHeight() - ( y + 1 ) * height, width, height, this );
}
}
private void init()
{
if(worldPanel != null)
return;
worldPanel = new JPanel();
worldPanel.setLayout(new BorderLayout(4, 4));
worldPanel.add( new SwingWorld(), BorderLayout.CENTER );
worldPanel.add( getSizePanel(), BorderLayout.NORTH );
worldPanel.add( getDelayPanel(), BorderLayout.SOUTH );
update();
}
protected JComponent getSizePanel()
{
JPanel result = new JPanel( new GridLayout( 1, 4, 4, 4 ) );
result.add( new JLabel( "Streets:" ) );
streetsText = new JTextField( "" + numberOfStreets() );
streetsText.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_ENTER) {
try
{
setStreets( Integer.parseInt( streetsText.getText() ) );
}
catch( NumberFormatException exception ) {}
streetsText.setText("" + World.this.streets);
}
}
});
streetsText.addFocusListener(new FocusAdapter() {
public void focusLost(FocusEvent e) {
try
{
setStreets( Integer.parseInt( streetsText.getText() ) );
}
catch( NumberFormatException exception ) {}
streetsText.setText("" + World.this.streets);
}
});
result.add( streetsText );
result.add( new JLabel( "Avenues:" ) );
avenuesText = new JTextField( "" + numberOfAvenues() );
avenuesText.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_ENTER) {
try
{
setAvenues( Integer.parseInt( avenuesText.getText() ) );
}
catch( NumberFormatException exception ) {}
avenuesText.setText("" + World.this.avenues);
}
}
});
avenuesText.addFocusListener( new FocusAdapter() {
public void focusLost(FocusEvent e) {
try
{
setAvenues( Integer.parseInt( avenuesText.getText() ) );
}
catch( NumberFormatException exception ) {}
avenuesText.setText("" + World.this.avenues);
}
} );
result.add( avenuesText );
return result;
}
protected JComponent getDelayPanel()
{
JPanel result = new JPanel( new GridLayout( 1, 4, 4, 4 ) );
result.add( new JLabel( "Delay [ms]:" ) );
delayText = new JTextField( "" + delay );
delayText.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_ENTER) {
try
{
setDelay( Integer.parseInt( delayText.getText() ) );
}
catch( NumberFormatException exception ) {}
delayText.setText("" + World.this.delay);
}
}
});
delayText.addFocusListener( new FocusAdapter() {
public void focusLost(FocusEvent e) {
try
{
setDelay( Integer.parseInt( delayText.getText() ) );
}
catch( NumberFormatException exception ) {}
delayText.setText("" + World.this.delay);
}
} );
result.add( delayText );
pauseButton = new JButton( "Pause" );
pauseButton.setToolTipText("Halts a running programm");
pauseButton.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent event )
{
if( pauseButton.getText().equals( "Pause" ) )
{
pauseButton.setText( "Resume" );
pauseButton.setToolTipText("Resumes an interrupted programm");
delayThread.pause();
}
else if( pauseButton.getText().equals( "Resume" ) )
{
pauseButton.setText( "Pause" );
pauseButton.setToolTipText("Halts a running programm");
delayThread.unPause();
}
}
} );
result.add( pauseButton );
stopButton = new JButton( "Stop" );
stopButton.setToolTipText("Stops a running programm");
result.add( stopButton );
return result;
}
protected void update()
{
if( worldPanel != null ) {
Runnable worldUpdate = new Runnable() {
public void run() {
worldPanel.repaint();
}
};
if(EventQueue.isDispatchThread())
worldUpdate.run();
else
try {
EventQueue.invokeAndWait(worldUpdate);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -