//连连看的算法要判断三个拐点,我的情况是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));
    }
//是不是线程设置的问题呢?

解决方案 »

  1.   

    //gameview类
    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;
    }

      

  2.   

    @Override
    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();
    }
    }
    }
      

  3.   

    //按钮类public class contin 
    {


    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;

    }
    }