Android实现拼图小游戏

本文实例为大家分享了Android实现拼图小游戏的具体代码,供大家参考,具体内容如下

目标效果:

 Android实现拼图小游戏_第1张图片

1.activity_main.xml页面:



 
 
 
 

2.MainActivity.java页面:

package com.example.vivinia.puzzle;
 
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
import android.widget.GridLayout;
import android.widget.ImageView;
import android.widget.Toast;
 
public class MainActivity extends AppCompatActivity {
 
 /**
 * 当前动画是否正在执行
 */
 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);
 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 e1, MotionEvent e2, float v, float v1) {
 int type=getDirByGes(e1.getX(),e1.getY(),e2.getX(),e2.getY());
 changeByDir(type);
 return false;
 }
 });
 setContentView(R.layout.activity_main);
 //初始化游戏的若干个小方块
 Bitmap bigBm=((BitmapDrawable)getResources().getDrawable(R.drawable.puzzle_bg)).getBitmap();
 int everyWidth=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*everyWidth,i*everyWidth,everyWidth,everyWidth);//根据行列来切成若干个游戏小图片
 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 View.OnClickListener() {
 @Override
 public void onClick(View view) {
 boolean flag=isHasByNullImageView((ImageView)view);
 if(flag){
 changeDataByImageView((ImageView)view);
 }
 }
 });
 }
 }
 //初始化游戏主界面,并添加若干个小方块
 gl_main_game = (GridLayout) findViewById(R.id.gl_main_game);
 for(int i=0;i=0&&new_x=0&&new_yMath.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 randomMove(){
 //打乱的次数
 for(int i=0;i<10;i++){
 //根据手势开始交换,无动画
 int type=(int)(Math.random()*4)+1;
 changeByDir(type,false);
 }
 }
 public void changeDataByImageView(final ImageView mImageView) {
 changeDataByImageView(mImageView,true);
 }
 
 /**
 * 利用动画结束之后,交换两个方块的数据
 * @param mImageView 点击的方块
 * @param isAnim true:有动画,false:无动画
 */
 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) {
 isGameOver(); //成功时谈一个toast
 }
 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.getY()){ //当前点击的方块在空方块下边
 //往左移动
 translateAnimation=new TranslateAnimation(0.1f,0.1f,0.1f,-mImageView.getWidth());
 }
 else if(mImageView.getX() 
 

3.设置去掉标题栏样式

styles.xml页面:


 
 
 
 

4.清单文件中使用该样式

AndroidManifest.xml页面:



 
 
 
 
 
 
 
 
 
 
 

源码下载:点击打开链接

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

你可能感兴趣的:(Android实现拼图小游戏)