⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 world.java

📁 是有关解释器的.用JAVA编写.可以解释一般的JAVA程序.
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
		}
		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 + -