资源描述
运行出来效果如下:
MainActivity:
package games.llk;
import android.app.Activity;
import android.os.Bundle;
public class Main extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.main);
setContentView(new GameView(this));
}
}
GameView:
package games.llk;
import java.util.Random;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.Rect;
import android.graphics.Bitmap.Config;
import android.os.Handler;
import android.view.MotionEvent;
import android.view.View;
public class GameView extends View {
private int m_w;
private int m_h;
private int top_client;
private int right_client;
private int bottom_client;
private int left_client;
private Rect client_r;
private Paint p_client_r;
private boolean display_moreInfo;
private boolean isInited;
private Paint p;
private Paint p_line;
private Paint p_line_2;
private Paint p_text;
private Paint p_pross_b;
private Paint p_pross;
private int point_w;
private int point_h;
private Rect btn_r_1;
private Rect btn_r_2;
private Rect btn_r_close;
private Bitmap bmp_btn;
private Rect pross_r;
private Rect pross_r_2;
private Rect t_r;
private Rect t_r_2;
private boolean ispause=false;
private boolean isstart=false;
private String s_pause="暂停中。";
private Bitmap buff;
private Bitmap bmp_point;
private Bitmap bmp_hint;
private Canvas buff_Canvas;
private int flevel ;
private int ffen =0;
private int timecount=0;
private int timecountper_l = 480;
private boolean isdrawing=false ;
private Random random=new Random();
private Resources res;
private Point[] pointlist_tmp ;
private int pointlist_tmp_count=0;
private RefreshHandler mRedrawHandler = new RefreshHandler();
private Point mousept ;
private Point lastpt ;
private Point hintpt_1 ;
private Point hintpt_2 ;
private boolean isontimering=false;
private boolean isonmousedown=false;
private int ontimercount=0;
class RefreshHandler extends Handler
{
@Override
public void handleMessage(android.os.Message msg)
{
GameView.this.ontimer();
nexttimer(240);
}
public void nexttimer( long delayMillis)
{
this.removeMessages(0);
sendMessageDelayed(obtainMessage(0), delayMillis);
}
};
private Pointlist fpointlist =new Pointlist();
class Pointlist
{
private int fxcount;
private int fycount;
private int [] l1;
private int [] l2;
private PointData [][] fpointreclist;
class PointData
{
public int x;
public int y;
public boolean value;
public Object data;
public Rect rect;
public int stat;
public int imgidx;
}
private Point [] plist_1;
private int plist_1_len;
private Point [] plist_2;
private int plist_2_len;
private Point [] pathlist;
public int pcount =0;
public void init(int xcount, int ycount)
{
fxcount=xcount;
fycount=ycount;
fpointreclist=new PointData[fxcount+2][fycount+2];
for (int x_i = 0; x_i < fpointreclist.length; x_i++)
{
for (int y_i = 0; y_i < fpointreclist[x_i].length; y_i++)
{
fpointreclist[x_i][y_i]=new PointData();
fpointreclist[x_i][y_i].x=x_i;
fpointreclist[x_i][y_i].y=y_i;
fpointreclist[x_i][y_i].value=false;
fpointreclist[x_i][y_i].data=null;
fpointreclist[x_i][y_i].rect=new Rect(0,0,0,0);
fpointreclist[x_i][y_i].stat=-1;
fpointreclist[x_i][y_i].imgidx=-1;
}
}
plist_1=new Point[(fxcount+fycount+2)*4];
for (int i = 0; i < plist_1.length; i++)
{
plist_1[i]=new Point(0,0);
}
plist_1_len=0;
plist_2=new Point[(fxcount+fycount+2)*4];
for (int i = 0; i < plist_2.length; i++)
{
plist_2[i]=new Point(0,0);
}
plist_2_len=0;
pathlist=new Point[2];
for (int i = 0; i < pathlist.length; i++)
{
pathlist[i]=new Point(0,0);
}
l1=new int[fxcount*2];
l2=new int[fxcount*2];
}
public void setValue(int x,int y,Boolean value)
{
fpointreclist[x][y].value = value;
}
public boolean getValue(int x,int y)
{
return fpointreclist[x][y].value ;
}
public void setData(int x,int y,Object data)
{
fpointreclist[x][y].data = data;
}
public void setrect(int x,int y,Rect r)
{
fpointreclist[x][y].rect.left = r.left;
fpointreclist[x][y].rect.top = r.top;
fpointreclist[x][y].rect.right = r.right;
fpointreclist[x][y].rect.bottom = r.bottom;
}
public Rect getrect(int x,int y)
{
return fpointreclist[x][y].rect;
}
public void setstat(int x,int y,int v)
{
fpointreclist[x][y].stat=v;
}
public int getstat(int x,int y)
{
return fpointreclist[x][y].stat;
}
public void setimgidx(int x,int y,int v)
{
fpointreclist[x][y].imgidx=v;
}
public int getimgidx(int x,int y)
{
return fpointreclist[x][y].imgidx;
}
public boolean checkpp(Point p1,Point p2)
{
boolean result=false;
if ((p1.x == p2.x) && (p1.y == p2.y))
{
return true;
}
if (p1.y == p2.y)
{
int x1 = p1.x < p2.x?p1.x:p2.x;
int x2 = p1.x > p2.x?p1.x:p2.x;
for (int i=x1+1 ;i<=x2-1;i++)
{
if (fpointreclist[i][p1.y].value )
{
return false;
}
}
result = true;
}
if (p1.x == p2.x)
{
int y1 = p1.y < p2.y?p1.y:p2.y;
int y2 = p1.y > p2.y?p1.y:p2.y;
for (int i=y1+1 ;i<=y2-1;i++)
{
if (fpointreclist[p1.x][i].value )
{
return false;
}
}
result = true;
}
return result;
}
public void mousetoxy(int x,int y ,Point pt)
{
for (int x_i = 1; x_i <= fxcount; x_i++)
{
for (int y_i = 1; y_i <= fycount; y_i++)
{
if (fpointreclist[x_i][y_i].rect.contains(x,y)){
pt.x=x_i;
pt.y=y_i;
return;
}
}
}
pt.x=-1;
pt.y=-1;
}
public boolean isallok()
{
for (int x_i = 1; x_i <= fxcount; x_i++)
{
for (int y_i = 1; y_i <= fycount; y_i++)
{
if (fpointreclist[x_i][y_i].stat>=0){
return false;
}
}
}
return true;
}
public void changeplace(int v)
{
int idx=0;
if ( (v == 2)|| (v == 6))
{
for (int i = 1 ;i<=fxcount;i++ )
{
idx = 0;
for (int j = 1 ;j<= fycount ;j++)
{
if (getstat(i, j) >= 0 )
{
idx=idx+1;
l1[idx] = getimgidx(i, j);
l2[idx] = getstat(i, j);
}
}
for (int j = 1 ;j<=fycount;j++)
{
if (j > idx)
{
setimgidx(i, j, -1);
setstat(i, j, -1);
setValue(i, j, false);
}
else
{
setimgidx(i, j, l1[j]);
setstat(i, j, l2[j]);
setValue(i, j, true);
}
}
}
}
if ( (v == 3)|| (v == 7))
{
for (int i = 1 ;i<=fxcount;i++ )
{
idx = fycount+1;
for (int j = fycount ;j>=1 ;j--)
{
if (getstat(i, j) >= 0 )
{
idx=idx-1;
l1[idx] = getimgidx(i, j);
l2[idx] = getstat(i, j);
}
}
for (int j = fycount ;j>=1;j--)
{
if (j < idx)
{
setimgidx(i, j, -1);
setstat(i, j, -1);
setValue(i, j, false);
}
else
{
setimgidx(i, j, l1[j]);
setstat(i, j, l2[j]);
setValue(i, j, true);
}
}
}
}
if( (v == 4)|| (v == 8))
{
for (int j = 1 ;j<= fycount ;j++)
{
idx = 0;
for (int i = 1 ;i<=fxcount;i++ )
{
if (getstat(i, j) >= 0 )
{
idx=idx+1;
l1[idx] = getimgidx(i, j);
l2[idx] = getstat(i, j);
}
}
for (int i = 1 ;i<=fxcount;i++ )
{
if (i > idx)
{
setimgidx(i, j, -1);
setstat(i, j, -1);
setValue(i, j, false);
}
else
{
setimgidx(i, j, l1[i]);
setstat(i, j, l2[i]);
setValue(i, j, true);
}
}
}
}
if ( (v == 5)|| (v == 9))
{
for (int j = 1 ;j<= fycount ;j++)
{
idx = fxcount+1;
for (int i = fxcount ;i>=1;i-- )
{
if (getstat(i, j) >= 0 )
{
idx=idx-1;
l1[idx] = getimgidx(i, j);
l2[idx] = getstat(i, j);
}
}
for (int i = fxcount ;i>=1;i-- )
{
if (i < idx)
{
setimgidx(i, j, -1);
setstat(i, j, -1);
setValue(i, j, false);
}
else
{
setimgidx(i, j, l1[i]);
setstat(i, j, l2[i]);
setValue(i, j, true);
}
}
}
}
}
public void findstat(int v ,Point pt)
{
for (int x_i = 0; x_i < fpointreclist.length; x_i++)
{
for (int y_i = 0; y_i < fpointreclist[x_i].length; y_i++)
{
if (fpointreclist[x_i][y_i].stat==v){
pt.x=x_i;
pt.y=y_i;
return;
}
}
}
pt.x=-1;
pt.y=-1;
}
public boolean getpath(int x1,int y1, int x2,int y2)
{
boolean result=false;
pcount=0;
if ((x1 == x2) && (y1 == y2))
{
return false;
}
plist_1[0].x=x1;
plist_1[0].y=y1;
plist_1_len=1;
plist_2[0].x=x2;
plist_2[0].y=y2;
plist_2_len=1;
int x;
int y;
for (int i = y1 - 1;i>=0;i--)
{
x = x1;
y = i;
if (fpointreclist[x][y].value)
{
break;
}
else
{
plist_1[plist_1_len].x = x;
plist_1[plist_1_len].y = y;
plist_1_len=plist_1_len+1;
}
}
for (int i = y1 + 1;i<=fycount + 1;i++)
{
x = x1;
y = i;
if( fpointreclist[x][y].value )
{
break;
}
else
{
plist_1[plist_1_len].x = x;
plist_1[plist_1_len].y = y;
plist_1_len=plist_1_len+1;
}
}
for (int i = x1 - 1;i>=0;i--)
{
x = i;
y = y1;
if (fpointreclist[x][y].value )
{
break;
}
else
{
plist_1[plist_1_len].x = x;
plist_1[plist_1_len].y = y;
plist_1_len=plist_1_len+1;
}
}
for (int i = x1 + 1 ;i<= fxcount + 1;i++)
{
x = i;
y = y1;
if ( fpointreclist[x][y].value)
{
break;
}
else
{
plist_1[plist_1_len].x = x;
plist_1[plist_1_len].y = y;
plist_1_len=plist_1_len+1;
}
}
for (int i = y2 - 1;i>= 0;i-- )
{
x = x2;
y = i;
if (fpointreclist[x][y].value )
{
break;
}
else
{
plist_2[plist_2_len].x = x;
plist_2[plist_2_len].y = y;
plist_2_len=plist_2_len+1;
}
}
for( int i = y2 + 1 ;i<= fycount + 1 ;i++)
{
x = x2;
y = i;
if (fpointreclist[x][y].value )
{
break;
}
else
{
plist_2[plist_2_len].x = x;
plist_2[plist_2_len].y = y;
plist_2_len=plist_2_len+1;
}
}
for (int i = x2 - 1 ;i>= 0 ;i--)
{
x = i;
y = y2;
if (fpointreclist[x][y].value )
{
break;
}
else
{
plist_2[plist_2_len].x = x;
plist_2[plist_2_len].y = y;
plist_2_len=plist_2_len+1;
}
}
for (int i = x2 + 1 ;i<= fxcount + 1;i++)
{
x = i;
y = y2;
if (fpointreclist[x][y].value)
{
break;
}
else
{
plist_2[plist_2_len].x = x;
plist_2[plist_2_len].y = y;
plist_2_len=plist_2_len+1;
}
}
pcount = 0;
for (int i = 0 ;i< plist_1_len;i++)
{
for (int j = 0 ;j< plist_2_len;j++)
{
if (checkpp(plist_1[i], plist_2[j]))
{
result = true;
if (i > 0)
{
pathlist[pcount].x = plist_1[i].x;
pathlist[pcount].y = plist_1[i].y;
pcount=pcount+1;
}
if (j > 0)
{
展开阅读全文