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

📄 pipe.java

📁 J2ME编程的50个例子,适合掌上系统的编程
💻 JAVA
字号:
package demo;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.TiledLayer;


public class Pipe {
	//水管种类数值,与tile编号对应
	public static final int PIPE_END			= 1;	//终点水管
	public static final int PIPE_START		= 2;	//起点水管
	public static final int PIPE_GOLD_H		= 3;	//金色的横向水管
	public static final int PIPE_GOLD_V		= 4;	//金色的纵向水管
	public static final int PIPE_GOLD_C		= 5;	//金色的交叉水管
	public static final int PIPE_CURVE_U 		= 6;	//向上的弯形水管
	public static final int PIPE_CURVE_R 		= 7;	//向右的弯形水管
	public static final int PIPE_CURVE_D 		= 8;	//向下的弯形水管
	public static final int PIPE_CURVE_L 		= 9;	//向左的弯形水管
	public static final int PIPE_LINE_H		= 10;	//横向直线水管
	public static final int PIPE_LINE_V		= 11;	//纵向直线水管
	
	private int a[][] = 								//存储初始的水管
		{ { 5, 3, 3, 3, 3, 3, 3, 5 },
		  { 4, 6, 6, 0, 0, 9,10, 4 },
		  { 4, 9, 9, 0, 8, 9, 0, 4 },
		  { 4, 9,11,10, 8, 0, 0, 4 },
		  { 4, 0, 7, 0, 8, 9, 0, 4 },
		  { 4, 6, 8, 0, 0, 9,11, 4 },
		  { 4, 0, 7, 0, 8, 9, 0, 4 },
		  { 5, 3, 3, 3, 3, 3, 3, 5 } };
	private int m_nStartRow = 2;						//起点水管的行数,列数固定为0
	private int m_nEndRow = 5;							//终点水管的行数,列数固定为7
	private TiledLayer m_TLayer;						//水管Tile图像
	private int m_nCurCol = 2;							//当前选择的列
	private int m_nCurRow = 2;							//当前选择的行
	
