在好例子网,分享、交流、成长!
您当前所在位置:首页Java 开发实例Android平台开发 → android 拼图游戏 源码下载

android 拼图游戏 源码下载

Android平台开发

下载此实例
  • 开发语言:Java
  • 实例大小:3.56M
  • 下载次数:33
  • 浏览次数:402
  • 发布时间:2017-06-11
  • 实例类别:Android平台开发
  • 发 布 人:niushiyi
  • 文件格式:.zip
  • 所需积分:2
 相关标签: 游戏 拼图

实例介绍

【实例简介】

【实例截图】

【核心代码】

package com.fcwy.puzzle;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.GridView;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.fcwy.puzzle.adapter.GridItemsAdapter;
import com.fcwy.puzzle.domain.ItemBean;
import com.fcwy.puzzle.utils.AppConstant;
import com.fcwy.puzzle.utils.GameUtil;
import com.fcwy.puzzle.utils.HImage;
import com.fcwy.puzzle.utils.HLog;
import com.fcwy.puzzle.utils.HToast;
import com.fcwy.puzzle.utils.ImageLoaderUtil;
import com.fcwy.puzzle.utils.ImageUtil;
import com.fcwy.puzzle.utils.MD5;
import com.fcwy.puzzle.utils.PathUtil;
import com.fcwy.puzzle.utils.ScreenUtil;
import com.fcwy.puzzle.view.PopupWindowBrowse;
import com.fcwy.puzzle.view.PopupWindowBrowse.CheckboxClickListener;
import com.umeng.analytics.MobclickAgent;
import com.umeng.update.UmengUpdateAgent;
import com.umeng.update.UmengUpdateListener;
import com.umeng.update.UpdateResponse;
import com.umeng.update.UpdateStatus;


public class MainActivity extends Activity implements OnClickListener ,OnTouchListener{

  
    private Bitmap picSelected;
    // 拼图完成时显示的最后一个图片
    public static Bitmap lastBitmap;
    // PuzzlePanel
    private GridView gv_puzzle_main_detail;
    private int resId;
    private String picPath;
    private ImageView imageView;
    // Button
    private ImageButton btnBack;
    private ImageButton btn_refresh;
    private ImageButton btn_select;
    private ImageButton btn_local;
    private ImageButton btnRestart;
    // 显示步数
    private TextView tv_puzzle_main_counts;
    // 计时器
    private TextView tv_Timer;
    // 切图后的图片
    private List<Bitmap> bitmapItemLists = new ArrayList<Bitmap>();
    // GridView适配器
    private GridItemsAdapter adapter;
    // 设置为N*N显示
    public static int type = 4;
    // Flag 是否已显示原图
    private boolean isShowImg;
    // 步数显示
    public static int countIndex = 0;
    // 计时显示
    public static int timerIndex = 0;
    // 计时器类
    private Timer timer;
    private int[][] photoMap=null; 
    private long mLastBackPress;
	private static final long mBackPressThreshold = 3000;
	private static final int SELECT_PIC_BY_PICK_PHOTO = 1;
	private Toast pressBackToast;
    /**
     * UI更新Handler
     */
	private int autoIdx=0;
	private final int photoLength=56;
	private ImageView iv_photo;
	private PopupWindowBrowse browseWindow;
	private LinearLayout rootLayout;
	private String selectPath=null;
	private int selectPos=0;
    private Handler handler = new Handler() {

	@Override
	public void handleMessage(Message msg) {
	    switch (msg.what) {
	    case 1:
		// 更新计时器
		timerIndex  ;
		tv_Timer.setText(GameUtil.timeParser(timerIndex));
		break;
	    default:
		break;
	    }
	}
    };

    /**
     * 计时器线程
     */
    private TimerTask timerTask;

    @SuppressLint("ShowToast")
	@Override
    protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_main);
	// 选择默认图片还是自定义图片
	resId = R.drawable.photo;
	// 对图片处理
	pressBackToast = Toast.makeText(getApplicationContext(),"再按一次退出游戏", Toast.LENGTH_SHORT);
	// 初始化Views
	initViews();
	// 获取选择的图片
	initPuzzlePhoto();
	// 生成游戏数据
	generateGame();
	// GridView点击事件
