问答详情
源自:2-2 判断点击的方块周边是否存在缺口方块

在做判断点击方块周边是否存在缺口的时候出现问题一点击就报错程序闪退

package com.Pintu.pintu;


import com.example.pintu.R;


import android.os.Bundle;

import android.app.Activity;

import android.graphics.Bitmap;

import android.graphics.drawable.BitmapDrawable;

import android.view.Menu;

import android.view.View;

import android.view.View.OnClickListener;


import android.widget.GridLayout;

import android.widget.ImageView;

import android.widget.Toast;


public class MainActivity extends Activity {

/**利用二维数组创建若干个游戏小方块*/

private ImageView[][] iv_game_arr = new ImageView[3][5];

// 游戏主界面

private GridLayout gl_main_game;

/**当前空方块实例的保存*/

private ImageView iv_null_ImageView;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

/*初始化游戏的若干个小方块*/

Bitmap bigBm = ((BitmapDrawable)getResources().getDrawable(R.drawable.ic_game_tu)).getBitmap();//获取一张大图

int tuWandH = bigBm.getWidth()/5;//每个游戏小方块的宽和高

for (int i = 0; i < iv_game_arr.length; i++) {

for (int j = 0; j < iv_game_arr[0].length; j++) {

Bitmap bm=Bitmap.createBitmap(bigBm,j*tuWandH,i*tuWandH,tuWandH,tuWandH);//根据航和列切成若干个游戏小图片

iv_game_arr[i][j] = new ImageView(this);

iv_game_arr[i][j].setImageBitmap(bm);

//设置方块之间的间距

iv_game_arr[i][j].setPadding(2, 2, 2, 2);

iv_game_arr[i][j].setTag(new GameData(i, j, bm));//绑定自定义的数据;

iv_game_arr[i][j].setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

boolean flag = isHasByNullImageView((ImageView)v);

Toast.makeText(MainActivity.this, "当前位置关系是否存在"+flag, Toast.LENGTH_SHORT).show();

}

});

}

}

// 初始化游戏主界面,并添加若干个小方块

gl_main_game = (GridLayout) findViewById(R.id.gl_main_game);

for (int i = 0; i < iv_game_arr.length; i++) {

for (int j = 0; j < iv_game_arr[0].length; j++) {

gl_main_game.addView(iv_game_arr[i][j]);

}

}

// 设置最后一个方块是空的

setNullImageView(iv_game_arr[2][4]);

}

/*设置某个方块为空方块

@param mImageView 当前设置为空的方块的实例

@return true :相邻,false:不相邻

*/

public void setNullImageView(ImageView mImageView){

mImageView.setImageBitmap(null);

}

//判断当前点击的方块,是否与空方块的位置关系是相关关系

public boolean isHasByNullImageView(ImageView mImageView){

//分别获取当前空方块的位置与点击方块的位置,通过x,y两边都差1的方式判断

GameData mNullGameData = (GameData) iv_null_ImageView.getTag();

GameData mGameData = (GameData)mImageView.getTag();

if(mNullGameData.y==mGameData.y&&mGameData.x+1==mNullGameData.x){//当前点击的方块在空方块的上边

return true;

}else if(mNullGameData.y==mGameData.y&&mGameData.x-1==mNullGameData.x){//当前点击的方块在空方块的下边

return true;

}else if(mNullGameData.y==mGameData.y+1&&mGameData.x==mNullGameData.x){//当前点击的方块在空方块的左边

return true;

}else if(mNullGameData.y==mGameData.y-1&&mGameData.x==mNullGameData.x){//当前点击的方块在空方块的右边

return true;

}

return false;

}

// 每个游戏小方块需要绑定的数据

class GameData{

/**每个小方块的实际位置x*/

public int x =0; 

/**每个小方块的实际位置y*/

public int y =0;

/**每个小方块的图片*/

public Bitmap bm;

/**每个小方块的图片位置*/

public int p_x = 0;

/**每个小方块的图片位置*/

public int p_y =0;

public GameData(int x, int y, Bitmap bm) {

super();

this.x = x;

this.y = y;

this.bm = bm;

this.p_x = x;

this.p_y = y;

}

}

}













提问者:小莫程序学习 2017-01-19 08:24

