老规矩。右键取得显示不出来的图片地址,利用下载工具下载这个图片。后缀改为rar即可得到源代码项目。
main
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));
}
}
view
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 isοnmοusedοwn=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)
{
pathlist[pcount].x = plist_2[j].x;
pathlist[pcount].y = plist_2[j].y;
pcount=pcount+1;
}
return result;
}
}
}
return result;
}
private boolean getPHint(Point p1,Point p2)
{
for (int i_1 = 1 ; i_1<=fxcount;i_1++ )
{
for (int j_1 = 1 ;j_1<=fycount; j_1++ )
{
p1.x = i_1;
p1.y = j_1;
if (getimgidx(p1.x, p1.y) < 0 )
continue;
if (getstat(p1.x, p1.y) < 0 )
continue;
for (int i_2 = i_1 ;i_2<=fxcount;i_2++ )
{
for (int j_2 = 1 ;j_2<=fycount;j_2++ )
{
if ((i_2 == i_1) && (j_2 <= j_1) )
continue;
p2.x= i_2;
p2.y= j_2;
if (getimgidx(p2.x, p2.y) < 0 )
continue;
if (getstat(p2.x, p2.y) < 0 )
continue;
if (getimgidx(p1.x, p1.y) != getimgidx(p2.x, p2.y))
continue;
if ( getpath(p1.x, p1.y, p2.x, p2.y) )
{
return true;
}
}
}
}
}
p1.x=-1;
p1.y=-1;
p2.x=-1;
p2.y=-1;
return false;
}
}
public GameView(Context context) {
super(context);
display_moreInfo=false;
// TODO Auto-generated constructor stub
mousept= new Point(0,0);
lastpt =new Point(0,0);
p=new Paint();
p_line=new Paint();
p_line.setARGB(255, 255, 0, 0);
p_line_2=new Paint();
p_line_2.setARGB(255, 0, 0, 255);
p_text=new Paint();
p_text.setARGB(255, 0, 0, 0);
p_text.setTextSize(13);
p_text.setFlags(Paint.ANTI_ALIAS_FLAG);
p_pross_b=new Paint();
p_pross_b.setARGB(255, 210, 210, 210);
p_pross=new Paint();
p_pross.setARGB(255, 0, 0, 210);
p_client_r=new Paint();
p_client_r.setARGB(255, 255, 255, 255);
hintpt_1=new Point(-1,-1);
hintpt_2=new Point(-1,-1);
res =context.getResources();
isInited=false;
setFocusable(true);
}
public void ontimer()
{
if (isontimering)
{
return;
}
if (isonmousedown)
{
return;
}
isontimering=true;
if ((isstart)&&(! ispause))
{
if (timecount>0)
{
timecount=timecount-1;
}
else
{
beginlevel(flevel);
}
}
if (ontimercount>0 )
{
ontimercount=ontimercount-1;
}
if(ontimercount<=0)
{
drawall();
invalidate();
ontimercount=10;
}
isontimering=false;
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
canvas.drawBitmap(buff, 1, 1, p);
}
@Override
protected void onLayout(boolean changed, int left, int top, int right,
int bottom) {
// TODO Auto-generated method stub
super.onLayout(changed, left, top, right, bottom);
init(right-left,bottom-top);
}
private void drawblank()
{
buff_Canvas.drawRect(client_r, p_client_r);
}
private void drawtext()
{
buff_Canvas.drawBitmap(bmp_btn,btn_r_1.left,btn_r_1.top, p);
if (!isstart)
{
buff_Canvas.drawText("开始", btn_r_1.left+14, btn_r_1.top+14,p_text);
}
else
{
if (ispause )
{
buff_Canvas.drawText("继续", btn_r_1.left+14, btn_r_1.top+14,p_text);
buff_Canvas.drawText(s_pause, left_client, top_client+20,p_text);
}
else
{
buff_Canvas.drawText("暂停", btn_r_1.left+14, btn_r_1.top+14,p_text);
}
}
buff_Canvas.drawRect (t_r, p_client_r);
buff_Canvas.drawRect (t_r_2, p_client_r);
buff_Canvas.drawText("级数:"+String.valueOf(flevel), t_r.left,t_r.bottom,p_text);
buff_Canvas.drawText("分数:"+String.valueOf(ffen), t_r_2.left,t_r_2.bottom,p_text);
}
private void drawpross()
{
buff_Canvas.drawRect (pross_r, p_client_r);
buff_Canvas.drawLine(pross_r.left, pross_r.top, pross_r.right, pross_r.top, p_pross_b);
buff_Canvas.drawLine(pross_r.right, pross_r.top, pross_r.right, pross_r.bottom, p_pross_b);
buff_Canvas.drawLine(pross_r.right, pross_r.bottom, pross_r.left, pross_r.bottom, p_pross_b);
buff_Canvas.drawLine(pross_r.left, pross_r.bottom, pross_r.left, pross_r.top, p_pross_b);
pross_r_2.right=pross_r_2.left+(pross_r.right-pross_r.left-1)*timecount/timecountper_l;
buff_Canvas.drawRect (pross_r_2, p_pross);
}
private void drawpoint()
{
Rect dst_r;
Rect src_r=new Rect(0,0,0,0);
for ( int i = 1;i<=fpointlist.fxcount ;i++)
{
for( int j = 1;j<=fpointlist.fycount;j++ )
{
if ( fpointlist.getstat(i, j) < 0 )
continue;
if (fpointlist.getimgidx(i, j) < 0 )
continue;
dst_r = fpointlist.getrect(i, j);
getbmp_pointRect(fpointlist.getimgidx(i, j), fpointlist.getstat(i, j),src_r );
buff_Canvas.drawBitmap(bmp_point, src_r, dst_r, p);
if (((hintpt_1.x==i)&&(hintpt_1.y==j))||((hintpt_2.x==i)&&(hintpt_2.y==j)))
{
buff_Canvas.drawBitmap(bmp_hint,dst_r.left+10, dst_r.bottom-40,p);
}
}
}
}
private void drawall()
{ if (isdrawing)
{
return;
}
isdrawing=true;
drawblank();
drawtext();
drawpross();
if (isstart)
{
if (!ispause)
{
drawpoint();
//drawPointForHint;
//drawPointForMouse;
}
else
{
buff_Canvas.drawText("程序制作:H&J", left_client, bottom_client-50,p_text);
buff_Canvas.drawText("email:hjsoft2006@sohu.com", left_client, bottom_client-30,p_text);
buff_Canvas.drawText("QQ:253377572", left_client, bottom_client-10,p_text);
}
}
else
{
buff_Canvas.drawText("程序制作:H&J", left_client, bottom_client-50,p_text);
buff_Canvas.drawText("email:hjsoft2006@sohu.com", left_client, bottom_client-30,p_text);
buff_Canvas.drawText("QQ:253377572", left_client, bottom_client-10,p_text);
}
if (display_moreInfo)
{
String s=String.valueOf(m_w)+"*"+String.valueOf(m_h);
p.setARGB(255, 0, 0, 255);
buff_Canvas.drawText(s, 1, 50,p_text);
s=String.valueOf(System.currentTimeMillis());
buff_Canvas.drawText(s, 1, 100,p_text);
}
isdrawing=false;
}
private void getbmp_pointRect(int idx,int stat,Rect r)
{
r.left = 0 + (point_w) * stat;
r.right = r.left + point_w;
r.top = 0 + (point_h) * idx;
r.bottom = r.top + point_h;
}
private void init(int w,int h)
{
if (isInited)
{
return;
}
isInited=true;
m_w=w;
m_h=h;
if (buff!=null)
{
buff=null;
}
Bitmap b_ground;
int topleft_w=0;
int topleft_h=0;
int topright_w=0;
int topright_h=0;
int bottomleft_w=0;
int bottomleft_h=0;
int bottomright_w=0;
int bottomright_h=0;
int btn_left=0;
Rect src = null;
Rect dst=null;
Config config=Config.RGB_565;
buff=Bitmap.createBitmap(m_w, m_h, config);
buff_Canvas =new Canvas(buff);
b_ground=Bitmap.createBitmap(m_w, m_h, config);
Canvas b_ground_Canvas=new Canvas(b_ground);
Bitmap tmp= BitmapFactory.decodeResource(res, R.drawable.topleft);
Paint tmppaint=new Paint();
b_ground_Canvas.drawBitmap(tmp, 0, 0, tmppaint);
topleft_w=tmp.getWidth();
topleft_h=tmp.getHeight();
btn_left=topleft_w-1;
tmp=null;
tmp=BitmapFactory.decodeResource(res, R.drawable.topright);
topright_w=tmp.getWidth();
topright_h=tmp.getHeight();
b_ground_Canvas.drawBitmap(tmp,m_w-topright_w, 0, tmppaint);
btn_r_close=new Rect(m_w-topright_w+18,12,m_w-topright_w+33,28);
tmp=null;
tmp=BitmapFactory.decodeResource(res, R.drawable.top);
src=new Rect(0,0,tmp.getWidth(),tmp.getHeight());
dst=new Rect(topleft_w,0,m_w-topright_w,tmp.getHeight());
b_ground_Canvas.drawBitmap(tmp,src,dst, tmppaint);
top_client=tmp.getHeight();
tmp=null;
tmp=BitmapFactory.decodeResource(res, R.drawable.bottomleft);
bottomleft_w=tmp.getWidth();
bottomleft_h=tmp.getHeight();
b_ground_Canvas.drawBitmap(tmp, 0, m_h-bottomleft_h, tmppaint);
tmp=null;
tmp=BitmapFactory.decodeResource(res, R.drawable.bottomright);
bottomright_w=tmp.getWidth();
bottomright_h=tmp.getHeight();
b_ground_Canvas.drawBitmap(tmp, m_w-bottomright_w, m_h-bottomright_h, tmppaint);
tmp=null;
tmp=BitmapFactory.decodeResource(res, R.drawable.bottom);
src=new Rect(0,0,tmp.getWidth(),tmp.getHeight());
dst=new Rect(bottomleft_w,m_h-tmp.getHeight(),m_w-bottomright_w,m_h);
b_ground_Canvas.drawBitmap(tmp,src,dst, tmppaint);
bottom_client=m_h-tmp.getHeight();
tmp=null;
tmp=BitmapFactory.decodeResource(res, R.drawable.left);
src=new Rect(0,0,tmp.getWidth(),tmp.getHeight());
dst=new Rect(0,topleft_h,tmp.getWidth(),m_h-bottomleft_h);
b_ground_Canvas.drawBitmap(tmp,src,dst, tmppaint);
left_client=tmp.getWidth();
tmp=null;
tmp=BitmapFactory.decodeResource(res, R.drawable.right);
src=new Rect(0,0,tmp.getWidth(),tmp.getHeight());
dst=new Rect(m_w-tmp.getWidth(),topright_h,m_w,m_h-bottomright_h);
b_ground_Canvas.drawBitmap(tmp,src,dst, tmppaint);
right_client=m_w-tmp.getWidth();
tmp=null;
bmp_btn=BitmapFactory.decodeResource(res, R.drawable.btn);
tmp=BitmapFactory.decodeResource(res, R.drawable.btn);
src=new Rect(0,0,tmp.getWidth(),tmp.getHeight());
btn_left=btn_left-2;
btn_r_1 =new Rect(btn_left,15,btn_left+tmp.getWidth(),15+tmp.getHeight());
b_ground_Canvas.drawBitmap(tmp,src,btn_r_1, tmppaint);
btn_left=btn_r_1.right;
tmp=null;
tmp=BitmapFactory.decodeResource(res, R.drawable.btn);
src=new Rect(0,0,tmp.getWidth(),tmp.getHeight());
btn_left=btn_left-1;
btn_r_2 =new Rect(btn_left,15,btn_left+tmp.getWidth(),15+tmp.getHeight());
b_ground_Canvas.drawBitmap(tmp,src,btn_r_2, tmppaint);
client_r=new Rect(left_client,top_client,right_client,bottom_client);
pross_r=new Rect(left_client-1,top_client-15,right_client-140,top_client-4);
pross_r_2=new Rect(pross_r.left+1,pross_r.top+1,pross_r.right-1,pross_r.bottom);
t_r=new Rect(pross_r.right+5,pross_r.top-2,pross_r.right+55,pross_r.bottom);
t_r_2=new Rect(t_r.right+5,pross_r.top-2,right_client+10,pross_r.bottom);
point_w=45;
point_h=51;
int w_client= right_client-left_client;
w_client= w_client / point_w;
int h_client= bottom_client-top_client;
h_client=h_client / point_h;
if (w_client * h_client %2==1)
{
h_client=h_client-1;
}
fpointlist.init(w_client, h_client);
pointlist_tmp=new Point[w_client*h_client];
for (int i=0 ;i<w_client*h_client;i++)
{
pointlist_tmp[i]=new Point(0,0);
}
int x0 =left_client + ((right_client-left_client)-(point_w*w_client))/2+1;
int y0 =top_client + ((bottom_client-top_client)-(point_h*h_client))/2+1;
Rect r=new Rect(0,0,0,0);
for (int i = 1; i<= w_client;i++ )
{
for ( int j = 1 ;j<=h_client;j++ )
{
r.top = y0 + (j - 1) * point_h;
r.bottom = r.top + point_h;
r.left = x0 + (i - 1) * point_w;
r.right = r.left + point_w;
fpointlist.setrect(i,j, r);
fpointlist.setstat(i, j, -1);
fpointlist.setimgidx(i, j, -1);
}
}
Rect r_tmp;
for (int i = 1; i<= w_client;i++ )
{
r_tmp= fpointlist.getrect(i, 1);
r.top=r_tmp.top-1-(r_tmp.bottom-r_tmp.top);
r.bottom=r_tmp.top-1;
r.left=r_tmp.left;
r.right=r_tmp.right;
fpointlist.setrect(i,0, r);
fpointlist.setstat(i,0, -1);
fpointlist.setimgidx(i, 0, -1);
r_tmp= fpointlist.getrect(i, h_client);
r.bottom=r_tmp.bottom+1+(r_tmp.bottom-r_tmp.top);
r.top=r_tmp.bottom+1;
r.left=r_tmp.left;
r.right=r_tmp.right;
fpointlist.setrect(i,h_client+1, r);
fpointlist.setstat(i, h_client+1, -1);
fpointlist.setimgidx(i, h_client+1, -1);
}
for ( int j = 0 ;j<=h_client+1;j++ )
{
r_tmp= fpointlist.getrect(1, j);
r.left=r_tmp.left-1-(r_tmp.right-r_tmp.left);
r.right=r_tmp.left-1;
r.top=r_tmp.top;
r.bottom=r_tmp.bottom;
fpointlist.setrect(0,j, r);
fpointlist.setstat(0,j, -1);
fpointlist.setimgidx(0,j, -1);
r_tmp= fpointlist.getrect(w_client, j);
r.right=r_tmp.right+1+(r_tmp.right-r_tmp.left);
r.left=r_tmp.right+1;
r.top=r_tmp.top;
r.bottom=r_tmp.bottom;
fpointlist.setrect(w_client+1,j, r);
fpointlist.setstat(w_client+1,j, -1);
fpointlist.setimgidx(w_client+1,j, -1);
}
bmp_point=BitmapFactory.decodeResource(res, R.drawable.point);
bmp_hint=BitmapFactory.decodeResource(res, R.drawable.hint);
buff_Canvas.drawBitmap(b_ground, 0, 0, tmppaint);
buff_Canvas.drawText("提示", btn_r_2.left+14, btn_r_2.top+14,p_text);
mRedrawHandler.nexttimer(500);
b_ground=null;
//System.gc();
}
private void setispause (boolean v)
{
ispause = v;
if (ispause)
{
//RzBitBtn_pause.Caption := '继续';
}
else
{
//RzBitBtn_pause.Caption := '暂停';
}
}
private void setimgidx(int imgidx){
int idx = random.nextInt(pointlist_tmp_count) % pointlist_tmp_count;
fpointlist.setimgidx(pointlist_tmp[idx].x, pointlist_tmp[idx].y, imgidx);
fpointlist.setstat(pointlist_tmp[idx].x, pointlist_tmp[idx].y, 0);
fpointlist.setValue(pointlist_tmp[idx].x, pointlist_tmp[idx].y, true);
for (int i=idx;i<pointlist_tmp_count-1;i++)
{
pointlist_tmp[i].x=pointlist_tmp[i+1].x;
pointlist_tmp[i].y=pointlist_tmp[i+1].y;
}
pointlist_tmp_count=pointlist_tmp_count-1;
}
private void beginlevel(int l)
{
if (l >= 10 )
{
flevel = 1;
}
else
{
flevel = l;
}
setispause(false);
// mouesePoint := Point(-1, -1);
// clearFHintPoint
hintpt_1.x=-1;
hintpt_1.y=-1;
hintpt_2.x=-1;
hintpt_2.y=-1;
int idx=0;
for(int x =1 ;x<=fpointlist.fxcount;x++)
{
for(int y =1 ;y<=fpointlist.fycount;y++)
{
pointlist_tmp[idx].x=x;
pointlist_tmp[idx].y=y;
idx=idx+1;
}
}
pointlist_tmp_count=idx;
int imgcount= 16 + flevel * 2;
int imgidx=0;
for (int i = 1;i<= fpointlist.fxcount * fpointlist.fycount /2;i++){
imgidx = random.nextInt(imgcount)% imgcount;
setimgidx(imgidx);
setimgidx(imgidx);
}
timecount = timecountper_l;
isstart=true;
drawall();
invalidate();
}
private void changecolor()
{
for (int k=0; k<10;k++)
{
int idx=0;
for(int x =1 ;x<=fpointlist.fxcount;x++)
{
for(int y =1 ;y<=fpointlist.fycount;y++)
{
if ((fpointlist.getstat(x, y)>=0)&& (fpointlist.getValue(x, y)==true) && (fpointlist.getimgidx(x, y)>=0))
{
pointlist_tmp[idx].x=x;
pointlist_tmp[idx].y=y;
idx=idx+1;
}
}
}
pointlist_tmp_count=idx;
int imgcount= 16 + flevel * 2;
int imgidx=0;
int c=pointlist_tmp_count/2;
for (int i = 1;i<= c;i++){
imgidx = random.nextInt(imgcount)% imgcount;
setimgidx(imgidx);
setimgidx(imgidx);
}
if (fpointlist.getPHint(hintpt_1,hintpt_2))
{
break;
}
}
}
private void dobtn_1()
{
if (isstart )
{
if (ispause)
{
setispause(false);
}
else
{
setispause(true);
}
}
else
{
beginlevel(1);
}
}
private void dobtn_2()
{
if (ffen>200)
{
ffen=ffen-200;
}
if (!fpointlist.getPHint(hintpt_1,hintpt_2))
{
hintpt_1.x=-1;
hintpt_1.y=-1;
hintpt_2.x=-1;
hintpt_1.y=-1;
changecolor();
ontimercount=1;
}
else
{
// changecolor();
ontimercount=1;
if ( timecount>80 )
{
timecount=timecount-80;
}
else
{
timecount=40;
}
}
}
private int changtor_x(int x,Rect r)
{
if (x<r.left+2)
{
return r.left+2;
}
if (x>r.right-2)
{
return r.right-2;
}
return x;
}
private int changtor_y(int y,Rect r)
{
if (y<r.top+2)
{
return r.top+2;
}
if (y>r.bottom-2)
{
return r.bottom-2;
}
return y;
}
private void drawlinerect(Point p1,Point p2){
Rect r1 = fpointlist.getrect(p1.x, p1.y);
Rect r2 = fpointlist.getrect(p2.x, p2.y);
int x1=changtor_x((r1.left+r1.right)/2,client_r);
int y1=changtor_y((r1.top+r1.bottom)/2,client_r);
int x2=changtor_x((r2.left+r2.right)/2,client_r);
int y2=changtor_y((r2.top+r2.bottom)/2,client_r);
buff_Canvas.drawLine(x1,y1 ,x2 ,y2 , p_line);
if (x1==x2)
{
buff_Canvas.drawLine(x1-1,y1 ,x2-1 ,y2 , p_line);
buff_Canvas.drawLine(x1+1,y1 ,x2+1 ,y2, p_line);
}
if (y1==y2)
{
buff_Canvas.drawLine(x1,y1-1 ,x2 ,y2-1 , p_line);
buff_Canvas.drawLine(x1,y1+1 ,x2 ,y2+1, p_line);
}
}
private void dopoint(){
if (fpointlist.getstat(mousept.x, mousept.y)<0){
return;
}
fpointlist.findstat(1,lastpt);
if (lastpt.x>=0)
{
fpointlist.setstat(lastpt.x, lastpt.y, 0);
}
if ( fpointlist.getstat(mousept.x, mousept.y)>= 0 )
{
fpointlist.setstat(mousept.x, mousept.y, 1);
}
hintpt_1.x=-1;
hintpt_1.y=-1;
hintpt_2.x=-1;
hintpt_2.y=-1;
drawpoint();
if ((lastpt.x >= 0) && ((lastpt.x != mousept.x) || (lastpt.y != mousept.y)))
{
int lastimgidx = fpointlist.getimgidx(lastpt.x, lastpt.y);
if ((fpointlist.getstat(mousept.x, mousept.y) >= 0) && (fpointlist.getstat(lastpt.x, lastpt.y)>= 0) && (lastimgidx >= 0) && (lastimgidx == fpointlist.getimgidx(mousept.x, mousept.y)) )
{
if (fpointlist.getpath(lastpt.x, lastpt.y, mousept.x, mousept.y) )
{
ffen=ffen+100;
if (timecount < timecountper_l - 40 )
{
timecount =timecount+40;
}
else
{
timecount = timecountper_l;
}
if (fpointlist.pcount==0)
{
drawlinerect(lastpt,mousept);
}
if (fpointlist.pcount==1)
{
drawlinerect(lastpt,fpointlist.pathlist[0]);
drawlinerect(fpointlist.pathlist[0],mousept);
}
if (fpointlist.pcount==2)
{
drawlinerect(lastpt,fpointlist.pathlist[0]);
drawlinerect(fpointlist.pathlist[0],fpointlist.pathlist[1]);
drawlinerect(fpointlist.pathlist[1],mousept);
}
fpointlist.setstat(lastpt.x, lastpt.y,-1);
fpointlist.setstat(mousept.x, mousept.y,-1);
fpointlist.setValue(lastpt.x, lastpt.y,false);
fpointlist.setValue(mousept.x, mousept.y,false);
ontimercount=3;
if (fpointlist.isallok())
{
timecount = timecountper_l;
beginlevel(flevel + 1);
}
else
{
fpointlist.changeplace(flevel);
}
}
}
}
invalidate();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
if (isonmousedown )
return super.onTouchEvent(event);
isontimering=true;
isοnmοusedοwn=true;
if (event.getAction() == MotionEvent. ACTION_DOWN ) {
int ax = ( int ) event.getX();
int ay = ( int ) event.getY();
if ( btn_r_close .contains(ax, ay)) {
android.os.Process.killProcess(android.os.Process.myPid());
}
if ( btn_r_1 .contains(ax, ay)) {
dobtn_1();
}
if ( btn_r_2 .contains(ax, ay)) {
dobtn_2();
}
if ( client_r .contains(ax, ay)) {
fpointlist.mousetoxy(ax, ay, mousept);
if (mousept.x>=1)
{
dopoint();
}
}
}
isοnmοusedοwn=false;
isontimering=false;
return super.onTouchEvent(event);
}
}