//	gv_puzzle_main_detail.setOnItemClickListener(new OnItemClickListener() {
//
//	    @Override
//	    public void onItemClick(AdapterView<?> arg0, View view, int position, long arg3) {
//	    	doItemSelect(position);
//	    }
//	});
	gv_puzzle_main_detail.setOnTouchListener(this);
	// 返回按钮点击事件
	btnBack.setOnClickListener(this);
	btn_refresh.setOnClickListener(this);
	// 显示原图按钮点击事件
	//btnImage.setOnClickListener(this);
	// 重置按钮点击事件
	btnRestart.setOnClickListener(this);
	btn_select.setOnClickListener(this);
	btn_local.setOnClickListener(this);
	iv_photo.setOnClickListener(this);
	//checkAppUpdate();
    }

    /**
     * Button点击事件
     */
    @Override
    public void onClick(View v) {
	switch (v.getId()) {
//	// 返回按钮点击事件
	case R.id.btn_back:
	    finish();
	    break;
//	// 显示原图按钮点击事件
//	case R.id.btn_puzzle_main_img:
//	    Animation animShow = AnimationUtils.loadAnimation(PuzzleMain.this, R.anim.image_show_anim);
//	    Animation animHide = AnimationUtils.loadAnimation(PuzzleMain.this, R.anim.image_hide_anim);
//	    if (isShowImg) {
//		imageView.startAnimation(animHide);
//		imageView.setVisibility(View.GONE);
//		isShowImg = false;
//	    } else {
//		imageView.startAnimation(animShow);
//		imageView.setVisibility(View.VISIBLE);
//		isShowImg = true;
//	    }
//	    break;
//	// 重置按钮点击事件
	case R.id.btn_start:
	case R.id.btn_refresh:
		initPuzzlePhoto();
	    cleanConfig();
	    generateGame();
	    recreateData();
	    // 通知GridView更改UI
	    tv_puzzle_main_counts.setText(""   countIndex);
	    adapter.notifyDataSetChanged();
	    gv_puzzle_main_detail.setEnabled(true);
	    break;
	case R.id.iv_photo:
		List<String> listUrl=new ArrayList<String>();
		listUrl.add(selectPath);
		browseWindow = new PopupWindowBrowse(MainActivity.this,listUrl,0,picSelected,null);
		browseWindow.showAtLocation(rootLayout,
				Gravity.CENTER | Gravity.CENTER_HORIZONTAL, 0, 0);			
		break;
	case R.id.btn_select:
		final List<String> listPhoto=new ArrayList<String>();
		CheckboxClickListener listner=new CheckboxClickListener() {
			
			@Override
			public void onConfirm(int position) {
				// TODO Auto-generated method stub	
				selectPos=position;
				selectPath=PathUtil.CACHE_IMG MD5.md5(listPhoto.get(position));
        		Bitmap picSelectedTemp=HImage.getLocalThumbImg(selectPath, 720, 1280);
        		if(picSelectedTemp==null) {
        			picSelectedTemp=BitmapFactory.decodeResource(getResources(), resId);
        		}
        		iv_photo.setImageBitmap(picSelectedTemp);
        		handlerImage(picSelectedTemp);
				cleanConfig();
			    generateGame();
			    recreateData();
			    // 通知GridView更改UI
			    tv_puzzle_main_counts.setText(""   countIndex);
			    adapter.notifyDataSetChanged();
			    gv_puzzle_main_detail.setEnabled(true);
			}
		};
		browseWindow = new PopupWindowBrowse(MainActivity.this,listPhoto,selectPos,null,listner);
		browseWindow.showAtLocation(rootLayout,
				Gravity.CENTER | Gravity.CENTER_HORIZONTAL, 0, 0);	
		break;
	case R.id.btn_local:
		//本地相册
		pickPhoto();
		break;
	}
    }
    private void pickPhoto() {
		// TODO Auto-generated method stub
		Intent choosePictureIntent = new Intent(Intent.ACTION_PICK,
				android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
		startActivityForResult(choosePictureIntent, SELECT_PIC_BY_PICK_PHOTO);
	}
	private void initPuzzlePhoto() {
//		int id=new Random().nextInt(photoLength-2) 2;
//		selectPos=id-2;
		//selectPath=PathUtil.CACHE_IMG MD5.md5(AppConstant.BASE_PHOTO_URL id ".jpg");
		Bitmap picSelectedTemp=null;//HImage.getLocalBitMap(MainActivity.this, selectPath, false);
		if(picSelectedTemp==null) {
			picSelectedTemp=BitmapFactory.decodeResource(getResources(), resId);
		}
		iv_photo.setImageBitmap(picSelectedTemp);
		handlerImage(picSelectedTemp);
		
	}
    private void generateGame() {
	// 切图 获取初始拼图数据 正常顺序
	new ImageUtil().createInitBitmaps(type, picSelected, MainActivity.this);
	// 生成随机数据
	GameUtil.getPuzzleGenerator();
	// 获取Bitmap集合
	//int length=GameUtil.itemBeans.size();
	photoMap=new int[type][type];
	for (ItemBean temp : GameUtil.itemBeans) {
	   bitmapItemLists.add(temp.getBitmap());	   
	}
	for(int y=0;y<type;y  ) {
		for(int x=0;x<type;x  ) {
			photoMap[x][y]=x y*type;
		}
	}
	autoIdx = photoMap.length - 1;
	// 数据适配器
	adapter = new GridItemsAdapter(this, bitmapItemLists);
	gv_puzzle_main_detail.setAdapter(adapter);

	// 启用计时器
	timer = new Timer(true);
	// 计时器线程
	timerTask = new TimerTask() {

	    @Override
	    public void run() {
	    	handler.sendEmptyMessage(1);
	    }
	};
	// 每1000ms执行 延迟0s
	timer.schedule(timerTask, 0, 1000);
    }
    public void checkAppUpdate() {
		//检查更新
		UmengUpdateAgent.setUpdateOnlyWifi(false);
		UmengUpdateAgent.setUpdateListener(new UmengUpdateListener() {
			
			@Override
			public void onUpdateReturned(int updateStatus,UpdateResponse updateInfo) {			
				switch (updateStatus) {
				case UpdateStatus.Yes: // has update
						UmengUpdateAgent.showUpdateDialog(MainActivity.this, updateInfo);
					break;
				case UpdateStatus.Timeout: // time out
						//HToast.showShortText(MainActivity.this, "网络连接超时");
					break;
				}
			}
			
		});
		UmengUpdateAgent.update(MainActivity.this);				
	}
    /**
     * 添加显示原图的View
     */
    private void addImgView() {
//	RelativeLayout relativeLayout = (RelativeLayout) findViewById(R.id.rl_puzzle_main_main_layout);
//	imageView = new ImageView(PuzzleMain.this);
//	imageView.setImageBitmap(picSelected);
//	int x = (int) (picSelected.getWidth() * 0.9F);
//	int y = (int) (picSelected.getHeight() * 0.9F);
//	LayoutParams params = new LayoutParams(x, y);
//	params.addRule(RelativeLayout.CENTER_IN_PARENT);
//	imageView.setLayoutParams(params);
//	relativeLayout.addView(imageView);
//	imageView.setVisibility(View.GONE);
    }

    /**
     * 返回时调用
     */
    @Override
    protected void onStop() {
	super.onStop();
	// 清空相关参数设置
	cleanConfig();
    }

    /**
     * 清空相关参数设置
     */
    private void cleanConfig() {
	// 清空相关参数设置
	GameUtil.itemBeans.clear();
	// 停止计时器
	timer.cancel();
	timerTask.cancel();
	countIndex = 0;
	timerIndex = 0;
	// 清除拍摄的照片
	if (picPath != null) {
	    // 删除照片
//	    File file = new File(MainActivity.TEMP_IMAGE_PATH);
//	    if (file.exists()) {
//		file.delete();
//	    }
	}
    }

    /**
     * 重新获取图片
     */
    private void recreateData() {
	bitmapItemLists.clear();
	for (ItemBean temp : GameUtil.itemBeans) {
	    bitmapItemLists.add(temp.getBitmap());
	}
    }

    /**
     * 对图片处理 自适应大小
     * 
     * @param bitmap
     */
    private void handlerImage(Bitmap bitmap) {
	// 将图片放大到固定尺寸
	int screenWidth = ScreenUtil.getScreenSize(this).widthPixels;
	int screenHeigt = ScreenUtil.getScreenSize(this).heightPixels;
	picSelected = new ImageUtil().resizeBitmap(screenWidth * 0.8f, screenHeigt * 0.6f, bitmap);
    }

    /**
     * 初始化Views
     */
    private void initViews() {
	// Button  	
	btnBack = (ImageButton) findViewById(R.id.btn_back);
	//btnImage = (ImageButton) findViewById(R.id.btn_puzzle_main_img);
	btn_refresh = (ImageButton) findViewById(R.id.btn_refresh);
	btnRestart = (ImageButton) findViewById(R.id.btn_start);
	btn_select = (ImageButton) findViewById(R.id.btn_select);
	btn_local = (ImageButton) findViewById(R.id.btn_local);
	// Flag 是否已显示原图
	isShowImg = false;
	rootLayout=(LinearLayout)findViewById(R.id.puzzle_main_main_layout);
	// GV
	gv_puzzle_main_detail = (GridView) findViewById(R.id.gv_puzzle_main_detail);
	// 设置为N*N显示
	gv_puzzle_main_detail.setNumColumns(type);

	// TV步数
	tv_puzzle_main_counts = (TextView) findViewById(R.id.tv_step);
	tv_puzzle_main_counts.setText(""   countIndex);
	// TV计时器
	tv_Timer = (TextView) findViewById(R.id.tv_time);
	tv_Timer.setText("0秒");
	iv_photo= (ImageView) findViewById(R.id.iv_photo);
//	ImageView iv_temp = (ImageView) findViewById(R.id.iv_temp);
//	for(int i=2;i<=photoLength;i  ) {
//		String url=AppConstant.BASE_PHOTO_URL i ".jpg";
//		Drawable defaultDraw= getResources().getDrawable(R.drawable.blank);
//		ImageLoaderUtil.loadImageAsync("MainActivity",iv_temp, url, PathUtil.CACHE_IMG, 
//        		defaultDraw, 600); 
//	}
	// 添加显示原图的View
	addImgView();
    }

    private float startX,startY,offsetX,offsetY,lastX,lastY;

	@Override
	public boolean onTouch(View v, MotionEvent event) {

		switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN:
			startX = event.getX();
			startY = event.getY();
			lastX=(int)event.getRawX();
			lastY=(int)event.getRawY();
			break;
		case MotionEvent.ACTION_UP:
			offsetX = event.getX()-startX;
			offsetY = event.getY()-startY;
			// 若 up 与 down 都为同一个点则认为是点击事件
			if(Math.abs(event.getRawX() - lastX) <= 1 && Math.abs(event.getRawY() - lastY) <= 1){
				
			}
			if (Math.abs(offsetX)>Math.abs(offsetY)) {
				if (offsetX<-5) {
					//向左
					swipeLeft();
				}else if (offsetX>5) {
					//向右
					swipeRight();
				}
			}else{
				if (offsetY<-5) {
					//向上
					swipeUp();
				}else if (offsetY>5) {
					//向下
					swipeDown();
				}
			}
			
			break;
		}
		return true;
	}
	private void swipeLeft() {
		// 获取空格Item
		int blankId = GameUtil.blankItemBean.getItemId() - 1;
		boolean isMove=false;
		for(int y=0;y<photoMap.length;y  ) {
			for(int x=0;x<photoMap.length;x  ) {
				int position=photoMap[x][y];
				if(blankId==position) {
					for(int x1=x;x1<photoMap.length;x1  ) {
						int selectPos=photoMap[x1][y];
						isMove=doItemSelect(selectPos);
						if(isMove)break;
					}					
				}
				if(isMove)break;
			}
			if(isMove)break;
		}		
	}
	private void swipeRight() {
		// 获取空格Item
		int blankId = GameUtil.blankItemBean.getItemId() - 1;
		boolean isMove=false;
		for(int y=0;y<photoMap.length;y  ) {
			for(int x=0;x<photoMap.length;x  ) {
				int position=photoMap[x][y];
				if(blankId==position) {
					for(int x1=x;x1>=0;x1--) {
						int selectPos=photoMap[x1][y];
						isMove=doItemSelect(selectPos);
						if(isMove)break;
					}					
				}
				if(isMove)break;
			}
			if(isMove)break;
		}
	}
	private void swipeUp() {
		// 获取空格Item
		int blankId = GameUtil.blankItemBean.getItemId() - 1;
		boolean isMove=false;
		for(int x=0;x<photoMap.length;x  ) {
			for(int y=0;y<photoMap.length;y  ) {
				int position=photoMap[x][y];
				if(blankId==position) {
					for(int y1=y;y1<photoMap.length;y1  ) {
						int selectPos=photoMap[x][y1];
						isMove=doItemSelect(selectPos);
						if(isMove)break;
					}					
				}
				if(isMove)break;
			}
			if(isMove)break;
		}
		
	}
	private void swipeDown() {
		// 获取空格Item
		int blankId = GameUtil.blankItemBean.getItemId() - 1;
		boolean isMove=false;
		for(int x=0;x<photoMap.length;x  ) {
			for(int y=0;y<photoMap.length;y  ) {
				int position=photoMap[x][y];
				if(blankId==position) {
					for(int y1=y;y1>=0;y1--) {
						int selectPos=photoMap[x][y1];
						isMove=doItemSelect(selectPos);
						if(isMove)break;
					}					
				}
				if(isMove)break;
			}
			if(isMove)break;
		}
	}
	private boolean doItemSelect(int position) {
		boolean isMove=false;
		// 判断是否可移动
		if (GameUtil.isMoveable(position)) {
		    // 交换点击Item与空格的位置
		    GameUtil.swapItems(GameUtil.itemBeans.get(position), GameUtil.blankItemBean);
		    // 重新获取图片
		    recreateData();
		    // 通知GridView更改UI
		    adapter.notifyDataSetChanged();
		    // 更新步数
		    countIndex  ;
			tv_puzzle_main_counts.setText(""   countIndex);
		    isMove=true;
		    // 判断是否成功
		    if (GameUtil.isSuccess()) {
		    	// 将最后一张图显示完整
		    	recreateData();
		    	bitmapItemLists.remove(type * type - 1);
		    	bitmapItemLists.add(lastBitmap);
		    	// 通知GridView更改UI
		    	adapter.notifyDataSetChanged();
		    	Toast.makeText(MainActivity.this, "恭喜,拼图成功!", Toast.LENGTH_LONG).show();
		    	gv_puzzle_main_detail.setEnabled(false);
		    	timer.cancel();
		    	timerTask.cancel();
		    }
		}
		return isMove;
	}
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		super.onActivityResult(requestCode, resultCode, data);
		if (resultCode == RESULT_OK) {
			 if(requestCode==SELECT_PIC_BY_PICK_PHOTO) {
				//选择图库图片结果
				Uri photoUri = data.getData();
				selectPath = HImage.getPicPathFromUri(photoUri, this);	
        		Bitmap picSelectedTemp=HImage.getLocalThumbImg(selectPath, 720, 1280);
        		if(picSelectedTemp==null) {
        			picSelectedTemp=BitmapFactory.decodeResource(getResources(), resId);
        		}
        		iv_photo.setImageBitmap(picSelectedTemp);
        		handlerImage(picSelectedTemp);
        		cleanConfig();
        	    generateGame();
        	    recreateData();
        	    // 通知GridView更改UI
        	    tv_puzzle_main_counts.setText(""   countIndex);
        	    adapter.notifyDataSetChanged();
        	    gv_puzzle_main_detail.setEnabled(true);
			}
		}
	}
	@Override 
	public void onResume() {
	    super.onResume();
	    MobclickAgent.onResume(this);       //统计时长
	}
	@Override 
	public void onPause() {
	    super.onPause();
	    MobclickAgent.onPause(this);
	}
	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		if(timer!=null) {
			timer.cancel();
			timerTask.cancel();
		}
	}
	@Override
	public void onBackPressed() {
	    long currentTime = System.currentTimeMillis();
	    if (Math.abs(currentTime - mLastBackPress) > mBackPressThreshold) {
	        pressBackToast.show();
	        mLastBackPress = currentTime;
	    } else {
	    	pressBackToast.cancel();
	        super.onBackPressed();
	    }
	}
}

标签: 游戏 拼图

实例下载地址

android 拼图游戏 源码下载

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警