好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

基于android平台的连连看系统.docx

15页
  • 卖家[上传人]:gg****m
  • 文档编号:227185518
  • 上传时间:2021-12-19
  • 文档格式:DOCX
  • 文档大小:144.04KB
  • / 15 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • Android期末作业院 系:计算机与信息工程学院班 级:10级软件技术1班姓 名:学 号:完成日期:2013年1月5日基于android平台的连连看系统本系列文章记录只是为了增加android项目实战经验,将所学的知识用于相 应的项目开发当中首先介绍一下android中连连看项目的架构及所用到的技术本程序主要包含两大模块:即(1)表示层模块;(2)后台逻辑模块;其中 表示层模块可以理解为游戏的UI及一些游戏辅助效果,表示层模块中,重要的 是实现游戏的布局地图,项目中实现中,游戏的布局将使用自定义View的方式, 在屏幕上贴图实现而菜单模块及选关的dialog,只是为用户提供一些常见的 选择,如重玩,过关继续,音效开关等等,为了有一个更好的用户交互环境,dialog 的实现将通过自定义dialog的方式而游戏音效是MediaPlayer在不同的状态 场景下播放不同的游戏音效而后台逻辑模块中,即时对于程序计算的实现与程 序各种状态的监听,将是整个程序运行的基础此模块中将实现对于游戏剩余时 间限制和游戏状态的监听与处理对于游戏剩余时间的监听,将开启单独的线程 进行处理,从而不至于影响主程序逻辑的运行;游戏的状态的监控处理中,将会 实现对于连通的两个图标的消除(即游戏界面的更新),游戏输赢的监听判断, 游戏暂停与否等(暂停状态需要同时将剩余时间暂停,而时间监听线程需要知道 所处状态,此二者紧密联系)。

      对于本程序中最重要的还是程序中核心算法模块 的实现,在游戏中,最主要的算法是判断两个选中的图标是否能够连通,其余两 个算法也依赖于此算法而进行下面着重介绍一下连接算法:在介绍连接算法之前,先简单介绍一下连连看的布局算法,为了简单起见, 我们使用4*4的棋盘,假设棋子有四种:首先在程序初始化吋,我们先将要加载 的图片在棋盘上按序绘制出来,注意每一种图标我们绘制的时候需要一次性绘制 两次,这样,才能保重绘制出来的每种图标的个数都是偶数个假设最初如下图(1): 图(1)最初绘制图(2)调换后棋盘这样绘制后,我们进行…次遍历,随机的调换棋盘中的图标(是现有棋盘中 的图标之间的调换,并不是更改成为其他的图标)经过调换的棋盘可能如图(2) 所示这样就完成了棋盘的初始化,当然我们的棋盘在最外面一层中是不添加图标 的,为的是我们连线时候能够使用最外层画线,而不会出现穿过图标画线的情况, 棋盘如下图:■■在上一篇文章helloPe的android项目实战之连连看一设计篇中,我们进行 了对android中连连看的项目的设计,包括功能模块的划分以及核心算法的设 计此文章接上文对android平台连连看程序进入实现阶段。

      在此项目中,根据 上文中对于功能的分析,我们将实现以下类(下面即是工程的文件目录)j & lianlianlcanj & src> 田 nate.Ilk■田 n ate.llk.view> [7] Boa rd View .java| |T] GameView.java> [J] OnStateListener.java t> [Jj OnTimerListenerjava> 2) OnToolsChangeListener> 羽 gen [GeDerated Java Files]> ■ Android 2.2寺 assets j 固 res凸 animD drawable0 drawable-xhdpi> & layout t> 0 values口 AndroidManifestxml 在开发中,我们遵循由下向上的方式,也就是说, 我们首先开发位于最底层的类,这种类并不依赖于其他的我们需要实现的类根 据上文的分析,首先我们开发在表示层模块中的界面显示类,首先是BoardView 类,在android平台下,采用继承自View类的方式,看此类的代码,代码中尽 量添加了详细的注释: package nate. Ilk. view;/*导入包种种再次略去public class BoardView extends View { protected static final int xCount 二 10;protected static final int yCount 二 12;map连连看游戏棋盘,map中添加的int型在程序中的意思是index,而不 是屏幕坐标!protected int[][] map 二 new int[xCount][yCount];iconSize图标大小,图标是正方形,所以一个int变量表示即可 protected int iconSize;* iconCounts图标的数目protected int iconCounts=19;* icons所有的图片protected Bitmap[] icons = new Bitmap[iconCounts];* path可以连通点的路径 private Point[] path = null;* selected选中的图标protected List〈Point> selected 二 new ArrayList〈Point>();* @param context* @param attrspublic BoardView(Context context, AttributeSet attrs) { super (context, attrs);callconSize (); Resources r = getResources ();〃载入连连看中的图标资源loadBitmaps (1, loadBitmaps (2, loadBitmaps(3, loadBitmaps(4, loadBitmaps(5, loadBitmaps(6, loadBitmaps(7, loadBitmaps(8, loadBitmaps(9, loadBitmaps(10, loadBitmaps(11,r. getDrawable(R・ drawable・ fruit_01)); r. getDrawable(R・ drawable・ fruit_02)); r. getDrawable(R・ drawable・ fruit_03)); r. getDrawable(R・ drawable・ fruit_04)); r. getDrawable(R・ drawable・ fruit_05)); r. getDrawable(R・ drawable・ fruit 06)); r. getDrawable(R・ drawable・ fruit_07)); r. getDrawable(R・ drawable・ fruit_08)); r. getDrawable(R・ drawable・ fruit_09));r. getDrawable(R. drawable・ fruit_10));r. getDrawable(R. drawable・ fruit_ll)); loadBitmaps(12, loadBitmaps(13, loadBitmaps(14, loadBitmaps(15, loadBitmaps(16, loadBitmaps(17, loadBitmaps(18,r. getDrawable(R・ drawable・ fruit_12)); r. getDrawable(R・ drawable・ fruit_13)); r. getDrawable(R・ drawable・ fruit_14)); r. getDrawable(R・ drawable・ fruit_15)); r. getDrawable(R・ drawable・ fruit_17)); r. getDrawable(R・ drawable・ fruit_18)); r. getDrawable(R・ drawable・ fruit_19));private void callconSize () { 〃取得屏幕的大小DisplayMetrics dm = new DisplayMetrics();((Activity) this・ getContext()). getWindowManager()* getDefauItDisplay()・ getMetrics(dm); iconSize = dm. widthPixels/( xCount );*函数目的在于载入图标资源,同时将一个key (特定的整数标识)与一个 图标进行绑定* @param key特定图标的标识* @param d drawable 下的资源public void loadBitmaps(int key, Drawable d){Bitmap bitmapBitmap・ createBitmap(iconSize, iconSize, Bitmap・ Config. ARGB_8888); Canvas canvas = new Canvas(bitmap);d. set Bounds (0, 0, iconSize, iconSize);d. draw (canvas);icons[key]=bitmap; //未用 0 号 index* View自带的,但是在此方法中,有画路径(删除联通的两个图标),*绘制棋盘的所有图标(也可理解为刷新,只要此map位置值>0)*放大第一个选中的图标(selected, size() == 1)@0verrideprotected void onDraw(Canvas canvas) { if(path != null && path, length >= 2){ for(int i 二 0; i〈 path. 1ength - 1;++i){ Pai nt pai nt 二 new Pai nt ();paint. setColor(Color. BLUE); paint. setStrokeWidth (3);paint. setStyle(Paint. Style. STROKE);Point pl = indexToScreen (path[i]. x, path[i].y);Point p2 = indexToScreen (path[i + 1]. x, path[i + l].y); canvas・drawLine(p 1.x + iconSize/2, pl・ y + iconSize/2, p2.x + iconSize/2, p2. y + iconSize/2, paint);map[path[0]. x][path[0]. y] = 0;map [pa th [pa th. 1 eng th 一 1]. x] [pa th [pa th. 1 eng th 二 0;selected. clear ();path = null;*绘制棋盘的所有图标当这个坐标内的值大于0时绘制for(int x = 1;x < xCount - 1; ++x) {for (int y 二 1; y〈 yCount T; ++y) { if (map [x] [y]>0) {Point p = indexToScreen (x, y);canvas ・ drawB it map (icons [map [x] [y] ], p. 。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.