ImageVerifierCode 换一换
格式:DOCX , 页数:42 ,大小:1.26MB ,
资源ID:1495789      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-1495789.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(连连看游戏分析设计与实现Word格式文档下载.docx)为本站会员(wj)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

连连看游戏分析设计与实现Word格式文档下载.docx

1、comexamplelinkboardimplobjectviewutil 图2,连连看包图其中util包负责与图片加载有关的处理,view包负责呈现界面,Object包是整个游戏的配置参数,impl是图片的排列方式,board包含了整个游戏的面板类。Link包全部的包和Link类(游戏程序的入口)。Util包中有ImageUtil类Object包中有GameConf和LinkInfo类Board包中有AbstraBoard和GameService类View包中有GameView、Piece、PieceImage类Board.impl包中有FullBoard、HorizontalBoard、V

2、erticalBoard类Link包中有GameServiceImpl和Link类。类图由于类比较多,属性和方法更多,因此类图只画出类名称,以后再详细说明类的属性和方法。图3.连连看类图1. PiececImage类图4.PieceImge类 PieceImage代表了该方块上的图片,使用它来封装:Bitmap对象和图片资源ID。其中Bitmap对象用于在游戏界面上绘制方块;而图片资源的ID则代表了该Piece对象的标识,当两个Piece所封装的图片资源的ID相等时,即可认为这两个Piece上的图片相同。2. Piece类图5.Piece类一个Piece对象代表游戏界面上的一个方块,它除了封装

3、它在左上角在游戏界面中X,Y坐标。3. GameView类 图6.GameView类 GameView主要是根据游戏的状态数据来绘制界面上的方块,GameView继承了View组件,重写了View组件上onDraw(Canvas canvas)方法,重写该方法主要就是绘制游戏里剩余的方块,除此之外,它还会负责绘制连接方法的连接线。4. GameConf图7.GameConf类GameConf类是游戏的配置类,记录方块的大小像素,图片的起始坐标,运行时间,方块的维数,游戏上下文等。5. LinkInfo类 图8.LinkInfo类LinkInfo是一个非常简单的工具类,它用于封装两个方块之间的连

4、接信息其实就是封装一个List,List里保存了连接线需要经过的点。连连看的游戏规则约定:两个方块之间最多只能用3条线段相连,也就是说最多只能有2个“拐点”,加上两个方块的中心,方块的连接信息最多只需要4个连接点。6. 连连看的状态数据模型实际上连连看的游戏界面是一个N*M的风格,每个网格上显示一张图片。这个网格只需要用一个二维数据来定义即可,而每个网格上所显示的图片对于底层的数据模型来说,不同的图片对应于不同的数值即可。图9显示所了数据模型的示意。123 图9 连连看的数据模型对于图9所示的数据模型,只要让数值为0的网络上不绘制图片,其他数值的网络则绘制相应的图片,就可显示出连连看的游戏界面

5、了。本程序实际上并不是直接使用int数组来保存游戏的状态数据,而是采用Piece来保存游戏的状态模型因为Piece对象封装的信息更多,不仅包含了该方块的左上角的X、Y坐标,而且还包含了该Piece所显示的图片、图片ID这个图片ID就可作为该Piece的数据。为了初始化游戏状态,程序需要创建一个Piece数组,为此程序定义一个AbstractBoard抽象类。 图10.AbstractBoard类上面有一个createPieces(config,pieces)抽象方法来创建一个List集合,该抽象方法将会交给其子类去实现。由于连连看游戏的初始状态可能有很多种比如横向分布、竖向分布的方块、矩阵排列

6、的方块、随机分布的方块等,该程序为了考虑以后的扩展性,此处只是采用了模板模式:定义AbstractBoard抽象基类来完成通用的代码,而暂时无法确定、需要子类实现的方法定义成createPieces(GameConf config,Piecepieces)抽象方法。矩阵排列的方块 图11.FullBoard类竖向排列的方块 图12.VerticalBoard横向排列的方块 图13.HorizontalBoard类ImageUtil工具类(静态类),它的作用是自动搜寻/res/drawable-mdpi目录下的图片,并根据需要随机读取该目录下的图片 图14.ImageUtil类7. 实现游戏Ac

