日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

android實現簡單拼圖游戲_Android

作者:沒勁1 ? 更新時間: 2022-05-27 編程語言

本文實例為大家分享了android實現簡單拼圖游戲的具體代碼,供大家參考,具體內容如下

1.

2.

//使用回調接口,首先初始化pintuview并綁定,實現回調接口的方法
? ? mPintuLayout = (PintuLayout) findViewById(R.id.mpintu);
? ? ? ? mPintuLayout.setOnGamePintuListener(new GamePintuListener() {

? ? ? ? ? ? @Override
? ? ? ? ? ? public void timechanged(int currentTime) {
? ? ? ? ? ? ? ? tvTime.setText(currentTime + "");
? ? ? ? ? ? }

? ? ? ? ? ? @Override
? ? ? ? ? ? public void nextLevel(final int nextLevel) {
? ? ? ? ? ? ? ? mtvNextLevel.setVisibility(0);
? ? ? ? ? ? ? ? mPintuLayout.pause();
? ? ? ? ? ? ? ? mPintuLayout.nextLevel();
? ? ? ? ? ? ? ? level = nextLevel + "";
? ? ? ? ? ? }

? ? ? ? ? ? @Override
? ? ? ? ? ? public void gameover() {
? ? ? ? ? ? ? ? mtvGameOver.setVisibility(0);
? ? ? ? ? ? }
? ? ? ? });
? ? }

? ? @Override
? ? protected void onPause() {
? ? ? ? super.onPause();
? ? ? ? mPintuLayout.pause();
? ? }

? ? @Override
? ? protected void onResume() {
? ? ? ? super.onResume();
? ? ? ? mPintuLayout.resume();
? ? }
// 設置按兩次回退退出程序
? ? @Override
? ? public boolean onKeyDown(int keyCode, KeyEvent event) {
? ? ? ? if (keyCode == KeyEvent.KEYCODE_BACK) {
? ? ? ? ? ? exit();
? ? ? ? ? ? Toast.makeText(getApplicationContext(), "再按一次則退出",
? ? ? ? ? ? ? ? ? ? Toast.LENGTH_SHORT).show();
? ? ? ? ? ? return false;
? ? ? ? }
? ? ? ? return super.onKeyDown(keyCode, event);
? ? }

? ? private void exit() {
? ? ? ? if (!isExit) {
? ? ? ? ? ? isExit = true;
? ? ? ? ? ? myHandler.sendEmptyMessageDelayed(0, 2000);
? ? ? ? } else {
? ? ? ? ? ? finish();
? ? ? ? }
? ? }

? ? Handler myHandler = new Handler() {
? ? ? ? @Override
? ? ? ? public void handleMessage(Message msg) {
? ? ? ? ? ? super.handleMessage(msg);
? ? ? ? ? ? isExit = false;
? ? ? ? }
? ? };

//界面的點擊事件
? ? @Override
? ? public void onClick(View v) {
? ? ? ? switch (v.getId()) {
? ? ? ? case R.id.textView1:
? ? ? ? ? ? mPintuLayout.pause();
? ? ? ? ? ? Toast.makeText(getApplicationContext(), "Pausing",
? ? ? ? ? ? ? ? ? ? Toast.LENGTH_SHORT).show();
? ? ? ? ? ? mPintuLayout.setVisibility(4);
? ? ? ? ? ? miv.setVisibility(0);
? ? ? ? ? ? break;
? ? ? ? case R.id.textView2:
? ? ? ? ? ? mPintuLayout.resume();
? ? ? ? ? ? Toast.makeText(getApplicationContext(), "Restarted",
? ? ? ? ? ? ? ? ? ? Toast.LENGTH_SHORT).show();
? ? ? ? ? ? mPintuLayout.setVisibility(0);
? ? ? ? ? ? miv.setVisibility(4);
? ? ? ? ? ? break;
? ? ? ? case R.id.mtvGameOver:
? ? ? ? ? ? mtvGameOver.setVisibility(4);
? ? ? ? ? ? mPintuLayout.restart();
? ? ? ? ? ? break;
? ? ? ? case R.id.mtvNextLevel:
? ? ? ? ? ? mtvNextLevel.setVisibility(4);
? ? ? ? ? ? tvLevel.setText("" + level);
? ? ? ? ? ? mPintuLayout.resume();
? ? ? ? ? ? break;
? ? ? ? }
? ? }

