连连看游戏分析设计与实现Word格式.docx
- 文档编号:22117326
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:63
- 大小:1.22MB
连连看游戏分析设计与实现Word格式.docx
《连连看游戏分析设计与实现Word格式.docx》由会员分享,可在线阅读,更多相关《连连看游戏分析设计与实现Word格式.docx(63页珍藏版)》请在冰豆网上搜索。
Link包全部的包和Link类(游戏程序的入口)。
Util包中有ImageUtil类
Object包中有GameConf和LinkInfo类
Board包中有AbstraBoard和GameService类
View包中有GameView、Piece、PieceImage类
Board.impl包中有FullBoard、HorizontalBoard、VerticalBoard类
Link包中有GameServiceImpl和Link类。
类图
由于类比较多,属性和方法更多,因此类图只画出类名称,以后再详细说明类的属性和方法。
图3.连连看类图
1.PiececImage类
ﻩﻩ图4.PieceImge类
PieceImage代表了该方块上的图片,使用它来封装:
Bitmap对象和图片资源ID。
其中Bitmap对象用于在游戏界面上绘制方块;
而图片资源的ID则代表了该Piece对象的标识,当两个Piece所封装的图片资源的ID相等时,即可认为这两个Piece上的图片相同。
2.Piece类
图5.Piece类
一个Piece对象代表游戏界面上的一个方块,它除了封装它在左上角在游戏界面中X,Y坐标。
3.GameView类
图6.GameView类
GameView主要是根据游戏的状态数据来绘制界面上的方块,GameView继承了View组件,重写了View组件上onDraw(Canvascanvas)方法,重写该方法主要就是绘制游戏里剩余的方块,除此之外,它还会负责绘制连接方法的连接线。
4.GameConf
ﻩﻩﻩ图7.GameConf类
GameConf类是游戏的配置类,记录方块的大小像素,图片的起始坐标,运行时间,方块的维数,游戏上下文等。
5.LinkInfo类
图8.LinkInfo类
LinkInfo是一个非常简单的工具类,它用于封装两个方块之间的连接信息——其实就是封装一个List,List里保存了连接线需要经过的点。
连连看的游戏规则约定:
两个方块之间最多只能用3条线段相连,也就是说最多只能有2个“拐点”,加上两个方块的中心,方块的连接信息最多只需要4个连接点。
6.连连看的状态数据模型
实际上连连看的游戏界面是一个N*M的风格,每个网格上显示一张图片。
这个网格只需要用一个二维数据来定义即可,而每个网格上所显示的图片对于底层的数据模型来说,不同的图片对应于不同的数值即可。
图9显示所了数据模型的示意。
1
2
1
3
图9 连连看的数据模型
对于图9所示的数据模型,只要让数值为0的网络上不绘制图片,其他数值的网络则绘制相应的图片,就可显示出连连看的游戏界面了。
本程序实际上并不是直接使用int[][]数组来保存游戏的状态数据,而是采用Piece[][]来保存游戏的状态模型——因为Piece对象封装的信息更多,不仅包含了该方块的左上角的X、Y坐标,而且还包含了该Piece所显示的图片、图片ID——这个图片ID就可作为该Piece的数据。
为了初始化游戏状态,程序需要创建一个Piece[][]数组,为此程序定义一个AbstractBoard抽象类。
图10.AbstractBoard类
上面有一个createPieces(config,pieces)抽象方法来创建一个List<
Piece>
集合,该抽象方法将会交给其子类去实现。
由于连连看游戏的初始状态可能有很多种——比如横向分布、竖向分布的方块、矩阵排列的方块、随机分布的方块等,该程序为了考虑以后的扩展性,此处只是采用了模板模式:
定义AbstractBoard抽象基类来完成通用的代码,而暂时无法确定、需要子类实现的方法定义成createPieces(GameConfconfig,Piece[][]pieces)抽象方法。
矩阵排列的方块
图11.FullBoard类
竖向排列的方块
图12.VerticalBoard
横向排列的方块
图13.HorizontalBoard类
ImageUtil工具类(静态类),它的作用是自动搜寻/res/drawable-mdpi目录下的图片,并根据需要随机读取该目录下的图片
图14.ImageUtil类
7.实现游戏Activity
图15.Link类
Link类是游戏的入口,通过它来负责显示,Activity还需要为游戏界面的按钮、GameView组件的事件提供事件监听器。
对于GameView组件,程序需要监听用户的触碰动作,当用户触碰屏幕时,程序需要获取用户触碰的是哪个方块,并判断是否需要“消除”该方块。
为了判断能否消除该方块,程序需要进行如下判断:
Ø
如果程序之前已经选中了某个方块,就判断当前触碰的方块是否能与之前的方块“相连”,如果可相连,则消除两个方块;
如果两个方块不可以相连,则把当前方块设置为选中方块。
如果程序之前没有选中方块,直接将当前方块设置为选中方块。
LinkActivity用的两个类如下:
GameConf:
负责管理游戏的初始化设置信息
GameService:
负责游戏的逻辑实现。
8.实现游戏逻辑
GameSerive组件是整个游戏逻辑实现的核心,而且GameService是一个可以复用的业务逻辑类,它与游戏实现平台无关,既可在JavaSwing程序中使用,也可在Android游戏中使用。
图16.GameServie接口
图17.实现了GameService接口的GameServiceImpl类
时序图
游戏玩家开始游戏时序图
图18.开始游戏时序图
游戏玩家单击“开始”按钮,触发OnClick事件,调用startGame()函数,它启动计时器,记录游戏剩余的时间,同时向GameService发送消息,启动游戏,而GameService则调用AbstractBoard负责生成界面。
玩家玩游戏时序图
当游戏方块界面生成好后,玩家就可开始玩游戏了。
当玩家接触屏幕时,触发触碰事件绑定监听器,Link类调用gameViewTouchDown(e)函数,GameService调用findPiece(touchX,touchy)将玩家刚才选中的图片进行标记,然后调用Links(this.selected,currentPiece)进行配对。
如果能的话,则返回消息给Link,Link调用handleSuccessLink(linkInfo,selected,currentPiece,pieces)进行成功连接后的处理。
当玩家手指离开屏幕时,调用gameViewTouchUp(MotionEvent e),使GameView调用postInvalidate(),对屏幕进行重绘,然后返回给Link。
“连连看”实现
虽然本程序比较小,但是代码还是比较多的。
这里就不再列出所有的代码了。
只列出Link类和GameServiceImpl类的代码,因为这两个类是本程序最重要的。
Link类
packagecom.example.link;
importjava.util.Timer;
importjava.util.TimerTask;
importcom.example.link.board.GameService;
importcom.example.link.object.GameConf;
importcom.example.link.object.LinkInfo;
importcom.example.link.view.GameView;
importcom.example.link.view.Piece;
importandroid.os.Bundle;
importandroid.os.Handler;
importandroid.os.Message;
importandroid.os.Vibrator;
importandroid.app.Activity;
importandroid.app.AlertDialog;
importandroid.app.AlertDialog.Builder;
importandroid.content.DialogInterface;
importandroid.view.Menu;
importandroid.view.MotionEvent;
importandroid.view.View;
import android.view.View.OnClickListener;
importandroid.view.View.OnTouchListener;
importandroid.widget.Button;
importandroid.widget.TextView;
publicclassLinkextendsActivity {
ﻩ//游戏配置对象
ﻩprivate GameConf config;
//游戏业务逻辑接口
ﻩprivateGameServicegameService;
ﻩ//游戏界面
ﻩprivateGameViewgameView;
ﻩ//开始按钮
privateButtonstartButton;
//记录剩余时间的TextView
privateTextViewtimeTextView;
ﻩ//失败后弹出的对话框
ﻩprivateAlertDialog.BuilderlostDialog;
//游戏胜利后的对话框
ﻩprivateAlertDialog.Builder successDialog;
//定时器
ﻩprivateTimertimer=newTimer();
/**
ﻩ*游戏剩余时间
ﻩ */
private intgameTime;
//recordgame'
sremain time
//记录是否处于游戏状态
ﻩprivatebooleanisPlaying;
ﻩprivateVibrator vibrator;
//振动处理类
privatePieceselected =null;
//记录已经选中的方块
private Handler handler=newHandler(){
ﻩpublicvoid handleMessage(Messagemsg){
ﻩswitch (msg.what){
ﻩcase0x123:
ﻩtimeTextView.setText("
剩余时间:
"
+gameTime);
ﻩﻩgameTime--;
ﻩﻩﻩ//时间小于0,游戏失败
if(gameTime<
0) {
ﻩﻩstopTimer();
ﻩﻩ//更改游戏的状态
ﻩﻩisPlaying =false;
ﻩﻩﻩﻩlostDialog.show();
ﻩreturn;
ﻩﻩ}
break;
ﻩﻩ}
ﻩ}
ﻩ};
@Override
public void onCreate(Bundle savedInstanceState){
ﻩsuper.onCreate(savedInstanceState);
setContentView(R.layout.main);
ﻩinit();
//初始化界面
}
*初始化游戏的方法
*/
private voidinit(){
ﻩconfig =newGameConf(8,9,2,10, 100000,this);
ﻩ//得到游戏区域对象
ﻩgameView=(GameView) findViewById(R.id.gameView);
//获取显示剩余时间的文本框
ﻩtimeTextView =(TextView)findViewById(R.id.timeText);
ﻩﻩ//获取“开始"按钮
ﻩstartButton= (Button)findViewById(R.id.startButton);
ﻩ//获取振动器
vibrator= (Vibrator) getSystemService(VIBRATOR_SERVICE);
ﻩﻩgameService = newGameServiceImpl(this.config);
ﻩgameView.setGameService(gameService);
ﻩ//为”开始“按钮的单击事件绑定事件监听器
startButton.setOnClickListener(new OnClickListener() {
ﻩﻩpublicvoidonClick(Viewv){
ﻩﻩstartGame(GameConf.DEFAULT_TIME);
ﻩ}
ﻩ});
ﻩﻩ//为游戏区域的触碰事件绑定监听器
this.gameView.setOnTouchListener(new OnTouchListener(){
ﻩpublicboolean onTouch(Viewv,MotionEvent event){
ﻩﻩﻩif(event.getAction() ==MotionEvent.ACTION_DOWN){
ﻩﻩﻩgameViewTouchDown(event);
ﻩﻩ}
ﻩﻩif (event.getAction()==MotionEvent.ACTION_UP){
ﻩgameViewTouchUp(event);
ﻩ}
ﻩﻩreturntrue;
ﻩﻩ}
ﻩ});
ﻩ//初始化失败的对话框
ﻩlostDialog=createDialog("
Lost"
,"
游戏失败!
重新开始"
R.drawable.lost)
ﻩﻩﻩ.setPositiveButton("
确定"
newDialogInterface.OnClickListener(){
ﻩﻩpublicvoid onClick(DialogInterfacedialog,int which){
ﻩﻩﻩﻩstartGame(GameConf.DEFAULT_TIME);
ﻩﻩ}
ﻩ});
ﻩ//初始化游戏胜利的对话框
ﻩﻩsuccessDialog=createDialog("
Success"
游戏胜利!
重新开始",R.drawable.success)
ﻩﻩ.setPositiveButton("
newDialogInterface.OnClickListener() {
ﻩﻩpublicvoidonClick(DialogInterface dialog,intwhich){
startGame(GameConf.DEFAULT_TIME);
}
ﻩﻩ});
ﻩ}
ﻩprotectedvoidonPause(){
ﻩ//暂停游戏
ﻩstopTimer();
ﻩsuper.onPause();
ﻩprotectedvoid onResume(){
ﻩ//如果处于游戏状态中
if(isPlaying){
ﻩﻩﻩ//以剩余时间重写开始游戏
ﻩstartGame(gameTime);
ﻩ}
ﻩsuper.onResume();
ﻩ//创建对话框的工具方法
privateBuilder createDialog(Stringtitle,String message,
ﻩintlostImageResource){
ﻩreturnnew AlertDialog.Builder(this).setTitle(title)
ﻩﻩﻩ.setMessage(message).setIcon(lostImageResource);
}
ﻩ//触碰游戏区域的处理方法
protectedvoidgameViewTouchUp(MotionEventevent){
ﻩﻩthis.gameView.postInvalidate();
/**
ﻩ*成功连接后的处理
ﻩ*
*@paramlinkInfo 连接信息
ﻩ*@paramselected2前一个选中方块
* @paramcurrentPiece当前选择方块
ﻩ *@parampieces系统中还剩的全部方块
ﻩ*/
privatevoidhandleSuccessLink(LinkInfolinkInfo,Pieceselected2,
ﻩPiececurrentPiece,Piece[][]pieces) {
ﻩﻩ//它们可以相连,让GamePanel处理LinkInfo
this.gameView.setLinkInfo(linkInfo);
ﻩ//将gameView中的选中方块设为null;
ﻩﻩthis.gameView.setSelectedPiece(null);
ﻩﻩthis.gameView.postInvalidate();
ﻩﻩ//将两个Piece对象从数组中删除
ﻩpieces[selected2.getIndexX()][selected2.getIndexY()]=null;
ﻩpieces[currentPiece.getIndexX()][currentPiece.getIndexY()]= null;
//将选中方块设置null
ﻩthis.selected=null;
//手机振动(100毫秒)
this.vibrator.vibrate(100);
//判断是否还有剩下的方块,如果没有,游戏胜利
if(!
this.gameService.hasPieces()){
ﻩ//游戏胜利
ﻩﻩﻩthis.successDialog.show();
ﻩ//停止定时器
ﻩstopTimer();
//更改游戏状态
ﻩﻩisPlaying=false;
}
ﻩ//触碰游戏区域的方法
protected voidgameViewTouchDown(MotionEventevent){
//获取GameServiceImpl中的Piece[][]数组
ﻩPiece[][] pieces=gameService.getPieces();
ﻩ//获取用户点击的X坐标
ﻩﻩfloattouchX= event.getX();
ﻩﻩ//获取用户点击的Y坐标
ﻩﻩfloattouchY=event.getY();
ﻩ//根据用户触碰的坐标得到对应的Piece对象
ﻩPiece currentPiece=gameService.findPiece(touchX,touchY);
//如果没有选中任何Piece对象(即鼠标点击的地方没有图片),不再往下执行
if(currentPiece== null){
ﻩreturn;
ﻩ//将GameView中的选中方块设为当前方块
this.gameView.setSelectedPiece(currentPiece);
ﻩ//表示之前没有选中任何一个Piece
ﻩﻩif(this.selected==null){
ﻩﻩ//将当前方块设为已选中方块,重新将GamePanel绘制,并不再往下执行
this.selected=currentPiece;
ﻩﻩthis.gameView.postInvalidate();
ﻩﻩreturn;
ﻩﻩ}
ﻩ//表示之前已经选择一个
ﻩif(this.selected!
=null){
ﻩﻩ//在这里要对currentPiece和PrePiece进行判断并进行连接
ﻩﻩﻩLinkInfo linkInfo =this.gameService.link(this.selected,
ﻩﻩcurrentPiece);
ﻩ//两个Piece不可连,linkInfo为null
ﻩif (linkInfo== nul
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 连连 游戏 分析 设计 实现