Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android—拼圖小游戲

Android—拼圖小游戲

編輯:關於Android編程

拼圖小游戲

icon:
這裡寫圖片描述
選擇界面:
這裡寫圖片描述
兩個難度界面:
這裡寫圖片描述這裡寫圖片描述
成功界面:
這裡寫圖片描述
然後 這個是跟著視頻教程寫的 也是第一次寫關於圖片分割和動畫的這些
大概步驟是:<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPjxzdHJvbmc+MS6z9cq8u6/Tzs+31ve958Pmus23vb/pPC9zdHJvbmc+PGJyIC8+DQo8c3Ryb25nPjIuyejWw8SzuPa3vb/pzqrIsb/at72/6dXi0fk8L3N0cm9uZz48YnIgLz4NCjxzdHJvbmc+My7F0LbPteO797XEt72/6dPrv9W3vb/ptcS52M+1IMrHt/HKx8/gwdq1xCC147v3t72/6dbcsd/Kxzwvc3Ryb25nPjxiciAvPg0KPHN0cm9uZz638bTm1NrIsb/pt72/6Twvc3Ryb25nPjxiciAvPg0KPHN0cm9uZz41Lsixv+m3vb/p0+u147v3t72/6bXEyv2+3b27u7s8L3N0cm9uZz48YnIgLz4NCjxzdHJvbmc+Ni678cihytbKxrXEt73P8jwvc3Ryb25nPjxiciAvPg0KPHN0cm9uZz43Lrj5vt3K1srG1rTQ0L27u7u2r9f3PC9zdHJvbmc+PGJyIC8+DQo8c3Ryb25nPjguy+a7+rTywtLLs9DyPC9zdHJvbmc+PGJyIC8+DQo8c3Ryb25nPjkuxdC2z9POz7e94cr4PC9zdHJvbmc+PC9wPg0KPHA+PHN0cm9uZz4xLrP1yry7r9POz7fW973nw+a6zbe9v+k8L3N0cm9uZz48YnIgLz4NCrP1yry7r7D8wKiz9cq8u6/Tzs+3tcTW973nw+Yg0KG3vbjxIMO/uPbQobe9uPG1xMr9vt08YnIgLz4NCrvxyKHSu9XFtPPNvCDNqLn9y6vW2NGtu7e9q7TzzbzH0M6qyPS4ybj20KG3vbjxILKix9LOqsO/0ru49tCht7248bDztqjK/b7dPGJyIC8+DQrL+dLUzOHHsLfi17DBy9Xi0fnSu7j2wOBHYW1lRGF0ZTwvcD4NCjxwcmUgY2xhc3M9"brush:java;"> /* 每個游戲小方塊的數據 實際位置x 實際位置y 每個方塊的圖片bm 每個小方塊圖片的位置p_x 每個小方塊圖片的位置 p_y*/ class GameDate{ public int x = 0; public int y = 0; public Bitmap bm; public int p_x=0; public int p_y=0; public GameDate(int x,int y,Bitmap bm){ this.bm = bm; this.x=x; this.y = y; this.p_x = x; this.p_y = y; } //判斷每個小方塊的位置是否正確 public Boolean isTrue(){ if (x==p_x&&y==p_y){ return true; } return false; } }

2.設置某個方塊為缺口方塊這樣
因為要交換所以肯定要有一個是空白的格子才可以進行交換啊
所以我們在初始化的時候就選擇一個合適的位置初始化為空格方塊
定義全局變量private ImageView main_nullImage;
初始化它

 /*設置某個方塊為缺口方塊*/
    public void setNullImageView(ImageView nullImageView){

        nullImageView.setImageBitmap(null);
        main_nullImage=nullImageView;
    }

3.判斷點擊的方塊與空方塊的關系 是否是相鄰的 點擊方塊周邊是
否存在缺塊方塊
點擊的方塊相鄰必須有空白方塊才可以交換 所以必須要判斷當前點擊的方塊是否相鄰空白方塊
是根據當前點擊的方塊實例中的坐標關系和空白方塊的坐標關系 分別判斷上下左右是否相差為1來判斷是否相鄰 返回值為boolean 類型

 /*   判斷點擊的方塊與空方塊的關系 是否是相鄰的*/
    public boolean ifHasNullImageView(ImageView clickImageView){
        //分別獲取當前空方塊的位置和點擊方塊的位置的實例
        GameDate nullImage = (GameDate) main_nullImage.getTag();
        GameDate gameDate = (GameDate)clickImageView.getTag();

        if (nullImage.y==gameDate.y&&nullImage.x==gameDate.x+1){//上面
            return true;

        }else if (nullImage.y==gameDate.y&&nullImage.x==gameDate.x-1){//下面
            return  true;

        }else if (nullImage.y==gameDate.y+1&&nullImage.x==gameDate.x){//左邊
            return  true;

        }else if (nullImage.y==gameDate.y-1&&nullImage.x==gameDate.x){//右邊
            return  true;

        }
        return  false;
    }

5.缺塊方塊與點擊方塊的數據交換
當返回值為true時證明相鄰於空白方塊
所以要進行數據交換和圖像交換 這裡就有動畫的東西了

   /*利用動畫結束後交換兩個方塊的數據*/
    public  void changeDataByImageView( ImageView imageView){
        changeDataByImageView(imageView, true);
    }
    public  void changeDataByImageView(final ImageView imageView,Boolean istrue){

        if (!istrue){
            GameDate gameDate = (GameDate)imageView.getTag();
            main_nullImage.setImageBitmap(gameDate.bm);
            GameDate nullgamedata = (GameDate)main_nullImage.getTag();
            nullgamedata.bm = gameDate.bm;
            nullgamedata.p_x = gameDate.p_x;
            nullgamedata.p_y = gameDate.p_y;
            setNullImageView(imageView);
            if (isGameStart) {
                isGameOver();
            }
            return;
        }
        TranslateAnimation translateAnimation=null;
        if (imageView.getX()>main_nullImage.getX()){//根據點擊位置和空方塊的位置來設置動畫
            translateAnimation = new TranslateAnimation(0.1f,-imageView.getHeight(),0.1f,0.1f);
        }else if(imageView.getX()main_nullImage.getY()){
            translateAnimation = new TranslateAnimation(0.1f,0.1f,0.1f,-imageView.getHeight());
        }else if(imageView.getY()

6.獲取手勢的方向 實現不僅點擊可以交換在屏幕通過手勢控制也可以進行游戲 所以需要獲取手勢的方向 獲取手勢方向主要是要傳入四個參數 分別是滑動前和滑動後的兩組數據 來判斷滑動的方向 創建一個GestureDetector實例 重寫裡面的onFling方法 在這個裡面調用

 /*手勢判斷 是向哪個方向滑動根據滑動的手勢之間的坐標值來決定的 */
    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;

            }
        }

    }

