Android_美女拼图游戏

来源:互联网 发布:凤凰科技网络 编辑:程序博客网 时间:2024/05/18 01:14
Android_美女拼图游戏
1 .mainavtivity:
public class MainActivity extends Activity
{

    privateGamePintuLayout mGamePintuLayout;
    privateTextView mLevel ;
    privateTextView mTime;

   @Override
    protectedvoid onCreate(Bundle savedInstanceState)
    {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

       mTime =(TextView) findViewById(R.id.id_time);
       mLevel =(TextView) findViewById(R.id.id_level);
      
      mGamePintuLayout = (GamePintuLayout)findViewById(R.id.id_gamepintu);
      mGamePintuLayout.setTimeEnabled(true);
      
      mGamePintuLayout.setOnGamePintuListener(newGamePintuListener()
       {
         @Override
          public voidtimechanged(int currentTime)
          {
            mTime.setText(""+currentTime);
          }

         @Override
          public voidnextLevel(final int nextLevel)
          {
             newAlertDialog.Builder(MainActivity.this)
                  .setTitle("Game Info").setMessage("LEVEL UP !!!")
                  .setPositiveButton("NEXT LEVEL", new OnClickListener()
                   {
                     @Override
                      public voidonClick(DialogInterface dialog,
                            intwhich)
                      {
                        mGamePintuLayout.nextLevel();
                        mLevel.setText(""+nextLevel);
                      }
                  }).show();
          }

         @Override
          public voidgameover()
          {
             newAlertDialog.Builder(MainActivity.this)
            .setTitle("Game Info").setMessage("Game over !!!")
            .setPositiveButton("RESTART", new OnClickListener()
             {
               @Override
                public voidonClick(DialogInterface dialog,
                      intwhich)
                {
                  mGamePintuLayout.restart();
                }
            }).setNegativeButton("QUIT",new OnClickListener()
             {
               @Override
                public voidonClick(DialogInterface dialog, int which)
                {
                  finish();
                }
            }).show();
          }
       });

    }
   
   @Override
    protectedvoid onPause()
    {
      super.onPause();
      
      mGamePintuLayout.pause();
    }
   
   @Override
    protectedvoid onResume()
    {
      super.onResume();
      mGamePintuLayout.resume();
    }

}
2.游戏布局:
public class GamePintuLayout extends RelativeLayout implementsOnClickListener
{

    private intmColumn = 3;
   
    private intmPadding;
   
    private intmMargin = 3;

    privateImageView[] mGamePintuItems;

    private intmItemWidth;

   
    privateBitmap mBitmap;

    private ListmItemBitmaps;

    privateboolean once;

   
    private intmWidth;

    privateboolean isGameSuccess;
    privateboolean isGameOver;

    publicinterface GamePintuListener
    {
       voidnextLevel(int nextLevel);

       voidtimechanged(int currentTime);

       voidgameover();
    }

    publicGamePintuListener mListener;

   
    public voidsetOnGamePintuListener(GamePintuListener mListener)
    {
      this.mListener = mListener;
    }

    private intmLevel = 1;
    privatestatic final int TIME_CHANGED = 0x110;
    privatestatic final int NEXT_LEVEL = 0x111;

    privateHandler mHandler = new Handler()
    {
       public voidhandleMessage(android.os.Message msg)
       {
          switch(msg.what)
          {
          caseTIME_CHANGED:
             if(isGameSuccess || isGameOver || isPause)
               return;
             if(mListener != null)
             {
               mListener.timechanged(mTime);
             }
             if (mTime ==0)
             {
                isGameOver =true;
               mListener.gameover();
               return;
             }
            mTime--;
            mHandler.sendEmptyMessageDelayed(TIME_CHANGED, 1000);

             break;
          caseNEXT_LEVEL:
             mLevel =mLevel + 1;
             if(mListener != null)
             {
               mListener.nextLevel(mLevel);
             } else
             {
               nextLevel();
             }
             break;

          }
       };
    };

