可以把這段代碼封裝起來(lái),方便的參數(shù)是int id類型,然后全局做一個(gè)變量控制關(guān)卡的變量int t (做為數(shù)組的下標(biāo),0表示第一關(guān),1表示第二關(guān)以此類推),再做一個(gè)數(shù)組保存所有的圖片id 。int[] arr_img_id = new int[]{R.drawable.a,R.drawable.b,R.drawable.c,R.drawable.d};于是調(diào)用方法法的時(shí)候傳的id就變成了arr_img_id[t];即,第N關(guān)的的圖片就是arr_img_id[t]
2016-10-29
關(guān)鍵代碼,在//加載關(guān)卡數(shù)據(jù)的下面追加
第二關(guān)圖片如下
效果演示
2016-10-29
完整代碼如下:
2016-10-29
寫一個(gè)方法用來(lái)重置圖片即可。
步驟1:方法的參數(shù)是Bitmap的。
步驟2:重新為每個(gè)ImageView設(shè)置新的圖片,綁定新的GameData
步驟3:調(diào)用“設(shè)置最后一個(gè)方塊是空的”和“初始化隨機(jī)打亂順序方塊”方法。
如果還是實(shí)現(xiàn)不了,請(qǐng)把你的代碼貼上來(lái),我?guī)湍銓?shí)現(xiàn)再發(fā)給你。
2016-10-29
2016-10-29
2016-10-29
? //處理過(guò)關(guān)界面
? ? private void handlePassEvent(){
? ? ? ? //顯示過(guò)關(guān)界面
? ? ? ? mPassView = (LinearLayout)findViewById(R.id.pass_view);
? ? ? ? mPassView.setVisibility(View.VISIBLE);
? ? ? ? //當(dāng)前關(guān)的索引
? ? ? ? mCurrentTimeSpend=(TextView)findViewById(R.id.time_spend);
? ? ? ? if(mCurrentTimeSpend!=null){
? ? ? ? ? ? mCurrentTimeSpend.setText("用時(shí):"+timer.getText());
? ? ? ? }
? ? ? ? //下一關(guān)按鍵處理
? ? ? ? ImageButton btnPass = ( ImageButton)findViewById(R.id.btn_next);
? ? ? ? btnPass.setOnClickListener(new View.OnClickListener() {
? ? ? ? ? ? @Override
? ? ? ? ? ? public void onClick(View v) {
? ? ? ? ? ? ? ? /** ? if(judegAppPassed){
? ? ? ? ? ? ? ? ?//進(jìn)入到通關(guān)界面
? ? ? ? ? ? ? ? ?}else {*/
? ? ? ? ? ? ? ? //開始新的一關(guān)
? ? ? ? ? ? ? ? mPassView.setVisibility(View.GONE);
? ? ? ? ? ? ? ? //時(shí)間清零
? ? ? ? ? ? ? ? timer.setBase(SystemClock.elapsedRealtime());
? ? ? ? ? ? ? ? timer.start();
? ? ? ? ? ? ? ? //加載關(guān)卡數(shù)據(jù)
? ? ? ? ? ? }
? ? ? ? });
? ? }
? ? ?//判斷是否通關(guān)
? /** ?private ?boolean judegAppPassed(){
? ? ? ? return (mCurrentStageIndex== Const.SONG_INFO.length - 1);
? ? }*/
? ? //手勢(shì)判斷
? ? 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;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? //1up,2down,3left,4right
? ? }
? ? //隨即打亂順序
? ? public void randomMove(){
? ? ? ? //打亂次數(shù)
? ? ? ? for (int i = 0; i < 10; i++) {
? ? ? ? ? ? //開始交換,無(wú)動(dòng)畫
? ? ? ? ? ? int type = (int) (Math.random()*4)+1;
? ? ? ? ? ? changeByDir(type,false);
? ? ? ? }
? ? }
? ? public void changeDataByImageView(final ImageView miImageView){//重載有動(dòng)畫
? ? ? ? changeDataByImageView(miImageView,true);
? ? }
? ? //利用動(dòng)畫結(jié)束之后,交換兩個(gè)方塊數(shù)據(jù)
? ? public void changeDataByImageView(final ImageView miImageView,boolean isAnim){
? ? ? ? if (isAnimRun) {
? ? ? ? ? ? return;
? ? ? ? }
? ? ? ? if(!isAnim){
? ? ? ? ? ? GameData mGameData = (GameData) miImageView.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(miImageView);//設(shè)置當(dāng)前點(diǎn)擊的為空方塊
? ? ? ? ? ? if(isGameStart){
? ? ? ? ? ? ? ? isGameOver();//成功時(shí),彈出一個(gè)toast
? ? ? ? ? ? }
? ? ? ? ? ? return;
? ? ? ? }
? ? ? ? TranslateAnimation translateAnimation=null;//創(chuàng)建一個(gè)動(dòng)畫,設(shè)置方向,移動(dòng)距離
? ? ? ? if(miImageView.getX()>iv_null_ImageView.getX()){//當(dāng)前點(diǎn)擊在空之上
? ? ? ? ? ? translateAnimation = new TranslateAnimation(0.1f,-miImageView.getWidth(), 0.1f,0.1f);//向上移動(dòng)
? ? ? ? }else if(miImageView.getX()<iv_null_ImageView.getX()){
? ? ? ? ? ? translateAnimation = new TranslateAnimation( 0.1f,miImageView.getWidth(),0.1f,0.1f);//向下移動(dòng)
? ? ? ? }else if(miImageView.getY()>iv_null_ImageView.getY()){
? ? ? ? ? ? translateAnimation = new TranslateAnimation(0.1f, 0.1f,0.1f,-miImageView.getHeight());//向左移動(dòng)
? ? ? ? }else if(miImageView.getY()<iv_null_ImageView.getY()){
? ? ? ? ? ? translateAnimation = new TranslateAnimation(0.1f, 0.1f,0.1f,miImageView.getHeight());//向右移動(dòng)
? ? ? ? }
? ? ? ? translateAnimation.setDuration(70);//設(shè)置動(dòng)畫時(shí)常,ms
? ? ? ? translateAnimation.setFillAfter(true);//設(shè)置動(dòng)畫結(jié)束之后是否停留
? ? ? ? //設(shè)置動(dòng)畫結(jié)束之后真正交換數(shù)據(jù)
? ? ? ? translateAnimation.setAnimationListener(new Animation.AnimationListener() {
? ? ? ? ? ? @Override
? ? ? ? ? ? public void onAnimationStart(Animation animation) {
? ? ? ? ? ? ? ? isAnimRun = true;
? ? ? ? ? ? }
? ? ? ? ? ? @Override
? ? ? ? ? ? public void onAnimationRepeat(Animation animation) {
? ? ? ? ? ? }
? ? ? ? ? ? @Override
? ? ? ? ? ? public void onAnimationEnd(Animation animation) {
? ? ? ? ? ? ? ? isAnimRun = false;
? ? ? ? ? ? ? ? miImageView.clearAnimation();
? ? ? ? ? ? ? ? GameData mGameData = (GameData) miImageView.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(miImageView);//設(shè)置當(dāng)前點(diǎn)擊的為空方塊
? ? ? ? ? ? ? ? if(isGameStart){
? ? ? ? ? ? ? ? ? ? isGameOver();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? });
? ? ? ? miImageView.startAnimation(translateAnimation);//執(zhí)行動(dòng)畫
? ? }
? ? //設(shè)置空方塊,mImageView是當(dāng)前設(shè)置為空方塊的實(shí)例
? ? public void setNullImageView(ImageView mImageView){
? ? ? ? mImageView.setImageBitmap(null);
? ? ? ? iv_null_ImageView ?= mImageView;
? ? }
? ? //判斷當(dāng)前點(diǎn)擊的是否是空方塊位置為相鄰關(guān)系,mImageView所點(diǎn)擊的方塊
? ? public boolean isHasByNullImageView(ImageView mImageView){
? ? ? ? //分別獲取當(dāng)前空方塊的位置與點(diǎn)擊方塊的位置
? ? ? ? GameData mNullGameData=(GameData) iv_null_ImageView.getTag();
? ? ? ? GameData mGameData=(GameData)mImageView.getTag();
? ? ? ? if(mNullGameData.y==mGameData.y&&mNullGameData.x+1==mGameData.x){//當(dāng)前點(diǎn)擊方塊在空方塊上面
? ? ? ? ? ? return true;
? ? ? ? }else if(mNullGameData.y==mGameData.y&&mNullGameData.x-1==mGameData.x){//當(dāng)前點(diǎn)擊方塊在空方塊下面
? ? ? ? ? ? return true;
? ? ? ? }else if(mNullGameData.y==mGameData.y+1&&mNullGameData.x==mGameData.x){//當(dāng)前點(diǎn)擊方塊在空方塊左面
? ? ? ? ? ? return true;
? ? ? ? }else if(mNullGameData.y==mGameData.y-1&&mNullGameData.x==mGameData.x){//當(dāng)前點(diǎn)擊方塊在空方塊右面
? ? ? ? ? ? return true;
? ? ? ? }
? ? ? ? return false;
? ? }
? ? //小方塊的監(jiān)測(cè)數(shù)據(jù)
? ? class GameData{
? ? ? ? public int x=0;//方塊位置x
? ? ? ? public int y=0;//方塊位置y
? ? ? ? public ?Bitmap bm;//方塊圖片
? ? ? ? public int p_x;//圖片位置x
? ? ? ? public int p_y;//圖片位置y
? ? ? ? public GameData(int x, int y, Bitmap bm) {
? ? ? ? ? ? super();
? ? ? ? ? ? this.x = x;
? ? ? ? ? ? this.y = y;
? ? ? ? ? ? this.bm = bm;
? ? ? ? ? ? this.p_x = x;
? ? ? ? ? ? this.p_y = y;
? ? ? ? }
? ? ? ? //方塊的位置是否正確
? ? ? ? public boolean isTrue() {
? ? ? ? ? ? if (x==p_x&&y==p_y) {
? ? ? ? ? ? ? ? return true;
? ? ? ? ? ? }
? ? ? ? ? ? return false;
? ? ? ? }
? ? }
}
2016-10-29
package com.example.admin.pintu;
import android.app.Activity;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.os.SystemClock;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
import android.widget.Chronometer;
import android.widget.ExpandableListView;
import android.widget.GridLayout;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.example.admin.R;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
? ? private boolean isGameStart = false;//判斷游戲是否開始
? ? private boolean isGameOver = false;//判斷游戲是否結(jié)束
? ? private boolean changeDataByImageView=false;//判斷游戲是否交換數(shù)據(jù)
? ? private ImageView[][] iv_game_arr = new ImageView[3][3];//利用二維數(shù)組創(chuàng)建方塊
? ? private GridLayout gl_main_game;//主頁(yè)面
? ? private ImageView iv_null_ImageView;//當(dāng)前空方塊的實(shí)例的保存
? ? private GestureDetector mDetector;//當(dāng)前手勢(shì)
? ? private boolean isAnimRun= false;//當(dāng)前動(dòng)畫是否在執(zhí)行
? ? private Chronometer timer;
? ? private ImageButton stop;
? ? private View mPassView;
? ? private TextView mCurrentTimeSpend;
? ? private TextView mCurrentStageView;
? ? private int ?mCurrentStageIndex = 0;
? ? private ?Bitmap bigBm;
? // ?private ArrayList<BitmapDrawable> mBigBm;
? ? //設(shè)置手勢(shì)
? ? @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);
? ? ? ? setContentView(R.layout.content_main);
? ? ? ? //設(shè)置監(jiān)聽器
? ? ? ? mDetector = new GestureDetector(this,new GestureDetector.OnGestureListener() {
? ? ? ? ? ? @Override
? ? ? ? ? ? public boolean onSingleTapUp(MotionEvent arg0) {
? ? ? ? ? ? ? ? return false;
? ? ? ? ? ? }
? ? ? ? ? ? @Override
? ? ? ? ? ? public void onShowPress(MotionEvent arg0) {
? ? ? ? ? ? }
? ? ? ? ? ? @Override
? ? ? ? ? ? public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? float arg3) {
? ? ? ? ? ? ? ? return false;
? ? ? ? ? ? }
? ? ? ? ? ? @Override
? ? ? ? ? ? public void onLongPress(MotionEvent arg0) {
? ? ? ? ? ? }
? ? ? ? ? ? @Override
? ? ? ? ? ? public boolean onFling(MotionEvent arg0, MotionEvent arg1, float arg2,float arg3) {
? ? ? ? ? ? ? ? int type = getDirByGes(arg0.getX(), arg0.getY(), arg1.getX(), arg1.getY());
? ? ? ? ? ? ? ? changeByDir(type);//傳遞方法
? ? ? ? ? ? ? ? return false;
? ? ? ? ? ? }
? ? ? ? ? ? @Override
? ? ? ? ? ? public boolean onDown(MotionEvent arg0) {
? ? ? ? ? ? ? ? return false;
? ? ? ? ? ? }
? ? ? ? });
? ? ? ? //獲取時(shí)間和停止按鈕資源
? ? ? ? this.timer = (Chronometer)findViewById(R.id.chronometer);
? ? ? ? this.stop=(ImageButton)findViewById(R.id.imageButton);
? ? ? ? stop.setOnClickListener(isstop);
? ? ? ? //顯示當(dāng)前關(guān)的索引
? ? ? ? mCurrentStageView = (TextView) findViewById(R.id.textView);
? ? ? ? if (mCurrentStageView != null) {
? ? ? ? ? ? mCurrentStageView.setText("第" + (mCurrentStageIndex + 1) + "關(guān)");
? ? ? ? }
? ? ? ? //初始化游戲小方塊
? ? ? ? ? ? //獲取一張大圖
? ? ? ? ? ? Bitmap ?bigBm = ((BitmapDrawable) getResources().getDrawable(R.drawable.a)).getBitmap();
? ? ? ? ? ? int tuWandH = bigBm.getWidth() / 3;//每個(gè)小方塊的寬和高
? ? ? ? ? ? int ivWandH = getWindowManager().getDefaultDisplay().getWidth() / 3;//小方塊寬應(yīng)為整個(gè)屏幕/3
? ? ? ? ? ? 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 * tuWandH, i * tuWandH, tuWandH, tuWandH);//根據(jù)行列切成游戲圖片
? ? ? ? ? ? ? ? ? ? iv_game_arr[i][j] = new ImageView(this);
? ? ? ? ? ? ? ? ? ? iv_game_arr[i][j].setImageBitmap(bm);//設(shè)置每一個(gè)方塊的圖標(biāo)
? ? ? ? ? ? ? ? ? ? iv_game_arr[i][j].setLayoutParams(new RelativeLayout.LayoutParams(ivWandH, ivWandH));
? ? ? ? ? ? ? ? ? ? iv_game_arr[i][j].setPadding(2, 2, 2, 2);//設(shè)置方塊間距
? ? ? ? ? ? ? ? ? ? iv_game_arr[i][j].setTag(new GameData(i, j, bm));//綁定自定義數(shù)據(jù)
? ? ? ? ? ? ? ? ? ? iv_game_arr[i][j].setOnClickListener(new View.OnClickListener() {
? ? ? ? ? ? ? ? ? ? ? ? @Override
? ? ? ? ? ? ? ? ? ? ? ? public void onClick(View v) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? boolean flag = isHasByNullImageView((ImageView) v);
? ? ? ? ? ? ? ? ? ? ? ? ? ? if (flag) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? changeDataByImageView((ImageView) v);
? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? });
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? //初始化游戲界面,添加方塊
? ? ? ? ? ? gl_main_game = (GridLayout) findViewById(R.id.gl_main_game);
? ? ? ? ? ? for (int i = 0; i < iv_game_arr.length; i++) {
? ? ? ? ? ? ? ? for (int j = 0; j < iv_game_arr[0].length; j++) {
? ? ? ? ? ? ? ? ? ? gl_main_game.addView(iv_game_arr[i][j]);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? setNullImageView(iv_game_arr[2][2]);//設(shè)置最后一個(gè)方塊是空的
? ? ? ? ? ? randomMove();//初始化隨機(jī)打亂順序
? ? ? ? ? ? isGameStart = true;//開始游戲狀態(tài)
? ? ? ? ? ? timer.start();
? ? ? ? }
? ? //重載,由于開始100次隨即無(wú)動(dòng)畫
? ? public void changeByDir(int type){
? ? ? ? changeByDir(type,true);
? ? }
? ? //根據(jù)手勢(shì)方向獲取空方塊相鄰位置,存在方塊,進(jìn)行數(shù)據(jù)交換,1up,2down,3left,4right
? ? public void changeByDir(int type,boolean isAnim){
? ? ? ? GameData mNullGameData=(GameData) iv_null_ImageView.getTag();//獲取當(dāng)前空方塊位置
? ? ? ? int new_x=mNullGameData.x;//根據(jù)方向設(shè)置相應(yīng)位置坐標(biāo)
? ? ? ? int new_y=mNullGameData.y;
? ? ? ? if (type==1) {//要移動(dòng)的方塊在空的下面
? ? ? ? ? ? new_x++;
? ? ? ? }else if (type==2) {
? ? ? ? ? ? new_x--;
? ? ? ? }else if (type==3) {
? ? ? ? ? ? new_y++;
? ? ? ? }else if (type==4) {
? ? ? ? ? ? new_y--;
? ? ? ? }
? ? ? ? //判斷新坐標(biāo)是否存在
? ? ? ? if(new_x>=0&&new_x<iv_game_arr.length&&new_y>=0&&new_y<iv_game_arr[0].length){
? ? ? ? ? ? if (isAnim) {
? ? ? ? ? ? ? ? changeDataByImageView(iv_game_arr[new_x][new_y]);//存在,移動(dòng)
? ? ? ? ? ? }else {//無(wú)動(dòng)畫
? ? ? ? ? ? ? ? changeDataByImageView(iv_game_arr[new_x][new_y],isAnim);
? ? ? ? ? ? }
? ? ? ? }else {
? ? ? ? ? ? //不用做什么
? ? ? ? }
? ? }
? ? //游戲暫停
? ? private View.OnClickListener isstop=new View.OnClickListener() {
? ? ? ? @Override
? ? ? ? public void onClick(View v) {
? ? ? ? ? ? timer.stop();
? ? ? ? }
? ? };
? ? //判斷游戲結(jié)束方法
? ? public void isGameOver(){
? ? ? ? boolean isGameOver = true;
? ? ? ? //遍歷每個(gè)游戲方塊
? ? ? ? for (int i = 0; i < iv_game_arr.length; i++) {
? ? ? ? ? ? for (int j = 0; j < iv_game_arr[0].length; j++) {
? ? ? ? ? ? ? ? //為空的方塊數(shù)據(jù)跳過(guò)
? ? ? ? ? ? ? ? if (iv_game_arr[i][j]==iv_null_ImageView) {
? ? ? ? ? ? ? ? ? ? continue;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? GameData mGameData=(GameData) iv_game_arr[i][j].getTag();
? ? ? ? ? ? ? ? if(!mGameData.isTrue()){
? ? ? ? ? ? ? ? ? ? isGameOver = false;
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? //根據(jù)一個(gè)開關(guān)變量決定是否結(jié)束
? ? ? ? if (isGameOver) {
? ? ? ? ? ? timer.stop();
? ? ? ? ? ? handlePassEvent();
? ? ? ? }
? ? }
??