7、tivity 图15.Link类Link类是游戏的入口,通过它来负责显示,Activity还需要为游戏界面的按钮、GameView组件的事件提供事件监听器。对于GameView组件,程序需要监听用户的触碰动作,当用户触碰屏幕时,程序需要获取用户触碰的是哪个方块,并判断是否需要“消除”该方块。为了判断能否消除该方块,程序需要进行如下判断: 如果程序之前已经选中了某个方块,就判断当前触碰的方块是否能与之前的方块“相连”,如果可相连,则消除两个方块;如果两个方块不可以相连,则把当前方块设置为选中方块。 如果程序之前没有选中方块,直接将当前方块设置为选中方块。Link Activity用的两个类如下:

8、 GameConf:负责管理游戏的初始化设置信息 GameService:负责游戏的逻辑实现。8. 实现游戏逻辑GameSerive组件是整个游戏逻辑实现的核心,而且GameService是一个可以复用的业务逻辑类,它与游戏实现平台无关,既可在Java Swing程序中使用,也可在Android游戏中使用。 图16.GameServie接口 图17.实现了GameService接口的GameServiceImpl类时序图游戏玩家开始游戏时序图 图18.开始游戏时序图游戏玩家单击“开始”按钮,触发OnClick事件,调用startGame()函数,它启动计时器,记录游戏剩余的时间,同时向Game

9、Service发送消息,启动游戏,而GameService则调用AbstractBoard负责生成界面。玩家玩游戏时序图当游戏方块界面生成好后,玩家就可开始玩游戏了。当玩家接触屏幕时,触发触碰事件绑定监听器,Link类调用gameViewTouchDown(e)函数,GameService调用findPiece(touchX,touchy)将玩家刚才选中的图片进行标记,然后调用Links(this.selected,currentPiece)进行配对。如果能的话,则返回消息给Link,Link调用handleSuccessLink(linkInfo,selected,currentPiece,

10、pieces)进行成功连接后的处理。当玩家手指离开屏幕时,调用gameViewTouchUp(MotionEvent e),使GameView调用postInvalidate(),对屏幕进行重绘,然后返回给Link。 “连连看”实现虽然本程序比较小,但是代码还是比较多的。这里就不再列出所有的代码了。只列出Link类和GameServiceImpl类的代码,因为这两个类是本程序最重要的。Link类package com.example.link;import java.util.Timer;import java.util.TimerTask;import com.example.link.bo

11、ard.GameService;import com.example.link.object.GameConf;import com.example.link.object.LinkInfo;import com.example.link.view.GameView;import com.example.link.view.Piece;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.os.Vibrator;import android.app.Activity

12、;import android.app.AlertDialog;import android.app.AlertDialog.Builder;import android.content.DialogInterface;import android.view.Menu;import android.view.MotionEvent;import android.view.View;import android.view.View.OnClickListener;import android.view.View.OnTouchListener;import android.widget.Butt

13、on;import android.widget.TextView;public class Link extends Activity /游戏配置对象private GameConf config;/游戏业务逻辑接口private GameService gameService;/游戏界面 private GameView gameView;/开始按钮private Button startButton;/记录剩余时间的TextViewprivate TextView timeTextView;/失败后弹出的对话框private AlertDialog.Builder lostDialog;

14、/游戏胜利后的对话框private AlertDialog.Builder successDialog;/定时器private Timer timer = new Timer();/* * 游戏剩余时间 */private int gameTime;/ record games remain time/记录是否处于游戏状态private boolean isPlaying;private Vibrator vibrator;/ 振动处理类private Piece selected = null;/记录已经选中的方块private Handler handler = new Handler()

