Android拼图游戏开发全纪录5

               

今天我们终于可以把这个项目给结束掉啦,有了前几天的准备,相信最后一天还是比较轻松的,国际惯例:


最后要完成的就是我们的主要功能--拼图界面。

布局比较简单,在前几天就已经做好了,现在我们要做的是以下几件事情:

1、计时记步:这个是游戏基本都有的功能,其实也比较简单,记录成功移动的步数、显示一个计时器就行了。

2、处理图片,调整为合适的大小比例:这个方法在前几天已经实现了

3、点击GridView后移动图片:是否能移动的方法已经在前几天实现了

4、判断是否拼图完成:唉,也已经实现了

5、点击原图按钮:显示原图:只要显示一个ImageView就可以了

6、点击重置按钮:将传进来的这张图片重新处理一遍流程

基本思路写完了,看来很复杂的事情,是不是梳理下就觉得很简单了,很多准备工作做好了,会让我们的思路变的更清晰。


package com.xys.xpuzzle.activity;import java.io.File;import java.util.ArrayList;import java.util.List;import java.util.Timer;import java.util.TimerTask;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.View;import android.view.View.OnClickListener;import android.view.animation.Animation;import android.view.animation.AnimationUtils;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.Button;import android.widget.GridView;import android.widget.ImageView;import android.widget.RelativeLayout;import android.widget.RelativeLayout.LayoutParams;import android.widget.TextView;import android.widget.Toast;import com.xys.xpuzzle.R;import com.xys.xpuzzle.adapter.GridItemsAdapter;import com.xys.xpuzzle.bean.ItemBean;import com.xys.xpuzzle.util.GameUtil;import com.xys.xpuzzle.util.ImagesUtil;import com.xys.xpuzzle.util.ScreenUtil;/** * 拼图逻辑主界面:面板显示 *  * @author xys *  */public class PuzzleMain extends Activity implements OnClickListener {    // 选择的图片    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 Button btnBack;    private Button btnImage;    private Button 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 = 2;    // Flag 是否已显示原图    private boolean isShowImg;    // 步数显示    public static int countIndex = 0;    // 计时显示    public static int timerIndex = 0;    // 计时器类    private Timer timer;    /**     * UI更新Handler     */    private Handler handler = new Handler() { @Override public void handleMessage(Message msg) {     switch (msg.what) {     case 1:  // 更新计时器  timerIndex++;  tv_Timer.setText("" + timerIndex);  break;     default:  break;     } }    };    /**     * 计时器线程     */    private TimerTask timerTask;    @Override    protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.xpuzzle_puzzle_detail_main); // 获取选择的图片 Bitmap picSelectedTemp; // 选择默认图片还是自定义图片 resId = getIntent().getExtras().getInt("picSelectedID"); picPath = getIntent().getExtras().getString("picPath"); if (resId != 0) {     picSelectedTemp = BitmapFactory.decodeResource(getResources(), resId); } else {     picSelectedTemp = BitmapFactory.decodeFile(picPath); } type = getIntent().getExtras().getInt("type", 2); // 对图片处理 handlerImage(picSelectedTemp); // 初始化Views initViews(); // 生成游戏数据 generateGame(); // GridView点击事件 gv_puzzle_main_detail.setOnItemClickListener(new OnItemClickListener() {     @Override     public void onItemClick(AdapterView<?> arg0, View view, int position, long arg3) {  // 判断是否可移动  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);      // 判断是否成功      if (GameUtil.isSuccess()) {   // 将最后一张图显示完整   recreateData();   bitmapItemLists.remove(type * type - 1);   bitmapItemLists.add(lastBitmap);   // 通知GridView更改UI   adapter.notifyDataSetChanged();   Toast.makeText(PuzzleMain.this, "拼图成功!", Toast.LENGTH_LONG).show();   gv_puzzle_main_detail.setEnabled(false);   timer.cancel();   timerTask.cancel();      }  }     } }); // 返回按钮点击事件 btnBack.setOnClickListener(this); // 显示原图按钮点击事件 btnImage.setOnClickListener(this); // 重置按钮点击事件 btnRestart.setOnClickListener(this);    }    /**     * Button点击事件     */    @Override    public void onClick(View v) switch (v.getId()) { // 返回按钮点击事件 case R.id.btn_puzzle_main_back:     PuzzleMain.this.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_puzzle_main_restart:     cleanConfig();     generateGame();     recreateData();     // 通知GridView更改UI     tv_puzzle_main_counts.setText("" + countIndex);     adapter.notifyDataSetChanged();     gv_puzzle_main_detail.setEnabled(true);     breakdefault:     break; }    }    /**     * 生成游戏数据     */    private void generateGame() // 切图 获取初始拼图数据 正常顺序 new ImagesUtil().createInitBitmaps(type, picSelected, PuzzleMain.this); // 生成随机数据 GameUtil.getPuzzleGenerator(); // 获取Bitmap集合 for (ItemBean temp : GameUtil.itemBeans) {     bitmapItemLists.add(temp.getBitmap()); } // 数据适配器 adapter = new GridItemsAdapter(this, bitmapItemLists); gv_puzzle_main_detail.setAdapter(adapter); // 启用计时器 timer = new Timer(true); // 计时器线程 timerTask = new TimerTask() {     @Override     public void run() {  Message msg = new Message();  msg.what = 1;  handler.sendMessage(msg);     } }; // 每1000ms执行 延迟0s timer.schedule(timerTask, 0, 1000);    }    /**     * 添加显示原图的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(); this.finish();    }    /**     * 清空相关参数设置     */    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 ImagesUtil().resizeBitmap(screenWidth * 0.8f, screenHeigt * 0.6f, bitmap);    }    /**     * 初始化Views     */    private void initViews() // Button btnBack = (Button) findViewById(R.id.btn_puzzle_main_back); btnImage = (Button) findViewById(R.id.btn_puzzle_main_img); btnRestart = (Button) findViewById(R.id.btn_puzzle_main_restart); // Flag 是否已显示原图 isShowImg = false// GV gv_puzzle_main_detail = (GridView) findViewById(R.id.gv_puzzle_main_detail); // 设置为N*N显示 gv_puzzle_main_detail.setNumColumns(type); LayoutParams gridParams = new RelativeLayout.LayoutParams(picSelected.getWidth(), picSelected.getHeight()); // 水平居中 gridParams.addRule(RelativeLayout.CENTER_HORIZONTAL); // 其他格式属性 gridParams.addRule(RelativeLayout.BELOW, R.id.ll_puzzle_main_spinner); // Grid显示 gv_puzzle_main_detail.setLayoutParams(gridParams); gv_puzzle_main_detail.setHorizontalSpacing(0); gv_puzzle_main_detail.setVerticalSpacing(0); // TV步数 tv_puzzle_main_counts = (TextView) findViewById(R.id.tv_puzzle_main_counts); tv_puzzle_main_counts.setText("" + countIndex); // TV计时器 tv_Timer = (TextView) findViewById(R.id.tv_puzzle_main_time); tv_Timer.setText("0秒"); // 添加显示原图的View addImgView();    }}

自认为注释、代码风格还是不错的,希望大家喜欢。

PS:需要源代码的朋友请留言,其实根据这个思路自己去实现下,对自己是有很大提高的,如果能优化我的代码,那就更好了,可以一起学习交流下。


           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

猜你喜欢

转载自blog.csdn.net/qq_43666827/article/details/86572808