3.每一小塊退片的bean

public class ImagePieces {
? ? //小塊圖片的索引值
? ? private int index;
? ? //整個一大塊的圖片載體
? ? private Bitmap bitmap;

? ? public int getIndex() {
? ? ? ? return index;
? ? }
? ? public void setIndex(int index) {
? ? ? ? this.index = index;
? ? }
? ? public Bitmap getBitmap() {
? ? ? ? return bitmap;
? ? }
? ? public void setBitmap(Bitmap bitmap) {
? ? ? ? this.bitmap = bitmap;
? ? } ??
? ? //構造方法
? ? public ImagePieces(int index, Bitmap bitmap) {
? ? ? ? super();
? ? ? ? this.index = index;
? ? ? ? this.bitmap = bitmap;
? ? }

? ? public ImagePieces() {
? ? ? ? // TODO Auto-generated constructor stub
? ? }
? ? @Override
? ? public String toString() {
? ? ? ? return "ImagePieces [index=" + index + ", bitmap=" + bitmap + "]";
? ? }
}

4.圖片分割類

public class ImageSplitterUtil {

? ? //pieces 為切成的塊數,用list保存
? ? public static List<ImagePieces> splitImage(Bitmap bitmap,int pieces){

? ? ? ? List<ImagePieces> imagePieces = new ArrayList<ImagePieces>();

? ? ? ? int width = bitmap.getWidth();
? ? ? ? int height = bitmap.getHeight();
? ? ? ? //去小的一方每一個快的寬度
? ? ? ? int pieceWidth = Math.min(width,height)/pieces;

? ? ? ? for(int i=0;i<pieces;i++){

? ? ? ? ? ? for(int j=0;j<pieces;j++){

? ? ? ? ? ? ? ? ImagePieces imagepieces = new ImagePieces();
? ? ? ? ? ? ? ? /*
? ? ? ? ? ? ? ? ?* 1+0 2+0 3+0
? ? ? ? ? ? ? ? ?* 1+1 2+1 3+1
? ? ? ? ? ? ? ? ?*/
? ? ? ? ? ? ? ? imagepieces.setIndex(j+i*pieces);

? ? ? ? ? ? ? ? int x = j*pieceWidth;
? ? ? ? ? ? ? ? int y = i*pieceWidth;
? ? ? ? ? ? ? ? //x,y是每一塊的起點位置,piecewidth是每一塊的長度和高度,這里弄成正方形
? ? ? ? ? ? ? ? imagepieces.setBitmap(Bitmap.createBitmap(bitmap, x, y, pieceWidth, pieceWidth));
? ? ? ? ? ? ? ? //所有操作setIndex ?setBitmap 然后把所有碎片按順序加入list集合中
? ? ? ? ? ? ? ? imagePieces.add(imagepieces);
? ? ? ? ? ? } ? ? ? ? ??
? ? ? ? } ? ? ??
? ? ? ? return imagePieces;
? ? }

}

5.布局類

首先

private void init() {
? ? ? ? // 將margin的值的單位轉為dp
? ? ? ? mMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
? ? ? ? ? ? ? ? 3, getResources().getDisplayMetrics());
? ? ? ? mPadding = min(getPaddingLeft(), getPaddingRight(), getPaddingTop(),
? ? ? ? ? ? ? ? getPaddingBottom());
? ? }

其次onmeasure

@Override
? ? protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
? ? ? ? super.onMeasure(widthMeasureSpec, heightMeasureSpec);
? ? ? ? // 獲得寬度和高度的最小值
? ? ? ? mWidth = min(getMeasuredHeight(), getMeasuredWidth());
? ? ? ? if (!once) {
? ? ? ? ? ? // 進行切圖及排序
? ? ? ? ? ? initBitmap();
? ? ? ? ? ? // 設置imageview[item]的寬高等屬性
? ? ? ? ? ? initItem();
? ? ? ? ? ? // 標識已畫,防止再畫
? ? ? ? ? ? once = true;
? ? ? ? ? ? countTimeBaseLevel();
? ? ? ? }
? ? ? ? // 寬度和高度的最小值設為寬高
? ? ? ? setMeasuredDimension(mWidth, mWidth);
? ? }

其次