15、 public void handleMessage(Message msg) switch (msg.what) case 0x123:timeTextView.setText(剩余时间: + gameTime);gameTime-;/时间小于0,游戏失败if (gameTime 0) stopTimer();/更改游戏的状态 isPlaying = false;lostDialog.show();return;break;Overridepublic void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceS

16、tate);setContentView(R.layout.main);init();/ 初始化界面 * 初始化游戏的方法private void init() config = new GameConf(8, 9, 2, 10, 100000, this);/得到游戏区域对象gameView = (GameView) findViewById(R.id.gameView);/获取显示剩余时间的文本框timeTextView = (TextView) findViewById(R.id.timeText);/获取“开始按钮startButton = (Button) findViewById(

17、R.id.startButton);/获取振动器vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);gameService = new GameServiceImpl(this.config);gameView.setGameService(gameService);/为”开始“按钮的单击事件绑定事件监听器startButton.setOnClickListener(new OnClickListener() public void onClick(View v) startGame(GameConf.DEFAULT_TIME);)

18、;/为游戏区域的触碰事件绑定监听器this.gameView.setOnTouchListener(new OnTouchListener() public boolean onTouch(View v, MotionEvent event) if (event.getAction() = MotionEvent.ACTION_DOWN) gameViewTouchDown(event);if (event.getAction() = MotionEvent.ACTION_UP) gameViewTouchUp(event);return true;/初始化失败的对话框lostDialog =

19、 createDialog(Lost, 游戏失败!重新开始, R.drawable.lost).setPositiveButton(确定, new DialogInterface.OnClickListener() public void onClick(DialogInterface dialog, int which) startGame(GameConf.DEFAULT_TIME););/初始化游戏胜利的对话框successDialog = createDialog(Success游戏胜利!, R.drawable.success)protected void onPause() /暂停

20、游戏stopTimer();super.onPause();protected void onResume() /如果处于游戏状态中if (isPlaying) /以剩余时间重写开始游戏startGame(gameTime);super.onResume();/创建对话框的工具方法private Builder createDialog(String title, String message,int lostImageResource) return new AlertDialog.Builder(this).setTitle(title).setMessage(message).setIc

21、on(lostImageResource);/触碰游戏区域的处理方法protected void gameViewTouchUp(MotionEvent event) this.gameView.postInvalidate(); * 成功连接后的处理 * * param linkInfo 连接信息 * param selected2 前一个选中方块 * param currentPiece 当前选择方块 * param pieces 系统中还剩的全部方块private void handleSuccessLink(LinkInfo linkInfo, Piece selected2,Piec

22、e currentPiece, Piece pieces) /它们可以相连,让GamePanel处理LinkInfothis.gameView.setLinkInfo(linkInfo);/将gameView中的选中方块设为null;this.gameView.setSelectedPiece(null);/将两个Piece对象从数组中删除piecesselected2.getIndexX()selected2.getIndexY() = null;piecescurrentPiece.getIndexX()currentPiece.getIndexY() = null;/将选中方块设置nul

23、lthis.selected = null;/手机振动(100毫秒)this.vibrator.vibrate(100);/判断是否还有剩下的方块,如果没有,游戏胜利if (!this.gameService.hasPieces() /游戏胜利this.successDialog.show();/停止定时器stopTimer();/更改游戏状态isPlaying = false;/触碰游戏区域的方法protected void gameViewTouchDown(MotionEvent event) /获取GameServiceImpl中的Piece数组Piece pieces = gameS

24、ervice.getPieces();/获取用户点击的X坐标float touchX = event.getX();/获取用户点击的Y坐标float touchY = event.getY();/根据用户触碰的坐标得到对应的Piece对象 Piece currentPiece = gameService.findPiece(touchX, touchY);/如果没有选中任何Piece对象(即鼠标点击的地方没有图片),不再往下执行if (currentPiece = null) return;/将GameView中的选中方块设为当前方块this.gameView.setSelectedPiece(currentPiece);/表示之前没有选中任何一个Pieceif (this.selected = null) /将当前方块设为

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2