    privateboolean isTimeEnabled = false;
    private intmTime;

   
    public voidsetTimeEnabled(boolean isTimeEnabled)
    {
      this.isTimeEnabled = isTimeEnabled;
    }

    publicGamePintuLayout(Context context)
    {
      this(context, null);
    }

    publicGamePintuLayout(Context context, AttributeSet attrs)
    {
      this(context, attrs, 0);
    }

    publicGamePintuLayout(Context context, AttributeSet attrs, intdefStyle)
    {
      super(context, attrs, defStyle);
      init();
    }

    private voidinit()
    {
       mMargin =(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
             3,getResources().getDisplayMetrics());
       mPadding =min(getPaddingLeft(), getPaddingRight(), getPaddingTop(),
            getPaddingBottom());
    }

   @Override
    protectedvoid onMeasure(int widthMeasureSpec, int heightMeasureSpec)
    {
      super.onMeasure(widthMeasureSpec, heightMeasureSpec);
       //取宽和高中的小值
       mWidth =Math.min(getMeasuredHeight(), getMeasuredWidth());

       if(!once)
       {
          //进行切图,以及排序
         initBitmap();
          //设置ImageView(Item)的宽高等属性
         initItem();
          //判断是否开启时间
         checkTimeEnable();

          once =true;
       }
//强制设置为正方形
      setMeasuredDimension(mWidth, mWidth);

    }

    private voidcheckTimeEnable()
    {
       if(isTimeEnabled)
       {
          //根据当前等级设置时间
         countTimeBaseLevel();
         mHandler.sendEmptyMessage(TIME_CHANGED);
       }

    }

    private voidcountTimeBaseLevel()
    {
       mTime =(int) Math.pow(2, mLevel) * 60;
    }

   
    private voidinitBitmap()
    {
       if (mBitmap== null)
       {
          mBitmap =BitmapFactory.decodeResource(getResources(),
               R.drawable.image);
       }
       mItemBitmaps= ImageSplitterUtil.splitImage(mBitmap, mColumn);

       //使用sort完成我们的乱序
      Collections.sort(mItemBitmaps, new Comparator()
       {
         @Override
          public intcompare(ImagePiece a, ImagePiece b)
          {
             returnMath.random() > 0.5 ? 1 : -1;
          }
       });

    }

   
    private voidinitItem()
    {
       mItemWidth =(mWidth - mPadding * 2 - mMargin * (mColumn - 1))
             /mColumn;
      mGamePintuItems = new ImageView[mColumn * mColumn];
       //生成我们的Item,设置Rule
       for (int i =0; i < mGamePintuItems.length; i++)
       {
          ImageViewitem = new ImageView(getContext());
         item.setOnClickListener(this);
         item.setImageBitmap(mItemBitmaps.get(i).getBitmap());

         mGamePintuItems[i] = item;
          item.setId(i+ 1);

          //在Item的tag中存储了index
         item.setTag(i + "_" + mItemBitmaps.get(i).getIndex());

         RelativeLayout.LayoutParams lp = newRelativeLayout.LayoutParams(
                mItemWidth,mItemWidth);

          //设置Item间横向间隙,通过rightMargin
          //不是最后一列
          if ((i + 1)% mColumn != 0)
          {
            lp.rightMargin = mMargin;
          }
          //不是第一列
          if (i %mColumn != 0)
          {
            lp.addRule(RelativeLayout.RIGHT_OF,
                  mGamePintuItems[i - 1].getId());
          }
          // 如果不是第一行 ,设置topMargin和rule
          if ((i + 1)> mColumn)
          {
             lp.topMargin= mMargin;
            lp.addRule(RelativeLayout.BELOW,
                  mGamePintuItems[i - mColumn].getId());
          }
         addView(item, lp);
       }

    }

    public voidrestart()
    {
       isGameOver =false;
      mColumn--;
      nextLevel();
    }
   