// 進行切圖及排序
? ? private void initBitmap() {
? ? ? ? if (mBitmap == null) {
? ? ? ? ? ? mBitmap = BitmapFactory.decodeResource(getResources(),
? ? ? ? ? ? ? ? ? ? R.drawable.psb);
? ? ? ? }
? ? ? ? mItemBitmaps = ImageSplitterUtil.splitImage(mBitmap, mColumn);

? ? ? ? // 是用sort把小塊的圖片亂序
? ? ? ? Collections.sort(mItemBitmaps, new Comparator<ImagePieces>() {

? ? ? ? ? ? @Override
? ? ? ? ? ? public int compare(ImagePieces a, ImagePieces b) {
? ? ? ? ? ? ? ? return Math.random() > 0.5 ? 1 : -1;
? ? ? ? ? ? }
? ? ? ? });

? ? }
private int mTime;

? ? // 相對關卡的時間數
? ? private void countTimeBaseLevel() {
? ? ? ? mTime = (int) Math.pow(2, mLevel) * 30;
? ? ? ? mHandler.sendEmptyMessage(TIME_CHANGED);
? ? }
// 動畫層的布局
private RelativeLayout mAnimaLayout;
private boolean isAniming;

回調接口

public interface GamePintuListener {
? ? ? ? void nextLevel(int nextLevel);

? ? ? ? void timechanged(int currentTime);

? ? ? ? void gameover();
? ? }

? ? public GamePintuListener mListener;

? ? // 設置接口回調
? ? public void setOnGamePintuListener(GamePintuListener mListener) {
? ? ? ? this.mListener = mListener;
? ? }

游戲的進程控制,這里利用的是hangler

private static final int TIME_CHANGED = 0x110;
? ? public static final int NEXT_LEVEL = 0x111;