个回答

  • 慕标600203
    2017-09-06 16:26:49

    public class MainActivity extends Activity {
       private boolean isAnimRun = false;
       //判断游戏是否开始
       private boolean isGameStart = false;
       private ImageView [] [] iv_game_arr = new ImageView[3][5];
       private GridLayout gl_main_game;
       private ImageView iv_null_ImageView;
       private GestureDetector mDetector;

       @Override
       public boolean onTouchEvent(MotionEvent event) {
           return mDetector.onTouchEvent(event);
       }

       @Override
       public boolean dispatchTouchEvent(MotionEvent ev) {
           mDetector.onTouchEvent(ev);

           return super.dispatchTouchEvent(ev);
       }

       @Override
       protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.activity_main);
           mDetector = new GestureDetector(this, new GestureDetector.OnGestureListener() {
               @Override
               public boolean onDown(MotionEvent motionEvent) {
                   return false;
               }

               @Override
               public void onShowPress(MotionEvent motionEvent) {

               }

               @Override
               public boolean onSingleTapUp(MotionEvent motionEvent) {
                   return false;
               }

               @Override
               public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
                   return false;
               }

               @Override
               public void onLongPress(MotionEvent motionEvent) {

               }

               @Override
               public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
                   int type = getDirByGes(motionEvent.getX(),motionEvent.getY(),motionEvent1.getX(),motionEvent1.getY());
    //                Toast.makeText(MainActivity.this,""+type,Toast.LENGTH_SHORT).show();
                   changeByDir(type);
                   return false;
               }
           });
           Bitmap bigBm = ((BitmapDrawable) getResources().getDrawable(R.drawable.ic_game_tu)).getBitmap();
           int tuWandH = bigBm.getWidth()/5;
           int ivWandH = getWindowManager().getDefaultDisplay().getWidth()/5;
           for (int i=0;i<iv_game_arr.length;i++){
               for(int j=0;j<iv_game_arr[0].length;j++){
                   Bitmap bm = Bitmap.createBitmap(bigBm,j*tuWandH,i*tuWandH,tuWandH,tuWandH);
                   iv_game_arr[i][j]=new ImageView(this);
                   iv_game_arr[i][j].setImageBitmap(bm);
                   iv_game_arr[i][j].setLayoutParams(new RelativeLayout.LayoutParams(ivWandH,ivWandH));
                   iv_game_arr[i][j].setPadding(2,2,2,2);
                   iv_game_arr[i][j].setTag(new GameData(i,j,bm));
                   iv_game_arr[i][j].setOnClickListener(new View.OnClickListener() {
                       @Override
                       public void onClick(View v) {
                           boolean flag = isHasByNullImageView((ImageView)v);
                           //Toast.makeText(MainActivity.this,"位置关系是否存在:"+flag,Toast.LENGTH_SHORT).show();
                           if(flag){
                               changeDataByImageView((ImageView) v);
                           }
                       }
                   });
               }
           }
           gl_main_game = (GridLayout) findViewById(R.id.gl_main_game);
           for(int i=0;i<iv_game_arr.length;i++){
               for(int j=0;j<iv_game_arr[0].length;j++){
                   gl_main_game.addView(iv_game_arr[i][j]);
               }
           }
           //设置最后一个方块为空
           setNullImageView(iv_game_arr[2][4]);
           //随机打乱顺序
           randomMove();
           isGameStart = true;
       }

       //随机打乱顺序
       public void randomMove(){
           for(int i=0;i<100;i++){
               int type = (int) ((Math.random()*4)+1);
               changeByDir(type,false);
           }
       }
       public void changeByDir(int type){
            changeByDir(type,true);
       }

       public void changeByDir(int type ,boolean isAnim){
           GameData mNullGameData = (GameData) iv_null_ImageView.getTag();
           int new_x = mNullGameData.x;
           int new_y = mNullGameData.y;
           if(type == 1){
               new_x++;
           }else if(type == 2){
               new_x--;
           }else if(type == 3){
               new_y++;
           }else if(type == 4){
               new_y--;
           }
           if(new_x>=0&&new_x<iv_game_arr.length&&new_y>=0&&new_y<iv_game_arr[0].length){
               if(isAnim){
                   changeDataByImageView(iv_game_arr[new_x][new_y]);
               }else {
                   changeDataByImageView(iv_game_arr[new_x][new_y],isAnim);
               }
           }else {

           }
       }
       //判断结束的方法
       public void isGameOver(){
           boolean isGameOver = true;
           for(int i=0;i<iv_game_arr.length;i++){
               for(int j=0;j<iv_game_arr[0].length;j++){
                   if(iv_game_arr[i][j]==iv_null_ImageView){
                       continue;
                   }
                   GameData mGameData = (GameData) iv_game_arr[i][j].getTag();
                   if(!mGameData.isTrue()){
                       isGameOver = false;
                       break;
                   }
               }

               }
           if(isGameOver){
               Toast.makeText(MainActivity.this,"游戏结束",Toast.LENGTH_SHORT).show();
           }
       }
       public int getDirByGes(float start_x, float start_y, float end_x, float end_y){
           boolean isLeftOrRight = (Math.abs(start_x-end_x)>Math.abs(start_y-end_y))?true:false;
           if(isLeftOrRight){
               boolean isLeft = start_x-end_x>0?true:false;
               if(isLeft){
                   return 3;
               }else {
                   return 4;
               }
           }else {
               boolean isUp = start_y-end_y>0?true:false;
               if(isUp){
                   return 1;
               }else {
                   return 2;
               }
           }
       }

       public void setNullImageView(ImageView mImageView){
           mImageView.setImageBitmap(null);
           iv_null_ImageView = mImageView;
       }

       public void changeDataByImageView(final ImageView mImageView){
           changeDataByImageView(mImageView,true);
       }

       public void changeDataByImageView(final ImageView mImageView, boolean isAnim){
           if(isAnimRun){
               return;
           }
           if(!isAnim){
               GameData mGameData = (GameData) mImageView.getTag();
               iv_null_ImageView.setImageBitmap(mGameData.bm);
               GameData mNullGameData = (GameData) iv_null_ImageView.getTag();
               mNullGameData.bm = mGameData.bm;
               mNullGameData.p_x = mGameData.p_x;
               mNullGameData.p_y = mGameData.p_y;
               setNullImageView(mImageView);//设置当前点击的是空方块
               if(isGameStart){
                   //成功时,弹出Toast
                   isGameOver();
               }
               return;
           }
           TranslateAnimation translateAnimation = null;
           if(mImageView.getX()>iv_null_ImageView.getX()){
               translateAnimation = new TranslateAnimation(0.1f,-mImageView.getWidth(),0.1f,0.1f);
           }else if(mImageView.getX()<iv_null_ImageView.getX()){
               translateAnimation = new TranslateAnimation(0.1f,mImageView.getWidth(),0.1f,0.1f);
           }else if(mImageView.getY()>iv_null_ImageView.getY()){
               translateAnimation = new TranslateAnimation(0.1f,0.1f,0.1f,-mImageView.getWidth());
           }else if(mImageView.getY()<iv_null_ImageView.getY()){
               translateAnimation = new TranslateAnimation(0.1f,0.1f,0.1f,mImageView.getWidth());
           }
           //设置动画时长
           translateAnimation.setDuration(70);
           //结束设置后是否停留
           translateAnimation.setFillAfter(true);
           translateAnimation.setAnimationListener(new Animation.AnimationListener() {
               @Override
               public void onAnimationStart(Animation animation) {
                   isAnimRun = true;
               }

               @Override
               public void onAnimationEnd(Animation animation) {
                   isAnimRun = false;
                   mImageView.clearAnimation();
                   GameData mGameData = (GameData) mImageView.getTag();
                   iv_null_ImageView.setImageBitmap(mGameData.bm);
                   GameData mNullGameData = (GameData) iv_null_ImageView.getTag();
                   mNullGameData.bm = mGameData.bm;
                   mNullGameData.p_x = mGameData.p_x;
                   mNullGameData.p_y = mGameData.p_y;
                   setNullImageView(mImageView);//设置当前点击的是空方块
                   if(isGameStart){
                       //成功时,弹出Toast
                       isGameOver();
                   }
               }

               @Override
               public void onAnimationRepeat(Animation animation) {

               }
           });
           //执行动画
           mImageView.startAnimation(translateAnimation);
       }

       public boolean isHasByNullImageView(ImageView mImageView){
           GameData mNullGameData = (GameData) iv_null_ImageView.getTag();
           GameData mGameData = (GameData) mImageView.getTag();
           if(mNullGameData.y==mGameData.y && mGameData.x+1==mNullGameData.x){
               return true;
           }else if(mNullGameData.y==mGameData.y && mGameData.x-1==mNullGameData.x){
               return true;
           }else if(mNullGameData.y==mGameData.y+1 && mGameData.x==mNullGameData.x){
               return true;
           }else if(mNullGameData.y==mGameData.y-1 && mGameData.x==mNullGameData.x){
               return true;
           }
           return false;
       }
       class GameData{
           public int x = 0;
           public int y = 0;
           public Bitmap bm;
           public int p_x = 0;
           public int p_y = 0;

           public GameData(int x, int y, Bitmap bm) {
               super();
               this.x = x;
               this.y = y;
               this.bm = bm;
               this.p_x = x;
               this.p_y = y;
           }
           //判断游戏是否结束的方法
           public boolean isTrue() {
               if(x==p_x&&y==p_y){
                   return true;
               }
               return false;
           }
       }

    }

  • 小莫程序学习
    2017-01-19 08:27:08

    GameData mNullGameData = (GameData) iv_null_ImageView.getTag();

    boolean flag = isHasByNullImageView((ImageView)v);

    我看日志报错就是说这两句错误,我看了很多次都没发现哪里错了,老师可以帮帮我吗,现在是进程序然后点击图片就闪退。