Android实现拼图游戏
作者:hellolxb 发布时间:2023-06-29 20:48:25
标签:Android,拼图
本文实例为大家分享了Android实现拼图游戏的具体代码,供大家参考,具体内容如下
本人是用 android studio 完成的
源码
package packageName;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;
import MyImg;
public class MainActivity extends AppCompatActivity {
// 显示图片的宽度
public static final int W = 250;
// 左上边距
public static final int MARGIN = 200;
// 空图片的索引
public static final int NULLINDEX = 0;
private MyImg[] imgs = new MyImg[9];
// 存储图片位置的地图
private int[] map = new int[9];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 主布局没设置啥东西
setContentView(R.layout.activity_main);
// 用于设置生成 view 对象的宽高
ViewGroup.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
initImg(params);
randomMap();
addImg(params);
// 开始新游戏
Button newBtn = new Button(this);
newBtn.setText("新游戏");
newBtn.setTextSize(16);
newBtn.setX(40);
// 添加控件要用的
ViewGroup.LayoutParams p1= new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
addContentView(newBtn, p1);
newBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
newGame();
}
});
}
// 添加图片到布局中并设置点击事件
private void addImg(ViewGroup.LayoutParams params) {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
int index = i * 3 + j;
// 计算x, y坐标
int x = j * W + MARGIN;
int y = i * W + MARGIN;
ImageView imgView = imgs[map[index]].getImg();
imgView.setX(x);
imgView.setY(y);
addContentView(imgView, params);
imgView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ImageView tempImg = imgs[NULLINDEX].getImg();
int x = (int) v.getX();
int y = (int) v.getY();
// goal image
int x1 = (int) tempImg.getX();
int y1 = (int) tempImg.getY();
// move top
if (y - y1 == W && x == x1) {
top((ImageView) v);
} else if (y - y1 == -W && x == x1) {
down((ImageView) v);
} else if (x - x1 == W && y == y1) {
left((ImageView) v);
} else if (x - x1 == -W && y == y1) {
right((ImageView) v);
}
if (isWin()) {
Toast.makeText(MainActivity.this, "You Win!", Toast.LENGTH_SHORT).show();
}
}
});
}
}
}
private void newGame() {
randomMap();
// 设置图片的 x, y坐标
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
int index = i * 3 + j;
int x = j * W + MARGIN;
int y = i * W + MARGIN;
ImageView imgView = imgs[map[index]].getImg();
imgView.setX(x);
imgView.setY(y);
}
}
}
private void left(ImageView img) {
img.setX(img.getX() - W);
imgs[NULLINDEX].getImg().setX(img.getX() + W);
}
private void right(ImageView img) {
img.setX(img.getX() + W);
imgs[NULLINDEX].getImg().setX(img.getX() - W);
}
private void top(ImageView img) {
img.setY(img.getY() - W);
imgs[NULLINDEX].getImg().setY(img.getY() + W);
}
private void down(ImageView img) {
img.setY(img.getY() + W);
imgs[NULLINDEX].getImg().setY(img.getY() - W);
}
private boolean isWin() {
// 根据 x, y的坐标算出图片的位置,假如一一对应的话,那么久是赢了
for (int i = 0; i < 9; i++) {
ImageView img = imgs[i].getImg();
int x = (int) img.getX();
int y = (int) img.getY();
int index = (y - MARGIN) / W * 3 + (x - MARGIN) / W;
// 有一个没对上,就是没赢
if (index != imgs[i].getType()) {
return false;
}
}
return true;
}
private void randomMap() {
// 打乱地图的位置
int a, b;
for (int i = 0; i < 50; i++) {
a = (int) (Math.random() * 9);
b = (int) (Math.random() * 9);
int t = map[a];
map[a] = map[b];
map[b] = t;
}
}
// 安排图片数组
private void initImg(ViewGroup.LayoutParams params) {
int[] imgId = {R.drawable.img10, R.drawable.img2, R.drawable.img3, R.drawable.img4, R.drawable.img5,
R.drawable.img6, R.drawable.img7, R.drawable.img8, R.drawable.img9};
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
int index = i * 3 + j;
imgs[index] = new MyImg(index);
MyImg img = imgs[index];
ImageView image = new ImageView(this);
params.width = W;
params.height = W;
image.setLayoutParams(params);
image.setImageResource(imgId[index]);
img.setImg(image);
// 让地图初始化
map[index] = index;
}
}
}
}
MyImg类
package packageName;
import android.widget.ImageView;
public class MyImg {
// 用于存储图片位置的索引
private int type;
private ImageView img;
public MyImg(int type) {
this.type = type;
}
public void setImg(ImageView img) {
this.img = img;
}
public ImageView getImg() {
return img;
}
// 获取图片索引
public int getType() {
return type;
}
}
来源:https://blog.csdn.net/weixin_44116706/article/details/98784787
0
投稿
猜你喜欢
- 在项目中如果有些参数经常需要修改,或者后期可能需要修改,那我们最好把这些参数放到properties文件中,源代码中读取properties
- 本文基于Java实现了一个简单的单词本安卓a
- 一、HTTP http请求 一般一个http请求包括以下三个部分: 1 请求方法,如get,pos
- 一、JTA组件简介什么是JTAJTA,全称:Java Transaction API。JTA事务比JDBC事务更强大。一个JTA事务可以有多
- 封装类用于阻止系统休眠的C#类。以下是代码注释的解释:DllImport("kernel32.dll"):定义了一个AP
- 1.封装什么是封装,谈谈自己对封装的理解,封装就是将类的信息(比如说类的属性)隐藏在类的内部,不允许外部程序直接访问。此时就要提到一个关键字
- 本文实例为大家分享了shader实现基于世界坐标的贴图置换效果。效果如下:设置面板如下:可在面板上设置切换方向,与切换对象,及其切换速度。s
- 近日,开发者头条上分享了一篇“小米java第二轮面经”,有很多的java程序员表示非常有兴趣。下面就和各位分享小米java第二轮面经:0、谈
- 本文实例为大家分享了android Matrix图片随意放大缩小和拖动的具体代码,供大家参考,具体内容如下step1:新建一个项目DragA
- 主要用的是org.apache.tools.zip.ZipOutputStream 这个zip流,这里以Execl为例子。思路首
- 本文实例讲述了Java判断两个日期相差天数的方法。分享给大家供大家参考。具体如下:import java.util.Calendar;pub
- 本文实例讲述了C#使用doggleReport生成pdf报表的方法。分享给大家供大家参考,具体如下:1. 安装nuget-install p
- 如下所示: /** * 判断某个界面是否在前台 * * @param context
- 0、引言在开发的过程中,很多业务场景需要一个树形结构的结果集进行前端展示,也可以理解为是一个无限父子结构,常见的有报表指标结构、菜单结构等。
- 冒泡排序冒泡排序的思想:每次让当前的元素和它的下一个元素比较大小、如果前一个的元素大于后一个元素的话,交换两个元素。这样的话经历一次扫描之后
- spring validation多层对象校验1、第一层对象定义import java.io.Serializable; import ja
- 一、反射概述反射机制指的是Java在运行时候有一种自观的能力,能够了解自身的情况为下一步做准备,其想表达的意思就是:在运行状态中,对于任意一
- 介绍我们都知道函数是程序中的基本模块,代码段。那高阶函数呢?听起来很好理解吧,就是函数的高阶(级)版本。它怎么高阶了呢?我们来看下它的基本定
- OAuth 简介OAuth 是由 Blaine Cook、Chris Messina、Larry Halff 及 David Recordo
- 在intellij中忽略提交文件,分两种情况,文件没有纳入版本管理第一种方法文件还没有纳入版本管理,这种通过 svn的ignore配置ver