    privateboolean isPause ;
   
    public voidpause()
    {
       isPause =true ;
      mHandler.removeMessages(TIME_CHANGED);
    }
   
    public voidresume()
    {
      if(isPause)
       {
          isPause =false ;
         mHandler.sendEmptyMessage(TIME_CHANGED);
       }
    }

    public voidnextLevel()
    {
      this.removeAllViews();
       mAnimLayout= null;
      mColumn++;
      isGameSuccess = false;
      checkTimeEnable();
      initBitmap();
      initItem();
    }

   
    private intmin(int... params)
    {
       int min =params[0];

       for (intparam : params)
       {
          if (param< min)
             min =param;
       }
       returnmin;
    }

    privateImageView mFirst;
    privateImageView mSecond;

   @Override
    public voidonClick(View v)
    {
       if(isAniming)
         return;

       //两次点击同一个Item
       if (mFirst== v)
       {
         mFirst.setColorFilter(null);
          mFirst =null;
         return;
       }
       if (mFirst== null)
       {
          mFirst =(ImageView) v;
         mFirst.setColorFilter(Color.parseColor("#55FF0000"));
       } else
       {
          mSecond =(ImageView) v;
          //交换我们的Item
         exchangeView();
       }

    }

   
    privateRelativeLayout mAnimLayout;
    privateboolean isAniming;

   
    private voidexchangeView()
    {
      mFirst.setColorFilter(null);
       //构造我们的动画层
      setUpAnimLayout();

       ImageViewfirst = new ImageView(getContext());
       final BitmapfirstBitmap = mItemBitmaps.get(
            getImageIdByTag((String) mFirst.getTag())).getBitmap();
      first.setImageBitmap(firstBitmap);
       LayoutParamslp = new LayoutParams(mItemWidth, mItemWidth);
      lp.leftMargin = mFirst.getLeft() - mPadding;
       lp.topMargin= mFirst.getTop() - mPadding;
      first.setLayoutParams(lp);
      mAnimLayout.addView(first);

       ImageViewsecond = new ImageView(getContext());
       final BitmapsecondBitmap = mItemBitmaps.get(
            getImageIdByTag((String) mSecond.getTag())).getBitmap();
      second.setImageBitmap(secondBitmap);
       LayoutParamslp2 = new LayoutParams(mItemWidth, mItemWidth);
      lp2.leftMargin = mSecond.getLeft() - mPadding;
      lp2.topMargin = mSecond.getTop() - mPadding;
      second.setLayoutParams(lp2);
      mAnimLayout.addView(second);

       //设置动画
      TranslateAnimation anim = new TranslateAnimation(0,mSecond.getLeft()
             -mFirst.getLeft(), 0, mSecond.getTop() - mFirst.getTop());
      anim.setDuration(300);
      anim.setFillAfter(true);
      first.startAnimation(anim);

      TranslateAnimation animSecond = new TranslateAnimation(0,
            -mSecond.getLeft() + mFirst.getLeft(), 0, -mSecond.getTop()
                   +mFirst.getTop());
      animSecond.setDuration(300);
      animSecond.setFillAfter(true);
      second.startAnimation(animSecond);

       //监听动画
      anim.setAnimationListener(new AnimationListener()
       {
         @Override
          public voidonAnimationStart(Animation animation)
          {
            mFirst.setVisibility(View.INVISIBLE);
            mSecond.setVisibility(View.INVISIBLE);

             isAniming =true;
          }

         @Override
          public voidonAnimationRepeat(Animation animation)
          {
             // TODOAuto-generated method stub

          }

         @Override
          public voidonAnimationEnd(Animation animation)
          {

             StringfirstTag = (String) mFirst.getTag();
             StringsecondTag = (String) mSecond.getTag();

            mFirst.setImageBitmap(secondBitmap);
            mSecond.setImageBitmap(firstBitmap);

            mFirst.setTag(secondTag);
            mSecond.setTag(firstTag);

            mFirst.setVisibility(View.VISIBLE);
            mSecond.setVisibility(View.VISIBLE);

             mFirst =mSecond = null;
            mAnimLayout.removeAllViews();
             //判断用户游戏是否成功
            checkSuccess();
             isAniming =false;
          }
       });

    }

   
    private voidcheckSuccess()
    {
       booleanisSuccess = true;

       for (int i =0; i < mGamePintuItems.length; i++)
       {
          ImageViewimageView = mGamePintuItems[i];
          if(getImageIndexByTag((String) imageView.getTag()) != i)
          {
             isSuccess =false;
          }
       }

       if(isSuccess)
       {
         isGameSuccess = true;
         mHandler.removeMessages(TIME_CHANGED);

         Toast.makeText(getContext(), "Success , level up !!!",
               Toast.LENGTH_LONG).show();
         mHandler.sendEmptyMessage(NEXT_LEVEL);
       }

    }

   
    public intgetImageIdByTag(String tag)
    {
       String[]split = tag.split("_");
       returnInteger.parseInt(split[0]);
    }

    public intgetImageIndexByTag(String tag)
    {
       String[]split = tag.split("_");
       returnInteger.parseInt(split[1]);
    }

   
    private voidsetUpAnimLayout()
    {
       if(mAnimLayout == null)
       {
          mAnimLayout= new RelativeLayout(getContext());
         addView(mAnimLayout);
       }
    }

}
3.图片分割方法:
public class ImageSplitterUtil
{

   
    publicstatic List splitImage(Bitmap bitmap, int piece)
    {
       ListimagePieces = new ArrayList();

       int width =bitmap.getWidth();
       int height =bitmap.getHeight();

       intpieceWidth = Math.min(width, height) / piece;

       for (int i =0; i < piece; i++)
       {
          for (int j =0; j < piece; j++)
          {

             ImagePieceimagePiece = new ImagePiece();
            imagePiece.setIndex(j + i * piece);

             int x = j *pieceWidth;
             int y = i *pieceWidth;
            
            imagePiece.setBitmap(Bitmap.createBitmap(bitmap, x, y,
                   pieceWidth,pieceWidth));
            imagePieces.add(imagePiece);
          }
       }

       returnimagePieces;
    }

}
4.类的声明:
public class ImagePiece
{
    private intindex ;
    privateBitmap bitmap ;
   
    publicImagePiece()
    {
    }

    publicImagePiece(int index, Bitmap bitmap)
    {
       this.index =index;
       this.bitmap= bitmap;
    }

    public intgetIndex()
    {
       returnindex;
    }

    public voidsetIndex(int index)
    {
       this.index =index;
    }

    publicBitmap getBitmap()
    {
       returnbitmap;
    }

    public voidsetBitmap(Bitmap bitmap)
    {
       this.bitmap= bitmap;
    }

   @Override
    publicString toString()
    {
       return"ImagePiece [index=" + index + ", bitmap=" + bitmap + "]";
    }
   
}
5.布局文件:

   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent" >

          android:id="@+id/id_gamepintu"
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
       android:layout_centerInParent="true"
       android:padding="3dp" />

          android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:layout_above="@id/id_gamepintu"
       android:layout_margin="3dp" >

                  android:id="@+id/id_level"
           android:layout_width="70dp"
           android:layout_height="70dp"
           android:background="@drawable/textbg"
           android:gravity="center"
           android:padding="4dp"
           android:text="1"
           android:textColor="#EA7821"
           android:textSize="30sp"
           android:textStyle="bold" />

                  android:id="@+id/id_time"
           android:layout_width="70dp"
           android:layout_height="70dp"
           android:layout_alignParentRight="true"
           android:background="@drawable/textbg"
           android:gravity="center"
           android:padding="4dp"
           android:text="120"
           android:textColor="#EA7821"
           android:textSize="30sp"
           android:textStyle="bold" />
   


0 0