7.根據手勢執行交換動作
根據手勢的返回值 來判斷當前圖片的實例裡面的數據是怎麼改變的

  public void changeByDir(int type){
        changeByDir(type,true);
    }
    public void changeByDir(int type,Boolean ishas){
        GameDate nullGameDate = (GameDate)main_nullImage.getTag();
        int new_x = nullGameDate.x;
        int new_y = nullGameDate.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=0&&new_y

8.隨機打亂順序 隨機打亂順序是游戲第一次進入應該是系統自動打亂 所以我們隨機產生1到4 的值來代表方向然後進行隨機打亂調用之前封裝好的交換但是應該是沒有動畫的 所以我們重載了那個

  public  void changeDataByImageView( ImageView imageView){
        changeDataByImageView(imageView, true);
    }
    public  void changeDataByImageView(final ImageView imageView,Boolean istrue){
    }

這樣就可以看見通過傳入參數來判斷是否需要動畫來調用了;
具體代碼下面有
然後通過循環的次數來設置難度 就是系統打亂的次數;
t是打亂次數

 public void randomMove(int t){

        for (int i = 0;i

9.判斷游戲結束 邏輯就是判斷實際位置是否與當前位置一致 一致就證明是成功啦

下面是游戲主界面的涉及的所有代碼

package com.example.katherine_qj.playgame;

import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
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.Button;
import android.widget.GridLayout;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private Boolean isGameStart = false;
   /* 利用二維數組創建若干個游戲小方塊*/
    private ImageView[][] game_arr = new ImageView[5][3];
    /*游戲主界面*/
    private GridLayout main_game;
    //當前空方塊的實例
    private ImageView main_nullImage;
    private GestureDetector gestureDetector;
    private Button return_a;
    private Button tip_a;
    private TextView title;
    private int count;

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        return gestureDetector.onTouchEvent(event);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        gestureDetector.onTouchEvent(ev);
        return super.dispatchTouchEvent(ev);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        gestureDetector = new GestureDetector(this, new GestureDetector.OnGestureListener() {
            @Override
            public boolean onDown(MotionEvent e) {
                return false;
            }

            @Override
            public void onShowPress(MotionEvent e) {

            }

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

            @Override
            public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
                return false;
            }

            @Override
            public void onLongPress(MotionEvent e) {

            }

            @Override
            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
                changeByDir( getDirByGes(e1.getX(), e1.getY(), e2.getX(), e2.getY()));
                //手勢執行一瞬間的方法操作

             //   Toast.makeText(MainActivity.this,""+getDirByGes(e1.getX(),e1.getY(),e2.getX(),e2.getY()),Toast.LENGTH_SHORT).show();
                return false;
            }
        });
        setContentView(R.layout.activity_main);
        title = (TextView)findViewById(R.id.title);
        Intent intent = getIntent();
        String level = intent.getStringExtra("Level");
        //獲取一張大圖
        Bitmap big = ((BitmapDrawable)getResources().getDrawable(R.drawable.ababa)).getBitmap();
        int tuWandH = big.getHeight()/5;
       /* 初始化游戲若干個小方塊,利用雙重循環*/
        for (int i =0;iMath.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 changeByDir(int type){
        changeByDir(type,true);
    }
    public void changeByDir(int type,Boolean ishas){
        GameDate nullGameDate = (GameDate)main_nullImage.getTag();
        int new_x = nullGameDate.x;
        int new_y = nullGameDate.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=0&&new_ymain_nullImage.getX()){//根據點擊位置和空方塊的位置來設置動畫
            translateAnimation = new TranslateAnimation(0.1f,-imageView.getHeight(),0.1f,0.1f);
        }else if(imageView.getX()main_nullImage.getY()){
            translateAnimation = new TranslateAnimation(0.1f,0.1f,0.1f,-imageView.getHeight());
        }else if(imageView.getY()        
   
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved