?? pipe.java
字號:
package demo;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.TiledLayer;
public class Pipe {
//水管種類數(shù)值,與tile編號對應(yīng)
public static final int PIPE_END = 1; //終點(diǎn)水管
public static final int PIPE_START = 2; //起點(diǎn)水管
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; //起點(diǎn)水管的行數(shù),列數(shù)固定為0
private int m_nEndRow = 5; //終點(diǎn)水管的行數(shù),列數(shù)固定為7
private TiledLayer m_TLayer; //水管Tile圖像
private int m_nCurCol = 2; //當(dāng)前選擇的列
private int m_nCurRow = 2; //當(dāng)前選擇的行
//構(gòu)造方法,參數(shù)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){}
}
//重新設(shè)置水管
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] );
}
}
//設(shè)置起點(diǎn)水管
m_TLayer.setCell(0, m_nStartRow, 2);
//設(shè)置終點(diǎn)水管
m_TLayer.setCell(m_TLayer.getColumns()-1, m_nEndRow, 1);
}
//獲取當(dāng)前選擇的列數(shù)
public int getCurCol(){
return m_nCurCol;
}
//獲取當(dāng)前選擇的行數(shù)
public int getCurRow(){
return m_nCurRow;
}
//設(shè)置當(dāng)前選擇的位置
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;
}
//顯示水管及當(dāng)前選擇的位置
//參數(shù)g對應(yīng)手機(jī)屏幕
public void Paint(Graphics g){
//顯示水管
m_TLayer.paint(g);
//顯示當(dāng)前選擇位置
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());
}
//旋轉(zhuǎn)水管,參數(shù)col、row分別是被旋轉(zhuǎn)水管的列、行位置
public void rotPipe( int col, int row ){
switch( m_TLayer.getCell( col, row) ){
case PIPE_CURVE_U: //向上的彎形水管旋轉(zhuǎn)后變成向右的彎形水管
m_TLayer.setCell(col, row, PIPE_CURVE_R);
break;
case PIPE_CURVE_R: //向右的彎形水管旋轉(zhuǎn)后變成向下的彎形水管
m_TLayer.setCell(col, row, PIPE_CURVE_D);
break;
case PIPE_CURVE_D: //向下的彎形水管旋轉(zhuǎn)后變成向左的彎形水管
m_TLayer.setCell(col, row, PIPE_CURVE_L);
break;
case PIPE_CURVE_L: //向左的彎形水管旋轉(zhuǎn)后變成向上的彎形水管
m_TLayer.setCell(col, row, PIPE_CURVE_U);
break;
case PIPE_LINE_H: //橫向直線水管旋轉(zhuǎn)后變成縱向直線水管
m_TLayer.setCell(col, row, PIPE_LINE_V);
break;
case PIPE_LINE_V: //縱向直線水管旋轉(zhuǎn)后變成橫向直線水管
m_TLayer.setCell(col, row, PIPE_LINE_H);
break;
}
}
//是否完成了水管的連接
public boolean isFinish(){
return isLink( 0, m_nStartRow, 0 );
}
//定義水管的進(jìn)水方向,即連接方向
public static final int IN_DIR_UP = 0; //從上方進(jìn)水
public static final int IN_DIR_RIGHT = 1; //從右方進(jìn)水
public static final int IN_DIR_DOWN = 2; //從下方進(jìn)水
public static final int IN_DIR_LEFT = 3; //從左方進(jìn)水
//從上方出水相當(dāng)于下一個(gè)水管從下方進(jìn)水
public static final int OUT_DIR_UP = IN_DIR_DOWN;
//從右方出水相當(dāng)于下一個(gè)水管從左方進(jìn)水
public static final int OUT_DIR_RIGHT = IN_DIR_LEFT;
//從下方出水相當(dāng)于下一個(gè)水管從上方進(jìn)水
public static final int OUT_DIR_DOWN = IN_DIR_UP;
//從左方出水相當(dāng)于下一個(gè)水管從右方進(jìn)水
public static final int OUT_DIR_LEFT = IN_DIR_RIGHT;
//判斷當(dāng)前水管與周圍的水管是否可以連接
//返回true表示可以,false表示不可以
//參數(shù)col、row分別是當(dāng)前水管的行列數(shù),參數(shù)nDir是進(jìn)水的方向
private boolean isLink( int col, int row, int nDir ){
/******第(1)步,判斷水流是否可以流入當(dāng)前水管*****/
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: //終點(diǎn)水管,只能從左側(cè)進(jìn)水
if( nDir != IN_DIR_LEFT )
return false;
break;
case PIPE_CURVE_U: //向上的水管,可以從上、右兩方進(jìn)水或出水
{
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: //向右的水管,可以從右、下兩方進(jìn)水或出水
{
if( nDir != IN_DIR_RIGHT && nDir != IN_DIR_DOWN )
return false;
}
break;
case PIPE_CURVE_D: //向下的水管,可以從下、左兩方進(jìn)水或出水
{
if( nDir != IN_DIR_DOWN && nDir != IN_DIR_LEFT )
return false;
}
break;
case PIPE_CURVE_L: //向左的水管,可以從左、上兩方進(jìn)水或出水
{
if( nDir != IN_DIR_LEFT && nDir != IN_DIR_UP )
return false;
}
break;
case PIPE_LINE_H: //橫向的水管,可以從左、右兩方進(jìn)水或出水
{
if( nDir != IN_DIR_LEFT && nDir != IN_DIR_RIGHT )
return false;
}
break;
case PIPE_LINE_V: //縱向的水管,可以從上、下兩方進(jìn)水或出水
{
if( nDir != IN_DIR_UP && nDir != IN_DIR_DOWN )
return false;
}
break;
default:
return false;
}
/******第(2)步,判斷當(dāng)前水管是否為出口水管*****/
if( type == PIPE_END )
return true;
/******第(3)步,處理下一個(gè)水管****************/
switch( type ){
case PIPE_START: //起點(diǎn)水管,從右側(cè)出水
return isLink(col + 1, row, OUT_DIR_RIGHT);
case PIPE_CURVE_U: //向上的水管,可以從上、右兩方進(jìn)水或出水
{
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: //向右的水管,可以從右、下兩方進(jìn)水或出水
{
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: //向下的水管,可以從下、左兩方進(jìn)水或出水
{
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: //向左的水管,可以從左、上兩方進(jìn)水或出水
{
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: //橫向的水管,可以從左、右兩方進(jìn)水或出水
{
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: //縱向的水管,可以從上、下兩方進(jìn)水或出水
{
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;
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -