项目目录

  • 一、项目概述
  • 二、主要技术
  • 三、开发环境
  • 四、详细设计
    • 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实现连连看小游戏,比比看谁过关最快~相关推荐

  1. Android Studio实现五子棋小游戏

    项目目录 一.项目概述 二.开发环境 三.详细设计 1.布局设计 2.验证码 3.AI人机 4.背景音乐 四.运行演示 五.项目总结 六.源码获取 一.项目概述 五子棋是一种两人对弈的策略型棋类游戏, ...

  2. Android Studio实现数独小游戏,休闲益智

    文章目录 一.项目概述 二.开发环境 三.详细设计 3.1 界面设计 3.2 逻辑设计 四.运行演示 五.源码获取 一.项目概述 数独是一种逻辑解谜游戏,它规则稍复杂,解题过程富有挑战性.本次安卓数独 ...

  3. Android Studio 抽卡小游戏

    https://download.csdn.net/download/weixin_45609946/86405765 Hello 大家好,此项目是我学习Android时完成的大作业. 首先我来介绍一 ...

  4. 原生js实现一个连连看小游戏(一)

    前几天使用原生的js写了一个连连看小游戏,地址:连连看(js),基本功能都实现了,运行截图为: 根据游戏规则获取开发思路 创建棋盘格 生成随机不重复数字 映射到棋盘格 鼠标点击事件 寻路,无通路,则到 ...

  5. python连连看小游戏_利用Python制作一个连连看小游戏,边学边玩!

    导语 今天我们将制作一个连连看小游戏,让我们愉快地开始吧~ 开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Python自带的模块 环境搭建 安装Python并添加到环 ...

  6. python连连看小游戏_python递归法实现简易连连看小游戏

    问题:简单版连连看小游戏 一个分割成w*h个正方格子的矩形板上,每个正方格子可以有游戏卡,也可以没有游戏卡 两个游戏卡之间有一条路径相连需满足以下三个条件: 1.路径只包含水平和垂直的直线段 2.路径 ...

  7. 解决一个Android Studio gradle的小问题

    解决一个Android Studio gradle的小问题 参考文章: (1)解决一个Android Studio gradle的小问题 (2)https://www.cnblogs.com/xzha ...

  8. 第50篇 Android Studio实现生命数字游戏(五)计算星座数

    第50篇 Android Studio实现生命数字游戏(五)计算星座数 1.变量说明: 1.1.统计圈数 2.计算命数 2.1.使用的数据 2.2.星座对应日期和数字 2.3.说明 2.4.代码 1. ...

  9. Android 实现扑克牌动画,Android扑克牌猜点小游戏源码

    Android扑克牌猜点小游戏源码分享. 该游戏是简单的猜点游戏, 1点为正确的点数 点重新开始后进行洗牌 每次牌的顺序不同 Java代码: package com.mrzhu.test0109_pr ...

  10. MATLAB连连看小游戏

    这是一款MATLAB连连看小游戏,基本实现了连连看的功能,不过目前没有写出死局判定的模块,日后可能会对其进行改进. 目录 游戏截图 游戏组装说明 完整代码 其他说明 后记 游戏截图 游戏组装说明 我们 ...

最新文章

  1. 产品经理技能树之 数据体系
  2. php 面向对象开发 类的学习 一
  3. iOS 控件不显示的几点原因
  4. 20165301 我期望的师生关系
  5. Python技术分享:如何同时检测多个人脸?
  6. 鼠标 . 软驱 . 打印机 . 硬盘. 风扇 . 常见事故处理 -
  7. 对pthread_create未定义的引用
  8. 2345王牌浏览器九宫格个性化设置
  9. [论文阅读] BCNet: Bidirectional collaboration network for edge-guided salient object detection
  10. vue props 多类型_一个TypeScript简例,以及Vue支持TS的一些些事儿
  11. firefox 插件配置
  12. iOS开发之MAC的内存清理,Xcode清理
  13. 前端答题小游戏_前端知识小游戏
  14. BIDI SFP光模块和普通SFP光模块的介绍
  15. SQL中cast和convert的区别
  16. Postman打开报错could not open postman 无法打开如何解决
  17. 在Mybaties中进行数据查询时,表中字段名和属相名没有对应起来,查询的结果总null,一下是解决方法
  18. python 的魔法函数
  19. ftp 出现Passive mode refused 解决办法
  20. mysql微信昵称存储_mysql存储昵称带有emoji处理方案

热门文章

  1. 个人关于学习的一些总结
  2. 如何成为一个游戏制作人——教程企划
  3. ASP常用服务器获取各类信息汇总
  4. CANCELLED: io.grpc.Context was canclled without error
  5. 网络工程师必备 5款网络故障排除工具
  6. 网站点击流数据分析项目
  7. 面向对象编程中的 诡异事件
  8. 哥德巴赫猜想(C++证明)
  9. 计算机键盘按键数量,电脑键盘有一百多个按键,有3个很少人会碰
  10. 西门子SCL编程语言入门基础知识