Android Studio实现连连看小游戏,比比看谁过关最快~
项目目录
- 一、项目概述
- 二、主要技术
- 三、开发环境
- 四、详细设计
- 1、数据库
- 2、排行榜
- 3、游戏实现
- 五、运行演示
- 六、源码获取
一、项目概述
这是一款基于Android studio开发的连连看小游戏。主要实现的功能有:
- 难度设置
- 打乱重排
- 排行榜
- 计时器
- 背景音乐
- 消除音效
二、主要技术
主要应用的技术如下:
Fragment碎片 | Service服务 | Menu菜单 | 自定义view | Java反射 |
---|---|---|---|---|
handler消息机制 | BroadcastReceiver | 多线程 | SQLiteOpenHelper | SharedPreferences |
Bitmap | ViewPager | MediaPlayer | Dialog | ListView |
本项目几乎涵盖了Android入门级的所有知识点,适合新手练手实践。
三、开发环境
开发环境依旧是在4.2.1上进行开发的,只要你的AS是近两年从官网下载的,都是可以满足的。
四、详细设计
1、数据库
创建了一张users表来存储排行榜的数据,建表语句如下:
db.execSQL("create table users (id integer primary key,name varchar(50),time varchar(50),date varchar(50))");
与以往的数据库帮助类不同,这次并没有提前创建好数据库和表,而是在类中调用构造函数进行创建,创建之后会自动执行建表语句。因为要加上表头,所以我们在建表之后率先插入一条数据作为表头。
myDBHelper = new DataBaseHelper(this,"ranking",null,1);
db = myDBHelper.getWritableDatabase();
Cursor cursor = db.query("users", null, null, null, null, null, "time");
mData = new LinkedList<>();
mData.add(new Ranking("名次","昵称","用时(s)","上榜时间"));
游戏所有的配置采用键值对形式存储——“背景音乐”:“开”。所以使用SharedPreferences,通过读取key的value判断是否关闭音乐/音效。
sp = this.getSharedPreferences("config",MODE_PRIVATE);
if(sp.getBoolean("music",true)) {mp.start();
}
if(!sp.getBoolean("sound",true)) {sound = false;
}
2、排行榜
首先肯定创建排行榜的实体类,其实就是数据表的结构。类的属性、构造函数、get和set方法。
public class Ranking {private String id;private String name;private String time;private String date;public Ranking(String id, String name, String time, String date) {this.id = id;this.name = name;this.time = time;this.date = date;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getTime() {return time;}public void setTime(String time) {this.time = time;}public String getDate() {return date;}public void setDate(String date) {this.date = date;}
}
因为要在列表中显示排行榜,所以需要自定义适配器。然后获取数据源,创建适配器,加载适配器即可。这部分内容属于老生常谈了,就当复习一下。
/* 排行榜列表的适配器 */
public class RankingAdapter extends BaseAdapter {private LinkedList<Ranking> mData;private Context mContext;public RankingAdapter(LinkedList<Ranking> mData, Context mContext) {this.mData = mData;this.mContext = mContext;}@Overridepublic int getCount() {return mData.size();}@Overridepublic Object getItem(int position) {return null;}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {convertView = LayoutInflater.from(mContext).inflate(R.layout.ranking_item,null);TextView uid = convertView.findViewById(R.id.uid);TextView uname = convertView.findViewById(R.id.uname);TextView utime = convertView.findViewById(R.id.utime);TextView udate = convertView.findViewById(R.id.udate);uid.setText(mData.get(position).getId());uname.setText(mData.get(position).getName());utime.setText(mData.get(position).getTime());udate.setText(mData.get(position).getDate());return convertView;}
}
3、游戏实现
因为连连看游戏是消除一个个小方块,所以最基本的游戏单元就是方块类。每个方块有哪些属性呢?首先方块上面有图片,有自己在屏幕上的左上角坐标(x,y),以及在二维数组中的一维和二维索引值。有哪些方法呢?首先必须能够判断两个Piece上的图片是否相同,不然无法进入消除判断,然后获取方块中心点坐标,用于画图。
/* 方块对象 */
public class Piece {/*** 保存方块对象的所对应的图片*/private PieceImage pieceImage;/*** 该方块的左上角的x坐标*/private int beginX;/*** 该方块的左上角的y座标*/private int beginY;/*** 该对象在Piece[][]数组中第一维的索引值*/private int indexX;/*** 该对象在Piece[][]数组中第二维的索引值*/private int indexY;/*** 设置该Piece对象在数组中的索引值** @param indexX* 该方块的左上角的x坐标* @param indexY* 该方块的左上角的y座标*/public Piece(int indexX, int indexY) {this.indexX = indexX;this.indexY = indexY;}/*** 获取该Piece的中心位置** @return 中心点的坐标对象Point*/public Point getCenter() {return new Point(getBeginX() + GameConf.PIECE_WIDTH / 2, getBeginY() + GameConf.PIECE_HEIGHT / 2);}/*** 判断两个Piece上的图片是否相同** @param otherPieceImage* 另外的一个Piece对象* @return 是否相同*/public boolean isSameImage(Piece otherPieceImage) {if (pieceImage == null) {if (otherPieceImage.pieceImage != null)return false;}// 当两个Piece封装图片资源ID相同时,即可认为这两个Piece上的图片相同。return pieceImage.getImageId() == otherPieceImage.pieceImage.getImageId();}/*** @return 该方块的左上角的X坐标*/public int getBeginX() {return beginX;}/*** 设置该方块的左上角的X坐标** @param beginX*/public void setBeginX(int beginX) {this.beginX = beginX;}/*** @return 该方块的左上角的Y座标*/public int getBeginY() {return beginY;}/*** 设置该方块的左上角的Y坐标** @param beginY*/public void setBeginY(int beginY) {this.beginY = beginY;}/*** @return 该对象在Piece[][]数组中第一维的索引值*/public int getIndexX() {return indexX;}/*** 设置该对象在Piece[][]数组中第一维的索引值** @param indexX*/public void setIndexX(int indexX) {this.indexX = indexX;}/*** @return 该对象在Piece[][]数组中第二维的索引值*/public int getIndexY() {return indexY;}/*** 设置该对象在Piece[][]数组中第二维的索引值** @param indexY*/public void setIndexY(int indexY) {this.indexY = indexY;}/*** @return 保存方块对象的所对应的图片*/public PieceImage getPieceImage() {return pieceImage;}/*** 设置保存方块对象的所对应的图片** @param pieceImage*/public void setPieceImage(PieceImage pieceImage) {this.pieceImage = pieceImage;}
}
方块图片很简洁,两个属性分别是image位图和image的id。
/*** 图片*/private Bitmap image;/*** 图片资源ID*/private int imageId;
做完这些后,我们就可以将方块放入到我们的屏幕中了,这时候定义个平板类,每次打乱方块。
protected List<Piece> createPieces(GameConf config, Piece[][] pieces) {List<Piece> notNullPieces = new ArrayList<Piece>();for (int i = 0; i < pieces.length; i++) {for (int j = 0; j < pieces[i].length; j++) {Piece piece = new Piece(i, j);notNullPieces.add(piece);}}return notNullPieces;
}
我们创建了一个类用来保存连接点,方法直接调用。
private List<Point> points = new ArrayList<Point>();
获取到所有连接点后,开始在画布上画线,这样就有了动画效果。
private void drawLine(LinkInfo linkInfo, Canvas canvas) {// 获取LinkInfo中封装的所有连接点List<Point> points = linkInfo.getLinkPoints();// 依次遍历linkInfo中的每个连接点for (int i = 0; i < points.size() - 1; i++) {// 获取当前连接点与下一个连接点Point currentPoint = points.get(i);Point nextPoint = points.get(i + 1);// 绘制连线canvas.drawLine(currentPoint.x, currentPoint.y, nextPoint.x,nextPoint.y, this.paint);}}
最后在主碎片上面设置游戏中的逻辑,篇幅比较长,代码也比较简单,大家可以直接阅读源码学习。
// 初始化游戏失败的对话框
lostDialog = createDialog("GAME OVER", "游戏失败!请重新开始", R.drawable.lost).setPositiveButton("确定", new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int which) {startGame(0);}});
// 初始化游戏胜利的对话框
successDialog = createDialog("Success", "你真厉害!请输入你的大名!",R.drawable.success).setView(et).setPositiveButton("确定",new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int which) {String input = et.getText().toString();myDBHelper = new DataBaseHelper(getContext(),"ranking",null,1);db = myDBHelper.getWritableDatabase();Time t=new Time();t.setToNow();int year = t.year;int month = t.month+1;int day = t.monthDay;String date = year+"/"+month+"/"+day;ContentValues cv = new ContentValues();cv.put("name",input);cv.put("time",String.valueOf(gameTime));cv.put("date",date);db.insert("users",null,cv);Intent intent = new Intent();intent.setAction("top.ysccx.broadcast");intent.putExtra("name",input);intent.putExtra("time",String.valueOf(gameTime));getActivity().sendBroadcast(intent);startActivity(new Intent(getActivity(),RankingActivity.class));}});
}
五、运行演示
1、Build项目,运行到模拟器中,可以看到默认碎片显示游戏界面,底部导航栏和顶部菜单栏。
2、我们点击右上角的下拉菜单,有难度、排行榜、打乱重排、重新开始和退出五个选项。
3、在难度菜单项中还有子菜单,从简单和地狱的难度,满足你的一切渴望。
4、我们先选择简单难度,然后点击Play,游戏开始,方块随机排列在屏幕上,底部是计时。
5、然后进行消除,消除时候有背景音乐和音效,消除会有动画。
6、消除成功后弹出对话框,输入昵称用来排行。
7、输入昵称可以自动跳转到排行榜,也可以点击菜单栏查看排行榜。
8、如果消除时候遇到死局,可以在菜单栏选择【打乱重排】,然后就会随机打乱剩余的方块。
9、玩的不满意了就重新开始,也都没有问题的。
10、我们点击导航栏的说明,可以看到游戏说明,原来是周杰伦制作的游戏啊(因为我非常喜欢周杰伦)。
11、在设置导航栏中可以选择打开音乐或者音效。
六、源码获取
关注公众号《萌新加油站》,后台回复:连连看,即可获取完整源代码。
Android Studio实现连连看小游戏,比比看谁过关最快~相关推荐
- Android Studio实现五子棋小游戏
项目目录 一.项目概述 二.开发环境 三.详细设计 1.布局设计 2.验证码 3.AI人机 4.背景音乐 四.运行演示 五.项目总结 六.源码获取 一.项目概述 五子棋是一种两人对弈的策略型棋类游戏, ...
- Android Studio实现数独小游戏,休闲益智
文章目录 一.项目概述 二.开发环境 三.详细设计 3.1 界面设计 3.2 逻辑设计 四.运行演示 五.源码获取 一.项目概述 数独是一种逻辑解谜游戏,它规则稍复杂,解题过程富有挑战性.本次安卓数独 ...
- Android Studio 抽卡小游戏
https://download.csdn.net/download/weixin_45609946/86405765 Hello 大家好,此项目是我学习Android时完成的大作业. 首先我来介绍一 ...
- 原生js实现一个连连看小游戏(一)
前几天使用原生的js写了一个连连看小游戏,地址:连连看(js),基本功能都实现了,运行截图为: 根据游戏规则获取开发思路 创建棋盘格 生成随机不重复数字 映射到棋盘格 鼠标点击事件 寻路,无通路,则到 ...
- python连连看小游戏_利用Python制作一个连连看小游戏,边学边玩!
导语 今天我们将制作一个连连看小游戏,让我们愉快地开始吧~ 开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Python自带的模块 环境搭建 安装Python并添加到环 ...
- python连连看小游戏_python递归法实现简易连连看小游戏
问题:简单版连连看小游戏 一个分割成w*h个正方格子的矩形板上,每个正方格子可以有游戏卡,也可以没有游戏卡 两个游戏卡之间有一条路径相连需满足以下三个条件: 1.路径只包含水平和垂直的直线段 2.路径 ...
- 解决一个Android Studio gradle的小问题
解决一个Android Studio gradle的小问题 参考文章: (1)解决一个Android Studio gradle的小问题 (2)https://www.cnblogs.com/xzha ...
- 第50篇 Android Studio实现生命数字游戏(五)计算星座数
第50篇 Android Studio实现生命数字游戏(五)计算星座数 1.变量说明: 1.1.统计圈数 2.计算命数 2.1.使用的数据 2.2.星座对应日期和数字 2.3.说明 2.4.代码 1. ...
- Android 实现扑克牌动画,Android扑克牌猜点小游戏源码
Android扑克牌猜点小游戏源码分享. 该游戏是简单的猜点游戏, 1点为正确的点数 点重新开始后进行洗牌 每次牌的顺序不同 Java代码: package com.mrzhu.test0109_pr ...
- MATLAB连连看小游戏
这是一款MATLAB连连看小游戏,基本实现了连连看的功能,不过目前没有写出死局判定的模块,日后可能会对其进行改进. 目录 游戏截图 游戏组装说明 完整代码 其他说明 后记 游戏截图 游戏组装说明 我们 ...
最新文章
- 产品经理技能树之 数据体系
- php 面向对象开发 类的学习 一
- iOS 控件不显示的几点原因
- 20165301 我期望的师生关系
- Python技术分享:如何同时检测多个人脸?
- 鼠标 . 软驱 . 打印机 . 硬盘. 风扇 . 常见事故处理 -
- 对pthread_create未定义的引用
- 2345王牌浏览器九宫格个性化设置
- [论文阅读] BCNet: Bidirectional collaboration network for edge-guided salient object detection
- vue props 多类型_一个TypeScript简例,以及Vue支持TS的一些些事儿
- firefox 插件配置
- iOS开发之MAC的内存清理,Xcode清理
- 前端答题小游戏_前端知识小游戏
- BIDI SFP光模块和普通SFP光模块的介绍
- SQL中cast和convert的区别
- Postman打开报错could not open postman 无法打开如何解决
- 在Mybaties中进行数据查询时,表中字段名和属相名没有对应起来,查询的结果总null,一下是解决方法
- python 的魔法函数
- ftp 出现Passive mode refused 解决办法
- mysql微信昵称存储_mysql存储昵称带有emoji处理方案