//连连看的算法要判断三个拐点,我的情况是0和1个拐点的时候没问题,2拐点就会卡死,为什么?
public class A17Activity extends Activity {
/** Called when the activity is first created. */
private gameview view;
public static A17Activity instance;
@Override
public void onCreate(Bundle savedInstanceState) {
instance=this;
super.onCreate(savedInstanceState);
//设置全屏
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(new gameview(this));
}
//是不是线程设置的问题呢?
public class A17Activity extends Activity {
/** Called when the activity is first created. */
private gameview view;
public static A17Activity instance;
@Override
public void onCreate(Bundle savedInstanceState) {
instance=this;
super.onCreate(savedInstanceState);
//设置全屏
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(new gameview(this));
}
//是不是线程设置的问题呢?
public class gameview extends SurfaceView implements Callback ,Runnable
{
private SurfaceHolder sfh;
private Resources res=this.getResources();
private Canvas canvas;
private Paint paint;
private Thread th;
private boolean flag;
private boolean flag1=true;
private Bitmap pic[];
private Bitmap pic2[];
//游戏状态
public static final int GameMenu=0,GameIng=1,GamePause=2;
//暂停
public boolean ispause=false,iswin=false,islost=false;
//目前状态
public static int GameState=GameMenu;
//背景图片
private Bitmap bgm,smallbgm;
//按钮图片
private Bitmap start,contin,end;
private Bitmap resume,replay,menu;
//屏幕宽、高
public static float screenW,screenH;
//当前点击的字母
public static int checki,checkj;
private Map map;
//private judgment jum;
private contin hstart,hcontin,hend,hresume,hreplay,hmenu;
private int grade=1;
//地图
private static int[][] thismap;
//地图最左上角
private int leftX=-50,leftY=10;
private Point p1,p2;
private int turn; public gameview(Context context) {
super(context);
sfh=this.getHolder();
sfh.addCallback(this);
paint=new Paint();
paint.setColor(Color.WHITE);
paint.setAntiAlias(true);
setFocusable(true);
setFocusableInTouchMode(true);
//设置背景常亮
this.setKeepScreenOn(true);
}
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
screenW=this.getWidth();
screenH=this.getHeight();
initgame();
flag=true;
th=new Thread(this);
th.start();
}
public void initgame()
{
if(GameState==GameMenu)
{
bgm=BitmapFactory.decodeResource(res, R.drawable.bgm);
smallbgm=BitmapFactory.decodeResource(res, R.drawable.smallbg);
pic=new Bitmap[26];
pic[0]=BitmapFactory.decodeResource(res,R.drawable.a);
pic[1]=BitmapFactory.decodeResource(res,R.drawable.b);
pic[2]=BitmapFactory.decodeResource(res,R.drawable.c);
pic[3]=BitmapFactory.decodeResource(res,R.drawable.d);
pic[4]=BitmapFactory.decodeResource(res,R.drawable.e);
pic[5]=BitmapFactory.decodeResource(res,R.drawable.f);
pic[6]=BitmapFactory.decodeResource(res,R.drawable.g);
pic[7]=BitmapFactory.decodeResource(res,R.drawable.h);
pic[8]=BitmapFactory.decodeResource(res,R.drawable.i);
pic[9]=BitmapFactory.decodeResource(res,R.drawable.j);
pic[10]=BitmapFactory.decodeResource(res,R.drawable.k);
pic[11]=BitmapFactory.decodeResource(res,R.drawable.l);
pic[12]=BitmapFactory.decodeResource(res,R.drawable.m);
pic[13]=BitmapFactory.decodeResource(res,R.drawable.n);
pic[14]=BitmapFactory.decodeResource(res,R.drawable.o);
pic[15]=BitmapFactory.decodeResource(res,R.drawable.p);
pic[16]=BitmapFactory.decodeResource(res,R.drawable.q);
pic[17]=BitmapFactory.decodeResource(res,R.drawable.r);
pic[18]=BitmapFactory.decodeResource(res,R.drawable.s);
pic[19]=BitmapFactory.decodeResource(res,R.drawable.t);
pic[20]=BitmapFactory.decodeResource(res,R.drawable.u);
pic[21]=BitmapFactory.decodeResource(res,R.drawable.v);
pic[22]=BitmapFactory.decodeResource(res,R.drawable.w);
pic[23]=BitmapFactory.decodeResource(res,R.drawable.x);
pic[24]=BitmapFactory.decodeResource(res,R.drawable.y);
pic[25]=BitmapFactory.decodeResource(res,R.drawable.z);
pic2=new Bitmap[26];
pic2[0]=BitmapFactory.decodeResource(res,R.drawable.a2);
pic2[1]=BitmapFactory.decodeResource(res,R.drawable.b2);
pic2[2]=BitmapFactory.decodeResource(res,R.drawable.c2);
pic2[3]=BitmapFactory.decodeResource(res,R.drawable.d2);
pic2[4]=BitmapFactory.decodeResource(res,R.drawable.e2);
pic2[5]=BitmapFactory.decodeResource(res,R.drawable.f2);
pic2[6]=BitmapFactory.decodeResource(res,R.drawable.g2);
pic2[7]=BitmapFactory.decodeResource(res,R.drawable.h2);
pic2[8]=BitmapFactory.decodeResource(res,R.drawable.i2);
pic2[9]=BitmapFactory.decodeResource(res,R.drawable.j2);
pic2[10]=BitmapFactory.decodeResource(res,R.drawable.k2);
pic2[11]=BitmapFactory.decodeResource(res,R.drawable.l2);
pic2[12]=BitmapFactory.decodeResource(res,R.drawable.m2);
pic2[13]=BitmapFactory.decodeResource(res,R.drawable.n2);
pic2[14]=BitmapFactory.decodeResource(res,R.drawable.o2);
pic2[15]=BitmapFactory.decodeResource(res,R.drawable.p2);
pic2[16]=BitmapFactory.decodeResource(res,R.drawable.q2);
pic2[17]=BitmapFactory.decodeResource(res,R.drawable.r2);
pic2[18]=BitmapFactory.decodeResource(res,R.drawable.s2);
pic2[19]=BitmapFactory.decodeResource(res,R.drawable.t2);
pic2[20]=BitmapFactory.decodeResource(res,R.drawable.u2);
pic2[21]=BitmapFactory.decodeResource(res,R.drawable.v2);
pic2[22]=BitmapFactory.decodeResource(res,R.drawable.w2);
pic2[23]=BitmapFactory.decodeResource(res,R.drawable.x2);
pic2[24]=BitmapFactory.decodeResource(res,R.drawable.y2);
pic2[25]=BitmapFactory.decodeResource(res,R.drawable.z2);
start=BitmapFactory.decodeResource(res, R.drawable.startgame);
contin=BitmapFactory.decodeResource(res, R.drawable.continuegame);
end=BitmapFactory.decodeResource(res, R.drawable.endgame);
resume=BitmapFactory.decodeResource(res, R.drawable.resume);
replay=BitmapFactory.decodeResource(res, R.drawable.replay);
menu=BitmapFactory.decodeResource(res, R.drawable.menu);
//menu1=new menu(start,contin,end);
hstart=new contin(start,screenW/2-start.getWidth()/2,screenH/2-start.getHeight()/2-100);
hcontin=new contin(contin,screenW/2-start.getWidth()/2,screenH/2-start.getHeight()/2-100+start.getHeight()+30);
hend=new contin(end,screenW/2-start.getWidth()/2,screenH/2-start.getHeight()/2-100+start.getHeight()*2+60);
hresume=new contin(resume,screenW/2-resume.getWidth()/2,screenH/2-smallbgm.getHeight()/2+resume.getHeight());
hreplay=new contin(replay,screenW/2-resume.getWidth()/2,screenH/2-smallbgm.getHeight()/2+resume.getHeight()*2+20);
hmenu=new contin(menu,screenW/2-resume.getWidth()/2,screenH/2-smallbgm.getHeight()/2+resume.getHeight()*3+40);
p1=new Point(0,0);
p2=new Point(0,0);
//jum=new judgment(thismap);
//initMap();
}
}
public void mydraw()
{
try
{
canvas=sfh.lockCanvas();
if(canvas!=null)
{
canvas.drawBitmap(bgm,0,0,paint);
switch(GameState)
{
case GameMenu:
//menu1.buttondraw(canvas, paint);
hstart.draw(canvas, paint);
hcontin.draw(canvas, paint);
hend.draw(canvas, paint);
break;
case GameIng:
for(int i=1;i<thismap.length-1;i++)
for(int j=1;j<thismap[0].length-1;j++)
{
if(thismap[i][j]!=-1)
canvas.drawBitmap(pic[thismap[i][j]],leftX+j*pic[1].getWidth(),leftY+i*pic[1].getHeight(), paint);
}
if(ispause||iswin||islost)
{
Paint paint2=new Paint();
paint2.setAlpha(0X77);
canvas.drawRect(0, 0, screenW, screenH, paint2);
}
if(ispause)
{
canvas.drawBitmap(smallbgm,screenW/2-smallbgm.getWidth()/2,screenH/2-smallbgm.getHeight()/2, paint);
hresume.draw(canvas, paint);
hreplay.draw(canvas, paint);
hmenu.draw(canvas, paint);
}
break; }
}
}
catch(Exception e)
{}
finally
{
if (canvas != null)
sfh.unlockCanvasAndPost(canvas);
}
//Toast.makeText(this.getContext(),"不能再撤销", Toast.LENGTH_LONG).show();
} @Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
switch(GameState)
{
case GameMenu:
if(hstart.onTouchEvent(event))
{
initMap();
GameState=GameIng;
}
if(hcontin.onTouchEvent(event))
{
read();
GameState=GameIng;
}
if(hend.onTouchEvent(event))
{
A17Activity.instance.finish();
System.exit(0);
}
break;
case GameIng:
float getx=event.getX();
float gety=event.getY();
for(int i=0;i<thismap.length;i++)
for(int j=0;j<thismap[0].length;j++)
{
if(getx>=leftX+pic[0].getWidth()*j&&getx<=leftX+pic[0].getWidth()*(j+1))
if(gety>=leftY+pic[0].getHeight()*i&&gety<=leftY+pic[0].getHeight()*(i+1))
{
// checki=i;
// checkj=j;
p1=new Point(i,j);
break;
}
}
if(ispause||iswin||islost)
{
if(hresume.onTouchEvent(event))
ispause=false;
if(hreplay.onTouchEvent(event))
{
initMap();
ispause=false;
}
if(hmenu.onTouchEvent(event))
{
ispause=false;
GameState=GameMenu;
}
}
break; }
return true;
}
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if(keyCode==KeyEvent.KEYCODE_BACK)
{
if(GameState==GameMenu)
{
A17Activity.instance.finish();
System.exit(0);
}
else if(GameState==GameIng)
{
ispause=!ispause;
}
}
return true;
} public void logic()
{
switch(GameState)
{
case GameIng:
if(link(p1, p2))
{
thismap[p1.x][p1.y]=-1;
thismap[p2.x][p2.y]=-1;
}
else
{
p2=p1;
}
break;
}
}
List<Point> p1e= new ArrayList<Point>();
List<Point> p2e= new ArrayList<Point>();
public boolean link(Point p1,Point p2)
{
if(p1.equals(p2))
{
return false;
}
if(thismap[p1.x][p1.y]==thismap[p2.x][p2.y])
{
if(turn0(p1,p2))
{
turn=0;
return true;
}
Point p=new Point(p1.x,p2.y);
if(thismap[p1.x][p2.y]==-1)
{
if(turn0(p1,p)&&(turn0(p,p2)))
{
turn=1;
return true;
}
}
p=new Point(p2.x,p1.y);
if(thismap[p2.x][p1.y]==-1)
{
if(turn0(p1,p)&&(turn0(p,p2)))
{
turn=1;
return true;
}
} createpointx(p1,p1e);
createpointx(p2,p2e);
for(Point pt1:p1e)
for(Point pt2:p2e)
if (pt1.x == pt2.x)
if(turn0(pt1,pt2))
{
turn=2;
return true;
}
createpointy(p1,p1e);
createpointy(p2,p2e);
for(Point pt1:p1e)
for(Point pt2:p2e)
if (pt1.y == pt2.y)
if(turn0(pt1,pt2))
{
turn=2;
return true;
}
return false;
}
return false;
} private boolean turn0(Point p1,Point p2)
{
if(p1.x==p2.x)
{
int starty=Math.min(p1.y, p2.y);
int endy=Math.max(p1.y, p2.y);
for(int i=starty+1;i<endy;i++)
{
if(thismap[p1.x][i]!=-1)
{
flag1=false;
break;
}
}
if(flag1==true)
{
return true;
}
}
if(p1.y==p2.y)
{
int startx=Math.min(p1.x, p2.x);
int endx=Math.max(p1.x, p2.x);
for(int i=startx+1;i<endx;i++)
{
if(thismap[i][p1.y]!=-1)
{
flag1=false;
break;
}
}
if(flag1==true)
{
return true;
}
}
return false;
}
public void createpointx(Point p,List<Point>l)
{
l.clear();
for(int i=p.x+1;i<thismap.length;i++)
{
if (thismap[i][p.y] != -1) {
break;
}
l.add(new Point(i, p.y));
}
for(int i=p.x-1;i>=0;i--)
{
if (thismap[i][p.y] != -1) {
break;
}
l.add(new Point(i, p.y));
}
}
public void createpointy(Point p,List<Point>l)
{
l.clear();
for(int i=p.y+1;i<thismap[0].length;i++)
{
if (thismap[p.x][i] != -1) {
break;
}
l.add(new Point(p.x,i));
}
for(int i=p.y-1;i>=0;i--)
{
if (thismap[p.x][i] != -1) {
break;
}
l.add(new Point(p.x,i));
}
}
public int getturn()
{
return turn;
}
public void read()
{
SharedPreferences pre=this.getContext().getSharedPreferences("map", 0);
String mapString=pre.getString("mapString", "");
if(mapString.equals(""))
initMap();
}
public void initMap()
{
map=new Map(grade);
thismap=map.creatmap(grade);
}
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
} public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
flag=false;
} public void run()
{
// TODO Auto-generated method stub
while (flag) {
long start = System.currentTimeMillis();
//logic();
mydraw();
logic();
long end = System.currentTimeMillis();
try {
if (end - start < 50) {
Thread.sleep(50 - (end - start));
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
{
private float x,y,w,h;
private Bitmap bmp;
public contin(Bitmap bmp,float x,float y)
{
this.x=x;
this.y=y;
this.w=bmp.getWidth();
this.h=bmp.getHeight();
this.bmp=bmp;
}
public void draw(Canvas canvas,Paint paint)
{
canvas.drawBitmap(bmp,x,y,paint);
}
public boolean onTouchEvent(MotionEvent event)
{
if(event.getAction()==MotionEvent.ACTION_DOWN)
if(event.getX()<=x+w&&event.getX()>=x)
if(event.getY()<=y+h&&event.getY()>=y)
return true;
return false;
}
}