📄 pipe.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 + -