? ? private Handler mHandler = new Handler() {
? ? ? ? public void handleMessage(android.os.Message msg) {
? ? ? ? ? ? switch (msg.what) {
? ? ? ? ? ? case TIME_CHANGED:
? ? ? ? ? ? ? ? if (isGameSuccess || isGameOver || isPausing)
? ? ? ? ? ? ? ? ? ? return;
? ? ? ? ? ? ? ? if (mListener != null) {
? ? ? ? ? ? ? ? ? ? mListener.timechanged(mTime);
? ? ? ? ? ? ? ? ? ? if (mTime == 0) {
? ? ? ? ? ? ? ? ? ? ? ? isGameOver = true;
? ? ? ? ? ? ? ? ? ? ? ? mListener.gameover();
? ? ? ? ? ? ? ? ? ? ? ? return;
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? mTime--;
? ? ? ? ? ? ? ? mHandler.sendEmptyMessageDelayed(TIME_CHANGED, 1000);
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? case NEXT_LEVEL:
? ? ? ? ? ? ? ? mLevel = mLevel + 1;
? ? ? ? ? ? ? ? if (mListener != null) {
? ? ? ? ? ? ? ? ? ? mListener.nextLevel(mLevel);
? ? ? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? ? ? nextLevel();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? }
? ? };

重新開始游戲方法

public void restart() {
? ? ? ? isGameOver = false;
? ? ? ? mColumn--;
? ? ? ? nextLevel();
? ? }

暫停和繼續的方法

private boolean isPausing;

? ? public void pause() {
? ? ? ? isPausing = true;
? ? ? ? mHandler.removeMessages(TIME_CHANGED);
? ? }

? ? public void resume() {
? ? ? ? if (isPausing) {
? ? ? ? ? ? isPausing = false;
? ? ? ? ? ? mHandler.sendEmptyMessage(TIME_CHANGED);
? ? ? ? }
? ? }

public void nextLevel() {
? ? ? ? this.removeAllViews();
? ? ? ? mAnimaLayout = null;
? ? ? ? mColumn++;
? ? ? ? isGameSuccess = false;
? ? ? ? countTimeBaseLevel();
? ? ? ? initBitmap();
? ? ? ? initItem();
? ? };
// 設置imageview[item]的寬高等屬性
? ? private void initItem() {
? ? ? ? // 把內邊距和外面距剪掉除以列數就是每一塊的寬度
? ? ? ? mItemWidth = (mWidth - mPadding * 2 - mMargin * (mColumn - 1))
? ? ? ? ? ? ? ? / mColumn;
? ? ? ? // item圖片位置的初始化
? ? ? ? mPintuItems = new ImageView[mColumn * mColumn];
? ? ? ? // item圖片的初始化
? ? ? ? for (int i = 0; i < mPintuItems.length; i++) {
? ? ? ? ? ? ImageView item = new ImageView(getContext());
? ? ? ? ? ? item.setOnClickListener(this);
? ? ? ? ? ? item.setImageBitmap(mItemBitmaps.get(i).getBitmap());
? ? ? ? ? ? mPintuItems[i] = item;
? ? ? ? ? ? item.setId(i + 1);
? ? ? ? ? ? // 在item里面存放index,當拼圖成功時候做為判斷一句
? ? ? ? ? ? item.setTag(i + "_" + mItemBitmaps.get(i).getIndex());

? ? ? ? ? ? RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
? ? ? ? ? ? ? ? ? ? mItemWidth, mItemWidth);
? ? ? ? ? ? // 設置間隙
? ? ? ? ? ? // 如果不是最后一列
? ? ? ? ? ? if ((i + 1) % mColumn != 0) {
? ? ? ? ? ? ? ? lp.rightMargin = mMargin;
? ? ? ? ? ? }
? ? ? ? ? ? // 不是第一列
? ? ? ? ? ? if (i % mColumn != 0) {
? ? ? ? ? ? ? ? lp.addRule(RelativeLayout.RIGHT_OF, mPintuItems[i - 1].getId());
? ? ? ? ? ? }
? ? ? ? ? ? // 縱向間隙
? ? ? ? ? ? // 如果不是第一行,設置topMargin和rule
? ? ? ? ? ? if ((i + 1) > mColumn) {
? ? ? ? ? ? ? ? lp.topMargin = mMargin;
? ? ? ? ? ? ? ? lp.addRule(RelativeLayout.BELOW,
? ? ? ? ? ? ? ? ? ? ? ? mPintuItems[i - mColumn].getId());
? ? ? ? ? ? }
? ? ? ? ? ? addView(item, lp);
? ? ? ? }
? ? }

交換圖片

private ImageView mFirst;
? ? private ImageView mSecond;

? ? @Override
? ? public void onClick(View v) {
? ? ? ? if (isAniming)
? ? ? ? ? ? return;
? ? ? ? if (mFirst == v) {
? ? ? ? ? ? mFirst.setColorFilter(null);
? ? ? ? ? ? mFirst = null;
? ? ? ? ? ? return;
? ? ? ? }
? ? ? ? if (mFirst == null) {
? ? ? ? ? ? mFirst = (ImageView) v;
? ? ? ? ? ? mFirst.setColorFilter(Color.parseColor("#45f0f0f0"));
? ? ? ? } else {
? ? ? ? ? ? mSecond = (ImageView) v;
? ? ? ? ? ? exchangView();
? ? ? ? }
? ? }

交換圖片的方法exchangeView方法的具體實現

// 交換image
? ? private void exchangView() {
? ? ? ? mFirst.setColorFilter(null);
? ? ? ? String firstTag = (String) mFirst.getTag();
? ? ? ? String secondTag = (String) mSecond.getTag();

? ? ? ? String[] firstParams = firstTag.split("_");
? ? ? ? String[] secondParams = secondTag.split("_");

? ? ? ? final Bitmap firstBitmap = mItemBitmaps.get(
? ? ? ? ? ? ? ? Integer.parseInt(firstParams[0])).getBitmap();

? ? ? ? final Bitmap secondBitmap = mItemBitmaps.get(
? ? ? ? ? ? ? ? Integer.parseInt(secondParams[0])).getBitmap();
? ? ? ? //設置動畫層,下面有具體實現
? ? ? ? setUpAnimLayout();

? ? ? ? ImageView first = new ImageView(getContext());
? ? ? ? first.setImageBitmap(firstBitmap);
? ? ? ? LayoutParams lp = new LayoutParams(mItemWidth, mItemWidth);
? ? ? ? lp.leftMargin = mFirst.getLeft() - mPadding;
? ? ? ? lp.topMargin = mFirst.getTop() - mPadding;
? ? ? ? first.setLayoutParams(lp);
? ? ? ? mAnimaLayout.addView(first);

? ? ? ? ImageView second = new ImageView(getContext());
? ? ? ? second.setImageBitmap(secondBitmap);
? ? ? ? LayoutParams lp2 = new LayoutParams(mItemWidth, mItemWidth);
? ? ? ? lp2.leftMargin = mSecond.getLeft() - mPadding;
? ? ? ? lp2.topMargin = mSecond.getTop() - mPadding;
? ? ? ? second.setLayoutParams(lp2);
? ? ? ? mAnimaLayout.addView(second);

? ? ? ? // 設置動畫
? ? ? ? TranslateAnimation anim = new TranslateAnimation(0, mSecond.getLeft()
? ? ? ? ? ? ? ? - mFirst.getLeft(), 0, mSecond.getTop() - mFirst.getTop());
? ? ? ? anim.setDuration(300);
? ? ? ? anim.setFillAfter(true);
? ? ? ? first.setAnimation(anim);

? ? ? ? TranslateAnimation anim2 = new TranslateAnimation(0, mFirst.getLeft()
? ? ? ? ? ? ? ? - mSecond.getLeft(), 0, mFirst.getTop() - mSecond.getTop());
? ? ? ? anim2.setDuration(300);
? ? ? ? anim2.setFillAfter(true);
? ? ? ? second.setAnimation(anim2);

? ? ? ? anim.setAnimationListener(new AnimationListener() {

? ? ? ? ? ? @Override
? ? ? ? ? ? public void onAnimationStart(Animation arg0) {

? ? ? ? ? ? ? ? mFirst.setVisibility(View.INVISIBLE);
? ? ? ? ? ? ? ? mSecond.setVisibility(View.INVISIBLE);
? ? ? ? ? ? ? ? isAniming = true;
? ? ? ? ? ? }

? ? ? ? ? ? @Override
? ? ? ? ? ? public void onAnimationRepeat(Animation arg0) {

? ? ? ? ? ? }

? ? ? ? ? ? @Override
? ? ? ? ? ? public void onAnimationEnd(Animation arg0) {
? ? ? ? ? ? ? ? mSecond.setImageBitmap(firstBitmap);
? ? ? ? ? ? ? ? mFirst.setImageBitmap(secondBitmap);

? ? ? ? ? ? ? ? String firstTag = (String) mFirst.getTag();
? ? ? ? ? ? ? ? String secondTag = (String) mSecond.getTag();

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

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

? ? ? ? ? ? ? ? mFirst = mSecond = null;

? ? ? ? ? ? ? ? mAnimaLayout.removeAllViews();
? ? ? ? ? ? ? ? // 每次移動完成判斷是否成功
? ? ? ? ? ? ? ? checkSuccess();

? ? ? ? ? ? ? ? isAniming = false;
? ? ? ? ? ? }

? ? ? ? ? ? private void checkSuccess() {
? ? ? ? ? ? ? ? boolean isSuccess = true;
? ? ? ? ? ? ? ? for (int i = 0; i < mPintuItems.length; i++) {
? ? ? ? ? ? ? ? ? ? ImageView imageview = mPintuItems[i];
? ? ? ? ? ? ? ? ? ? String[] tag = imageview.getTag().toString().split("_");

? ? ? ? ? ? ? ? ? ? if (Integer.parseInt(tag[1]) != i) {
? ? ? ? ? ? ? ? ? ? ? ? isSuccess = false;
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? if (isSuccess) {
? ? ? ? ? ? ? ? ? ? isSuccess = true;
? ? ? ? ? ? ? ? ? ? mHandler.removeMessages(TIME_CHANGED);
? ? ? ? ? ? ? ? ? ? Toast.makeText(getContext(), "level up!",
? ? ? ? ? ? ? ? ? ? ? ? ? ? Toast.LENGTH_SHORT).show();
? ? ? ? ? ? ? ? ? ? mHandler.sendEmptyMessage(NEXT_LEVEL);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? });
? ? }

動畫層的具體實現

private void setUpAnimLayout() {
? if (mAnimaLayout == null) {
? ? ? ? ? ? mAnimaLayout = new RelativeLayout(getContext());
? ? ? ? ? ? addView(mAnimaLayout);
? ? ? ? }
? ? }
//獲取多個參數的最少值作為內邊距
private int min(int... params) {
? ? ? ? int min = params[0];
? ? ? ? for (int param : params) {
? ? ? ? ? ? if (param < min) {
? ? ? ? ? ? ? ? min = param;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return min;
? ? }

原文鏈接:https://blog.csdn.net/a4384142/article/details/46432809

欄目分類
最近更新