	//构造方法,参数scrWidth、scrHeight分别是屏幕的高和宽
	public Pipe(int scrWidth, int scrHeight){
		try{
			Image img = Image.createImage("/demo/pipe.png");
			m_TLayer = new TiledLayer( a[0].length, a.length, img, 15, 15 );
			int x = scrWidth / 2 - m_TLayer.getColumns() / 2 * 15;
			int y = scrHeight / 2 - m_TLayer.getRows() / 2 * 15;
			m_TLayer.setPosition(x, y);
			Reset();
		}
		catch (Exception ex){}
	}
	//重新设置水管
	public void Reset(){
		for( int col = 0; col < m_TLayer.getColumns(); col ++ ){
			for( int row = 0; row < m_TLayer.getRows(); row ++ ){
				m_TLayer.setCell(col, row, a[row][col] );
			}
		}
		//设置起点水管
		m_TLayer.setCell(0, m_nStartRow, 2);
		//设置终点水管
		m_TLayer.setCell(m_TLayer.getColumns()-1, m_nEndRow, 1);
	}
	//获取当前选择的列数
	public int getCurCol(){
		return m_nCurCol;
	}
	//获取当前选择的行数
	public int getCurRow(){
		return m_nCurRow;
	}
	//设置当前选择的位置
	public void setCurSel( int col, int row ){
		m_nCurCol = col;
		m_nCurRow = row;
		if( m_nCurCol < 0 )
			m_nCurCol = 0;
		else if( m_nCurCol >= m_TLayer.getColumns() )
			m_nCurCol = m_TLayer.getColumns() - 1;
		if( m_nCurRow < 0 )
			m_nCurRow = 0;
		else if( m_nCurRow >= m_TLayer.getRows() )
			m_nCurRow = m_TLayer.getRows() - 1;
	}
	//显示水管及当前选择的位置
	//参数g对应手机屏幕
	public void Paint(Graphics g){
		//显示水管
		m_TLayer.paint(g);
		//显示当前选择位置
		int x = m_TLayer.getX() + m_nCurCol * m_TLayer.getCellWidth();
		int y = m_TLayer.getY() + m_nCurRow * m_TLayer.getCellHeight();
		g.drawRect(x, y, m_TLayer.getCellWidth(), m_TLayer.getCellHeight());
	}
	//旋转水管,参数col、row分别是被旋转水管的列、行位置
	public void rotPipe( int col, int row ){
		
		switch( m_TLayer.getCell( col, row) ){
		case PIPE_CURVE_U:			//向上的弯形水管旋转后变成向右的弯形水管
			m_TLayer.setCell(col, row, PIPE_CURVE_R);
			break;
		case PIPE_CURVE_R:			//向右的弯形水管旋转后变成向下的弯形水管
			m_TLayer.setCell(col, row, PIPE_CURVE_D);
			break;
		case PIPE_CURVE_D:			//向下的弯形水管旋转后变成向左的弯形水管
			m_TLayer.setCell(col, row, PIPE_CURVE_L);
			break;
		case PIPE_CURVE_L:			//向左的弯形水管旋转后变成向上的弯形水管
			m_TLayer.setCell(col, row, PIPE_CURVE_U);
			break;
		case PIPE_LINE_H:			//横向直线水管旋转后变成纵向直线水管
			m_TLayer.setCell(col, row, PIPE_LINE_V);
			break;
		case PIPE_LINE_V:			//纵向直线水管旋转后变成横向直线水管
			m_TLayer.setCell(col, row, PIPE_LINE_H);
			break;
		}
	}
	//是否完成了水管的连接
	public boolean isFinish(){
		return isLink( 0, m_nStartRow, 0 );
	}
	//定义水管的进水方向,即连接方向
	public static final int IN_DIR_UP			= 0;	//从上方进水
	public static final int IN_DIR_RIGHT		= 1;	//从右方进水
	public static final int IN_DIR_DOWN		= 2;	//从下方进水
	public static final int IN_DIR_LEFT		= 3;	//从左方进水
	//从上方出水相当于下一个水管从下方进水
	public static final int OUT_DIR_UP 		= IN_DIR_DOWN;	
	//从右方出水相当于下一个水管从左方进水
	public static final int OUT_DIR_RIGHT		= IN_DIR_LEFT;
	//从下方出水相当于下一个水管从上方进水
	public static final int OUT_DIR_DOWN		= IN_DIR_UP;
	//从左方出水相当于下一个水管从右方进水
	public static final int OUT_DIR_LEFT		= IN_DIR_RIGHT;
	//判断当前水管与周围的水管是否可以连接
	//返回true表示可以,false表示不可以
	//参数col、row分别是当前水管的行列数,参数nDir是进水的方向
	private boolean isLink( int col, int row, int nDir ){
		/******第(1)步,判断水流是否可以流入当前水管*****/
		if( col < 0 || col >= m_TLayer.getColumns() )
			return false;
		if( row < 0 || row >= m_TLayer.getRows() )
			return false;
		int type 	= m_TLayer.getCell(col, row);
		switch( type ){
		case PIPE_START:
			break;
		case PIPE_END:				//终点水管,只能从左侧进水
			if( nDir != IN_DIR_LEFT )
				return false;
			break;
		case PIPE_CURVE_U:			//向上的水管,可以从上、右两方进水或出水
			{
				switch(nDir){
				case IN_DIR_UP:
					return isLink(col + 1, row, OUT_DIR_RIGHT);
				case IN_DIR_RIGHT:
					return isLink(col, row - 1, OUT_DIR_UP);
				}
			}
			break;
		case PIPE_CURVE_R:			//向右的水管,可以从右、下两方进水或出水
			{
				if( nDir != IN_DIR_RIGHT && nDir != IN_DIR_DOWN )
					return false;
			}
			break;
		case PIPE_CURVE_D:			//向下的水管,可以从下、左两方进水或出水
			{
				if( nDir != IN_DIR_DOWN && nDir != IN_DIR_LEFT )
					return false;
			}
			break;
		case PIPE_CURVE_L:			//向左的水管,可以从左、上两方进水或出水
			{
				if( nDir != IN_DIR_LEFT && nDir != IN_DIR_UP )
					return false;
			}
			break;
		case PIPE_LINE_H:			//横向的水管,可以从左、右两方进水或出水
			{
				if( nDir != IN_DIR_LEFT && nDir != IN_DIR_RIGHT )
					return false;
			}
			break;
		case PIPE_LINE_V:			//纵向的水管,可以从上、下两方进水或出水
			{
				if( nDir != IN_DIR_UP && nDir != IN_DIR_DOWN )
					return false;
			}
			break;
		default:
			return false;
		}
		
		/******第(2)步,判断当前水管是否为出口水管*****/
		if( type == PIPE_END )
			return true;
		
		/******第(3)步,处理下一个水管****************/
		switch( type ){
		case PIPE_START:			//起点水管,从右侧出水
			return isLink(col + 1, row, OUT_DIR_RIGHT);
		case PIPE_CURVE_U:			//向上的水管,可以从上、右两方进水或出水
			{
				switch(nDir){
				case IN_DIR_UP:
					return isLink(col + 1, row, OUT_DIR_RIGHT);
				case IN_DIR_RIGHT:
					return isLink(col, row - 1, OUT_DIR_UP);
				}
			}
			break;
		case PIPE_CURVE_R:			//向右的水管,可以从右、下两方进水或出水
			{
				switch(nDir){
				case IN_DIR_RIGHT:
					return isLink(col, row + 1, OUT_DIR_DOWN);
				case IN_DIR_DOWN:
					return isLink(col + 1, row, OUT_DIR_RIGHT);
				}
			}
			break;
		case PIPE_CURVE_D:			//向下的水管,可以从下、左两方进水或出水
			{
				switch(nDir){
				case IN_DIR_DOWN:
					return isLink(col - 1, row, OUT_DIR_LEFT);
				case IN_DIR_LEFT:
					return isLink(col, row + 1, OUT_DIR_DOWN);
				}
			}
			break;
		case PIPE_CURVE_L:			//向左的水管,可以从左、上两方进水或出水
			{
				switch(nDir){
				case IN_DIR_LEFT:
					return isLink(col, row - 1, OUT_DIR_UP);
				case IN_DIR_UP:
					return isLink(col - 1, row, OUT_DIR_LEFT);
				}
			}
			break;
		case PIPE_LINE_H:			//横向的水管,可以从左、右两方进水或出水
			{
				switch(nDir){
				case IN_DIR_LEFT:
					return isLink(col + 1, row, OUT_DIR_RIGHT);
				case IN_DIR_RIGHT:
					return isLink(col - 1, row, OUT_DIR_LEFT);
				}
			}
			break;
		case PIPE_LINE_V:			//纵向的水管,可以从上、下两方进水或出水
			{
				switch(nDir){
				case IN_DIR_UP:
					return isLink(col, row + 1, OUT_DIR_DOWN);
				case IN_DIR_DOWN:
					return isLink(col, row - 1, OUT_DIR_UP);
				}
			}
			break;
		}
		return false;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -