Android 连连看设计 (1)
1、绪论
1.1、 背景说明:
(1)休闲类游戏(Casual Game)可以包含任何游戏类型的游戏性要素,通常休闲游戏的游戏规则相对简单,无需特别的技巧,也不需要较长的时间就能完成游戏。休闲游戏经常出现在不同的平台上[8],包括家用游戏机、掌上游戏机和个人电脑上等等。休闲类游戏通常也适合于各种不同性别、地域和文化的玩家群体。 本文所涉及的游戏项目,是一款棋类休闲游戏,基于 Windows 平台,无需较长的时间就能完成一局的游戏,一局游戏一般在 5 到 20 分钟左右就能完成根据该局游戏玩家的游戏策略等因素,一局游戏的完成时间会有一定差别.(2) Android技术Android一词的本义指“机器人[29]”,同时也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的移动软件。
Android作为软件平台标准,需有硬件提供各种运算能力才能形成完整系统。Android软件平台包含Java应用程序、Application Framework、Libraries、Runtime~Linux Os等层。每一层内含多个独立组件完成不同功能,Android在各组件与层之间订出标准界面。因此Android系统可以像积木堆栈一般,不同应用产品可以依功能需要加入软件或硬件组件整合成不同产品[31]。
当今的人们忙于工作,很少有时间静下心来享受一些小游戏的乐趣,因此手机版一些小游戏 如:象棋、贪吃蛇、连连看。。。 等便受到人们的关注。
1.2、环境与平台
待开发软件系统的名称:基于Android系统的连连看游戏设计
本项目的任务提出者:学校
开发者:游戏开发小组
用户:喜欢玩游戏的人
项目开发环境:my eclipse、Android系统平台
Android手机版 水果连连看 设计与实现
1.3、参考资料
《Android开发指南》
《Android游戏开发》
网址:http://www.cnblogs.com/hellope/archive/2011/08/12/2136505.html
2、程序系统的结构
连连看游戏结构如下:
本程序主要包含两大模块:即(1)表示层模块;(2)后台逻辑模块;(3)主要有6个大类:其中表示层模块可以理解为游戏的UI及一些游戏辅助效果,表示层模块中,重要的是实现游戏的布局地图,项目中实现中,游戏的布局将使用自定义View的方式,在屏幕上贴图实现。而菜单模块及选关的dialog,只是为用户提供一些常见的选择,如重玩,过关继续音效开关等等,为了有一个更好的用户交互环境,dialog的实现将通过自定义dialog的方式。而游戏音效是MediaPlayer在不同的状态场景下播放不同的游戏音效。而后台逻辑模块中,即时对于程序计算的实现与程序各种状态的监听,将是整个程序运行的基础。此模块中将实现对于游戏剩余时间限制和游戏状态的监听与处理。对于游戏剩余时间的监听,将开启单独的线程进行处理,从而不至于影响主程序逻辑的运行;游戏的状态的监控处理中,将会实现对于连通的两个图标的消除(即游戏界面的更新),游戏输赢的监听判断,游戏暂停与否等(暂停状态需要同时将剩余时间暂停,而时间监听线程需要知道所处状态,此二者紧密联系)。
class BoardView /表示层模块中的界面显示类
class GameView //用于处理游戏中的消息提示
class Listener //用于菜单的设计各模块监听
Class MyDialog //用于菜单中游戏难度的设定
Class SoundPlayer //用于音效播放的控制
Class WelcomActivity //时间及游戏状态监控与处理
3、表示层模块中的界面显示类设计说明
3.1、程序描述
主要功能:用于为玩家提供操作提示,具有良好的可视化。
可扩展性:能够适应应用要求的变化和修改,具有灵活的可扩充性。
3.2、算法
首先我们开发在表示层模块中的界面显示类,首先是BoardView类,在android平台下,采用继承自View类的方式,看此类的代码,代码中尽量添加了详细的注释:
- view sourceprint?
- package nate.llk.view;
- /*导入包种种再次略去*/
- view sourceprint?
- public class BoardView extends View {
- * xCount x轴方向的图标数+2
- protected static final int xCount = 10;
- * yCount y轴方向的图表数+2
- protected static final int yCount = 12;
- /* map 连连看游戏棋盘,map中添加的int型在程序中的意思是index,而不是屏幕坐标 */
- protected int[][] map = new int[xCount][yCount];
- protected int iconSize;
- protected int iconCounts=19;
- protected Bitmap[] icons = new Bitmap[iconCounts];
- private Point[] path = null;
- /**
- * selected 选中的图标
- */
- protected List<Point> selected = new ArrayList<Point>();
- /**
- 构造函数 * @param context
- * @param attrs */
- public BoardView(Context context, AttributeSet attrs) {
- super(context, attrs);
- calIconSize();
- Resources r = getResources();
- //载入连连看中的图标资源
- loadBitmaps(1, r.getDrawable(R.drawable.fruit_01));
- loadBitmaps(2, r.getDrawable(R.drawable.fruit_02));
- loadBitmaps(3, r.getDrawable(R.drawable.fruit_03));
- loadBitmaps(4, r.getDrawable(R.drawable.fruit_04));
- loadBitmaps(5, r.getDrawable(R.drawable.fruit_05));
- loadBitmaps(6, r.getDrawable(R.drawable.fruit_06));
- loadBitmaps(7, r.getDrawable(R.drawable.fruit_07));
- loadBitmaps(8, r.getDrawable(R.drawable.fruit_08));
- loadBitmaps(9, r.getDrawable(R.drawable.fruit_09));
- loadBitmaps(10, r.getDrawable(R.drawable.fruit_10));
- loadBitmaps(11, r.getDrawable(R.drawable.fruit_11));
- loadBitmaps(12, r.getDrawable(R.drawable.fruit_12));
- loadBitmaps(13, r.getDrawable(R.drawable.fruit_13));
- loadBitmaps(14, r.getDrawable(R.drawable.fruit_14));
- loadBitmaps(15, r.getDrawable(R.drawable.fruit_15));
- loadBitmaps(16, r.getDrawable(R.drawable.fruit_17));
- loadBitmaps(17, r.getDrawable(R.drawable.fruit_18));
- loadBitmaps(18, r.getDrawable(R.drawable.fruit_19));
- }
- /**
- * 计算图标的大小
- */
- private void calIconSize(){
- //取得屏幕的大小
- DisplayMetrics dm = new DisplayMetrics();
- ((Activity) this.getContext()).getWindowManager()
- .getDefaultDisplay().getMetrics(dm);
- iconSize = dm.widthPixels/( xCount );
- }
- /**
- * 函数目的在于载入图标资源,同时将一个key(特定的整数标识)与一个图标进行绑定
- */
- public void loadBitmaps(int key,Drawable d){
- Bitmapbitmap = Bitmap.createBitmap(iconSize,iconSize,Bitmap.Config.ARGB_8888);
- Canvas canvas = new Canvas(bitmap);
- d.setBounds(0, 0, iconSize, iconSize);
- d.draw(canvas);
- icons[key]=bitmap; //未用0 号index
- }
- /**
- * View自带的,但是在此方法中,有画路径(删除联通的两个图标),
- * 绘制棋盘的所有图标(也可理解为刷新,只要此map位置值>0)
- * 放大第一个选中的图标(selected.size() == 1)
- */
- protected void onDraw(Canvas canvas) {
- /**
- * 绘制连通路径,然后将路径以及两个图标清除
- */
- if(path != null && path.length >= 2){
- for(int i = 0; i < path.length - 1;++i){
- Paint paint = new Paint();
- paint.setColor(Color.BLUE);
- paint.setStrokeWidth(3);
- paint.setStyle(Paint.Style.STROKE);
- Point p1 = indexToScreen(path[i].x,path[i].y);
- Point p2 = indexToScreen(path[i + 1].x,path[i + 1].y);
- canvas.drawLine(p1.x + iconSize/2, p1.y + iconSize/2,
- p2.x + iconSize/2, p2.y + iconSize/2, paint);
- }
- map[path[0].x][path[0].y] = 0;
- map[path[path.length - 1].x][path[path.length -1].y] = 0;
- selected.clear();
- path = null;
- }
- for(int x = 1;x < xCount - 1; ++x){
- for(int y = 1; y < yCount -1; ++y){
- if(map[x][y]>0){
- Point p = indexToScreen(x, y);
- canvas.drawBitmap(icons[map[x][y]], p.x,p.y,null);
- }
- }
- }
- /**
- * 绘制选中图标,当选中时图标放大显示
- */
- //for(Point position:selected){
- if(selected.size() > 0){
- Point position = selected.get(0);
- Point p = indexToScreen(position.x, position.y);
- if(map[position.x][position.y] >= 1){
- canvas.drawBitmap(icons[map[position.x][position.y]],
- null,
- new Rect(p.x-5, p.y-5, p.x + iconSize + 5, p.y + iconSize + 5), null);
- }
- }
- super.onDraw(canvas);
- }
- /**
- * 工具方法
- * @param x 数组中的横坐标
- * @param y 数组中的纵坐标
- * @return 将图标在数组中的坐标转成在屏幕上的真实坐标
- */
- public Point indexToScreen(int x,int y){
- return new Point(x * iconSize,y * iconSize);
- }
- /**
- * 工具方法
- * @param x 屏幕中的横坐标
- * @param y 屏幕中的纵坐标
- * @return 将图标在屏幕中的坐标转成在数组上的虚拟坐标
- */
- public Point screenToIndex(int x,int y){
- int xindex = x / iconSize;
- int yindex = y / iconSize;
- if(xindex < xCount && yindex < yCount){
- return new Point(xindex,yindex);
- }else{
- return new Point(0,0);
- }
- }
- * 传进来path数据更新显示,也就是将能够连接的图标消除
- * @param path
- */
- public void drawLine(Point[] path) {
- this.path = path;
- this.invalidate();
- }
3.3、接口
1、API函数
- class RefreshTime implements Runnable{
- public void run() {
- if(isContinue){
- while(leftTime > 0 && !isStop){
- timerListener.onTimer(leftTime);
- leftTime --;
- try {
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- if(isStop && leftTime > 0){
- if(win())
- ;//setMode(WIN);
- else
- setMode(PAUSE);
- }
- //setMode(LOSE);
- else if(leftTime == 0){
- setMode(LOSE);
- } } }
- public void stopTimer(){
- isStop = true;
- isContinue = false;
- } /**
- * 设置继续
- */
- public void setContinue(){
- isContinue = true;
- isStop = false;
- refreshTime = new RefreshTime();
- Thread t = new Thread(refreshTime); //注意正确启动一个实现Runnable接口的线程
- t.start();
- }
- 2、上面已经提过,此线程用于控制游戏的时间
- 在此,再介绍自定义的几个接口,
- view sourceprint?
- public interface OnStateListener{
- public void OnStateChanged(int StateMode);
- }
- 只含有一个方法,主要对于游戏状态的变换的监听,比如pause,stop等等。
- view sourceprint?
- public interface OnTimerListener{
- public void onTimer(int leftTime);
- }
用于监听剩余时间,与上面线程不同的是,此方法中利用上面线程的leftTime的结果,主要用于更新游戏中用于提醒玩家的时间进度条。
view sourceprint?
public interface OnToolsChangeListener{
public void onRefreshChanged(int count);
public void onTipChanged(int count);
}
tool即是我们的游戏中提供给玩家的两个工具,一个是refresh一下游戏界面,即将现有的棋盘重新打乱(当然,现有图表数量不变),另一个是之前提过的hint的自动帮助功能,帮助玩家找到一组能够连通的图标。当然,这两种工具都有次数的限制。
BoardView类及时间线程类的开发与介绍到此,后面我们将完整的实现游戏棋盘的绘制与touch事件的处理,以及游戏核心算法中连接算法、hint自动帮助算法与判断是否无解算法的实现。这些代码的处理都在继承自BoardView类的GameView类中。记录android小项目的经历,增加实战的能力,做个总结。
转载于:https://blog.51cto.com/3387980/936457
Android 连连看设计 (1)相关推荐
- Android连连看设计思路,0049 JavaScript游戏连连看设计和编程思路
上节课完成了一个算24点的游戏,基本了解了关于使用JavaScript如何编写一个游戏的基本要素. 接下来的几节课,来完成更复杂的网页游戏:连连看. 要编游戏先得会玩游戏 如果没有玩过这个游戏的同学, ...
- android连连看课程设计报告,Android连连看课程设计专业文件.doc
滨江学院 Android课程设计 题 目 连连看 院 系 计算机系 专 业 网络工程 学生姓名 吴培培 学 号 20112346060 二O年月日 其中,顾方编写的"阿达连连看"以 ...
- 谷歌正式推出官方“Android界面设计”网站
谷歌Android团队今天正式推出了官方的"Android界面设计"网站.该网站提供了大量用于Android程序界面开发的资料,包括一般界面设计指南.设计模式以及建筑模块等等.长期 ...
- android教程 - android ui 介绍,多图详解 “Android UI”设计官方教程
我们曾经给大家一个<MeeGo移动终端设备开发UI设计基础教程>,同时很多朋友都在寻找Android UI开发的教程,我们从Android的官方开发者博客找了一份幻灯片,介绍了一些Andr ...
- android ui秘笈,看图说话 – Android UI 设计秘笈 :Part I
Android 的官方开发者博客发了一份幻灯片,介绍了一些 Android UI 设计的小贴士,Roger 在这里以看图说话的形式发出来,有兴趣的读者就继续往下翻吧.整个 PPT 共分5个部分,Par ...
- Android RecyclerView设计通用Adapter
RecylerView 的使用频率现在也算做是很高了吧?使用起来的确是挺方便的,也容易实现一些比较好看的效果 一.一般步骤 一般的设计流程都是如下所示 首先是需要一个 JavaBean 来承载数据,包 ...
- Android Bander设计与实现 - 设计篇
摘要 Binder是Android系统进程间通信(IPC)方式之一.Linux已经拥有管道,system V IPC,socket等IPC手段,却还要倚赖Binder来实现进程间通信,说明Binder ...
- android产品设计,Android产品设计
Android产品设计,我们深信,凝聚一群人,用心在一件事上,为客户创造价值,它必将赢得客户的足够尊重和信赖. Android产品设计, 随着Android平台的扩张,引发了Android人才荒,20 ...
- 《Android的设计与实现:卷I》迷你书
为什么80%的码农都做不了架构师?>>> <Android的设计与实现:卷I>迷你书 本书是Android应用开发工程师和Android系统工程师进 ...
最新文章
- Ms Sql Server 基本管理脚本(1)
- Error while adding the mapper ‘interface *****类‘ to configuration报错原因
- 2.oracle的安装常识,Oralce服务器,oracle集群,oracle服务介绍,用户解锁相关
- router锚点和html锚点,hash模式下Vue-router页面返回锚点(scroll behavior)实现
- linux桌面时区设置,如何在Ubuntu 20.04上设置或更改时区
- Spring缓存注解@Cache使用
- X86汇编语言从实模式到保护模式01:处理器、内存和指令
- 易语言制作计算软件简单步骤_基于飞时达FastTFT软件方格网法计算土方量的具体步骤...
- js如何实现扫描身份证识别_基于javascript实现根据身份证号码识别性别和年龄
- android下拉菜单刷新,Android开发之头部悬浮的上拉加载,下拉刷新的列表
- Adobe Premiere基础-声音调整(音量矫正,降噪,电话音,音高换挡器,参数均衡器)(十八)
- 计算机 及其 应用系统
- UE4 Decal实现简介
- ROUGE: A Package for Automatic Evaluation of Summaries
- 一个小兔子的大数据见解2
- (单击)双击直接修改内容的代码
- zynq linux环境移植,ZYNQ 7030 Linux 系统移植
- 手机pptv如何切换视频和音频
- 计算机应用基础new题库,2015年12月份电大远程网络教育计算机应用基础统考题库8_new重点.doc...
- 怎么检查网站是否被挂黑链?
热门文章
- 人像3D模型互动展示 | 做个逼真的人像模型,get潮玩的新玩法
- ACSII码(有图,收藏版!)
- 图片上多余的图案怎么去除?教你简单的去除方法
- python在土木工程中的应用_大数据技术及其在土木工程中的应用
- 复数类(Class Complex)c++的简单实现
- 百度鹰眼Android SDK 运行配置
- scrapy爬虫实践之抓取拉钩网招聘信息(4)
- 2022年中国研究生数学建模竞赛F题思路及参考代码-COVID-19疫情期间生活物资的科学管理问题
- SQL子查询总结:相关子查询与非相关子查询有什么区别
- 有哪些蓝牙耳机的音质比较好?2022好音质蓝牙耳机推荐