连连看课程设计.docx
- 文档编号:4617229
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:27
- 大小:819.33KB
连连看课程设计.docx
《连连看课程设计.docx》由会员分享,可在线阅读,更多相关《连连看课程设计.docx(27页珍藏版)》请在冰豆网上搜索。
连连看课程设计
第一章引言
1.背景
游戏“连连看”顾名思义就是找出相关联的东西,这个连连看在网上基本是用在小游戏中,就是找出相同的两样东西,在一定的规则之内可以做为相关联处理。
“连连看”的发展经历了从桌面游戏、在线游戏、社交游戏三个过程。
游戏“连连看”是源自台湾的桌面小游戏,自从流入大陆以来风靡一时,也吸引众多程序员开发出多种版本的“连连看”。
这其中,顾方编写的“阿达连连看”以其精良的制作广受好评,这也成为顾方“阿达系列软件”的核心产品。
并于2004年,取得了国家版权局的计算机软件著作权登记证书。
随着Flash应用的流行,网上出现了多种在线Flash版本“连连看”。
如“水晶连连看”、“果蔬连连看”等,流行的“水晶连连看”以华丽界面吸引了一大批的女性玩家。
2008年,随着社交网络的普及和开放平台的兴起,“连连看”被引入了社交网络。
“连连看”与个人空间相结合,被快速的传播,成为一款热门的社交游戏,其中以开发者Jonevey在Manyou开放平台上推出的“宠物连连看”最为流行。
网络小游戏、网页游戏越来越受网民欢迎,除了玩的方法简单外(不像其他游戏还需要注册下载繁琐过程),很多游戏不乏经典。
连连看游戏就是典型。
不管走到哪个网页游戏网站,连连看游戏总是排在受玩家欢迎排名的前5位,休闲、趣味、益智是连连看玩不厌的精华,且不分男女老少、工薪白领,是一款适合大众的经典网络、单机休闲小游戏。
游戏《连连看》,只要将相同的两张牌用三根以内的直线连在一起就可以消除,规则简单容易上手。
游戏速度节奏快,画面清晰可爱,适合细心的玩家。
丰富的道具和公共模式的加入,增强游戏的竞争性。
多样式的地图,使玩家在各个游戏水平都可以寻找到挑战的目标,长期地保持游戏的新鲜感。
该游戏由30张不同的图片组成,游戏开始将会出现30张随机组合的图片,在规则下点击两张相同的图片后图片将会消失。
图片全部消完为游戏成功。
游戏还将设置退出,再来一局的按钮,并实现该功能,方便用户进行操作。
1.1课程设计内容
(1)游戏计分功能
当消去两个相同的图片后分数将增加100分。
(2)退出功能
该功能有一个“退出”按钮,当按下“退出”按钮后,将直接退出游戏。
(3)成功完成任务时显示的
该功能有,恭喜成功,一个“再来一局”的按钮,当按下“再来一局”按钮后,图片将会重新排列,重新开始游戏。
(4)游戏倒计时功能
在游戏界面的上方有一个倒计时的进度条,增加游戏的难度,激发玩家的挑战兴趣。
第二章系统介绍
1.连连看游戏规则
1.1游戏基本规则
用鼠标左键点击方块,将2个图案相同的方块用连线连接起来,连接线不多于3根直线,连接后方块就会消失。
在规定的时间内将30张图片全部消除。
1.2操作规则
选择一个图片用鼠标左键点击,图片会变色,然后点击另一个同样图片,如果能够连线就成功消失,如果不能连线,第一次选择的图片就会失效,然后将继续寻找符合规则的图片。
1.3胜利和失败
把所有的图片成功消除完毕,则认为是本次游戏成功。
选择图片时间是有限的,在规定的时间内,若未能将图片全部消除,则失败,提醒是否再来一局。
2.游戏流程图分析
流程图分析如下图2.1所示:
图2.1游戏流程图
此次设计所使用的语言为Java。
主要应用到Swing组件,Java小程序,事件及接口等。
这些接口为游戏的制作提供了便捷的条件,本系统的主要特点就是运用Swing组件和事件处理技术,进行界面的绘制,鼠标的操作,以及积分的显示等功能。
这次通过连连看的设计开发将对理解Swing组件技术以及事件处理技术在游戏方面的应用起到很大的帮助作用,同时为掌握Java编程技术及二维休闲游戏设计的一般方法打下坚实的基础。
游戏程序设计一般都采用面向对象的设计模式,提供了一个简单的图像显示接口,利用多文档视图结构的面向对象设计模式。
第三章系统游戏设计
1.系统分析
1.1游戏系统需求分析
主要设计目标:
使用GUI设计连连看,载入图片信息,进行正确分析系统的功能,总载入30张图片,且图片信息成对出现,且可以偶数项删除,并具有计时等功能游戏中将有“退出”功能,选择退出命令后程序将终止执行,关闭窗口。
还将有“再来一局”功能,选择再来一局命令后程序将对图片重新排列,重新开始游戏。
该游戏还有一个时间倒计时的进度条,提醒玩家剩余的时间,增加游戏的难度。
在界面的顶部有计分功能,当玩家消去图片后就会赢得相应的分数。
1.2系统开发及运行环境
硬件平台:
本游戏对硬件要求较低,基本都可以正常运行。
软件平台:
操作系统:
Windows系列。
开发工具包:
JDKVersion1.6.2。
1.3系统功能主要要求
1.系统采用图片连连看方式.界面美观,用户使用灵活,方便快捷.
2.计分自动完成,提高工作效率。
3.用进度条进行游戏界面的计时功能。
4.可方便快捷地进行下一盘游戏,并且两盘的分数在规定的时间内会叠加起来。
5.操作员可以随时退出游戏。
6.对用户输入的信息,系统进行严格的信息检验,尽可能排除人为的错误。
7.系统最大限度地实现了易维护性和易操作性。
8.系统运行稳定、安全可靠。
2.系统总体结构
连连看是基于java基本知识设置的一个小游戏,最中间有连连看的主体构成——连连看图片,上面有计分、时间条,下面有退出、再来一局按键。
一个标准的连连看系统应该包括以下几大功结构:
1、鼠标操作模块;
2、图像处理模块;
3、菜单模块;
4、显示模块。
3.系统各模块功能介绍
系统各功能模块实现的功能为
鼠标操作模块:
玩家在玩游戏时需要运用鼠标与游戏系统进行交互,这个模块的实现是运用鼠标事件触发的,在连连看的游戏场景中运用鼠标进行交互的事件主要有两个,一个是用户点击游戏场景中的图片时触发的事件。
另外一种是用户点击菜单栏上的菜单按钮时说触发的鼠标事件。
当用户点击游戏场景中的图像块时就会响应鼠标的OnLButtonDown事件,然后进行相应的逻辑判断。
当用户点击菜单栏上的菜单命令时就会触发相应的菜单命令对应的相应的事件。
图像处理模块:
程序运行后,用户通过游戏菜单的开始命令进入游戏,在这个模块里要把资源文件中的图片进行处理然后加载到游戏场景中这在程序中是通过DrawMap()方法实现的。
其中用到的API函数主要是是BitBlt,他的主要功能是将某一内存块的数据传送到另一内存块,前一内存块被称为"源",后一内存块被称为"目标"图象程序开发者使用Blit的函数在内存中将某页面上的一幅位图经过一定的变换转移到另一个页面上。
菜单模块:
玩家在游戏游戏过程中随时可以通过选择不同的菜单命令来进行相应的操作,菜单的制作是通过MFC框架中多文档程序的菜单栏来添加的,菜单包含一下几个部分:
(1)游戏菜单中的开始、放弃和退出命令。
界面显示模块:
游戏场景中界面的显示包括以下部分:
游戏计分,剩余时间、游戏主场景,游戏完成提示界面。
这些显示信息会随着游戏的进行而动态改变。
在连连看游戏中。
整个连连看游戏的系统是在VC++6.0开发环境中进行开发的,开发过程中大量的使用了微软提供的API接口方法,减少了程序代码的编写量、提高了编程效率。
第四章系统的具体实现
1.系统主要运行界面
1.1运行界面
运行界面如下图4.1所示:
图4.1运行界面
1.2执行界面,进入游戏正常运行
执行界面如下图4.2所示:
图4.2执行界面
1.3时间到界面
时间到界面如下图4.3所示:
图4.3时间到界面
1.4赢家界面
游戏运行成功界面如下图4.4所示:
图4.4游戏运行成功界面
1.5进度条界面
程序运行进度条如下图4.5所示:
图4.5程序运行进度条
2.游戏实现代码
2.1主面板内所需要的组件的声明
主面板内所需要的组件的声明代码如下图4.6所示:
图4.6组件声明
2.2填充一个矩形框,进行显示时间
填充一个矩形框,进行显示时间代码如下图4.7所示:
图4.7填充矩形框显示时间
2.3主面板及各组件初始化
主面板及各组件初始化如下图4.8所示:
图4.8主面板及各组件初始化
2.4创建时间对象,每隔100毫秒刷新一次
创建时间对象,每隔100毫秒刷新一次代码如下图4.9所示:
图4.9创建时间对象
2.5分数代码。
每消除一对图片,则分数加上100。
代码如下图4.10所示:
图4.10分数代码
3.消除图片具体情况
当点击两个按钮的图片一样时,运用消去算法来判断是否可消去,具体情况如下:
3.1两次点击相同图片相邻
当两次点击的相同图片相邻时,如下图4.11所示,则消去。
图4.11点击图片相邻
3.2水平方向消去算法
当两次点击的相同图片如下图4.12所示,则在水平方向用循环算法for(j=0;j<7;j++)判断,设第一次选中按钮坐标为x0,y0,第二次选中按钮坐标为x,y,则先找到grid(x0,j)为0的j,再判断x水平方向x到j是否grid(x,j)都为0,若是则判断x0水平方向x0到j是否grid(x0,j)都为0,若是,则再判断x和x0,若相等消去,若不等判断在j竖直方向上是否grid(n,j)(n为x到x0之间的数)都为0,若是则消去。
图4.12水平消去算法图片
3.3竖直方向消去算法
竖直方向消去算法。
情况与水平方向基本相同,重点提一下图片4.13所示的情况,其余情况不再重复描述。
出现下图情况则会消去,消去原理与水平方向消去算法相似。
图4.13竖直消去算法图片
第五章程序清单
packagec02;
importjava.awt.*;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.io.*;
importjavax.swing.*;
classMyPanelextendsJPanel{
intcnt=0;
publicvoidpaint(Graphicsg){
super.paint(g);
g.setColor(Color.red);
g.fillRect(this.getWidth()-cnt,0,cnt,this.getHeight());//填充一个矩形区域
}
publicbooleanisEnd(){
if(cnt++>this.getWidth())
returntrue;
repaint();
returnfalse;
}
}
publicclassLianLianKanimplementsActionListener{
JFramemainFrame;//主面板
MyPaneltime;
JPanelcenterPanel,southPanel,northPanel;//3个子面板
JButtondiamondsButton[][]=newJButton[6][5];//游戏按钮数组
JButtonexitButton,newlyButton;//退出,重新开始按钮
JLabelscoreLable;//分数标签
JButtonfirstButton,secondButton;//分别记录两次被选中的按钮
Timertimer;
intgrid[][]=newint[8][7];//储存游戏按钮位置
staticbooleanpressInformation=false;//判断是否有按钮被选中
intsum=0;
intx0=0,y0=0,x=0,y=0,fristMsg=0,secondMsg=0;//游戏按钮的位置坐标
inti,j,k,n;//消除方法控制
//=============调用图片================//
privatestaticIconicons[]=newImageIcon[6*5];//静态数组icons【】用于存放图片绝对地址
privatestaticfinalStringimgDir="f:
/meng";
static{
try
{
Filedir=newFile(imgDir);
File[]imgFiles=dir.listFiles(newFilenameFilter(){//获取f:
/meng文件中的图片
publicbooleanaccept(Filedir,Stringname){
returnname.toLowerCase().endsWith(".jpg");
}
});
for(inti=0;i<6*5;i++){//获取f:
/meng文件中的图片的绝对路径放在icons数组中
icons[i]=newImageIcon(imgFiles[i].getAbsolutePath());
//System.out.println(i+""+icons[i]);
}
}catch(Exceptione){
e.printStackTrace();//异常处理
}
}
publicvoidinit(){//初始化面板
mainFrame=newJFrame("JKJ连连看");//设置主面板的名称为"JKJ连连看"
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//结束窗体所在的应用程序
mainFrame.setLayout(newBorderLayout());//设置为BorderLayout()布局
scoreLable=newJLabel("0");
centerPanel=newJPanel();//设置面板
southPanel=newJPanel();
northPanel=newJPanel();
northPanel.setLayout(newBorderLayout());//设置时间分数面板布局为边界布局
mainFrame.add(centerPanel,"Center");//添加组件
mainFrame.add(southPanel,"South");
mainFrame.add(northPanel,"North");
centerPanel.setLayout(newGridLayout(6,5));//设置一个6*5的网格布局
for(intcols=0;cols<6;cols++){
for(introws=0;rows<5;rows++){
//===========设置图片=============//
diamondsButton[cols][rows]=newJButton(
icons[grid[cols+1][rows+1]]);
diamondsButton[cols][rows].addActionListener(this);
centerPanel.add(diamondsButton[cols][rows]);
}
}
exitButton=newJButton("退出");//退出按钮
exitButton.addActionListener(this);
newlyButton=newJButton("再来一局");//再来一局按钮
newlyButton.addActionListener(this);
southPanel.add(exitButton);//添加退出按钮
southPanel.add(newlyButton);//添加再来一局按钮
scoreLable.setText(String.valueOf(Integer.parseInt(scoreLable
.getText())));
time=newMyPanel();
northPanel.add(time,BorderLayout.CENTER);//时间-分数面板上在CENTER位置添加时间
northPanel.add(scoreLable,BorderLayout.WEST);//时间-分数面板上在WEST位置添加分数Lable
mainFrame.setSize(500,450);//设置主面板的大小
mainFrame.setLocationRelativeTo(null);//设置窗口在屏幕中间显示
mainFrame.setVisible(true);//设置窗口可见
}
publicvoidstartt(){
timer=newTimer(10,this);//创建时间对象,每隔100毫秒计时一次。
init();
timer.start();
}
publicvoidrandomBuild()//初始化存放游戏按钮位置的grid[][]数组(也就是icon【】下标+1)
{
intrandoms,cols,rows;//变量定义
for(inttwins=1;twins<=15;twins++){
randoms=(int)(Math.random()*24);
for(intalike=1;alike<=2;alike++){
cols=(int)(Math.random()*6+1);
rows=(int)(Math.random()*5+1);
while(grid[cols][rows]!
=0){
cols=(int)(Math.random()*6+1);
rows=(int)(Math.random()*5+1);
}
this.grid[cols][rows]=randoms;
}
}
}
publicvoidscore()//方法声明
{
scoreLable.setText(String.valueOf(Integer.parseInt(scoreLable
.getText())+100));
}
publicvoidreload()//方法声明
{
intsave[]=newint[30];//创建声明数组
intn=0,cols,rows;//变量定义
intgrid[][]=newint[8][7];//创建声明数组
for(inti=0;i<=6;i++){
for(intj=0;j<=5;j++){
if(this.grid[i][j]!
=0){
save[n]=this.grid[i][j];
n++;
}
}
}
n=n-1;
this.grid=grid;//this出现在实例方法中,表示使用该方法的当前对象
while(n>=0)//while循环
{
cols=(int)(Math.random()*6+1);
rows=(int)(Math.random()*5+1);
while(grid[cols][rows]!
=0)//循环嵌套
{
cols=(int)(Math.random()*6+1);
rows=(int)(Math.random()*5+1);
}
this.grid[cols][rows]=save[n];//this出现在实例方法中,表示使用该方法的当前对象
n--;
}
mainFrame.setVisible(false);//窗口不可见
pressInformation=false;//这里一定要将按钮点击信息归为初始
init();
for(inti=0;i<6;i++)//for循环
{
for(intj=0;j<5;j++)//循环嵌套
{
if(grid[i+1][j+1]==0)
diamondsButton[i][j].setVisible(false);//窗口不可见
}
}
}
publicvoidestimateEven(intplaceX,intplaceY,JButtonbz)//点击按钮触发
{
if(pressInformation==false)//选择语句
{
x=placeX;
y=placeY;
secondMsg=grid[x][y];
secondButton=bz;
pressInformation=true;
}else{
x0=x;
y0=y;
fristMsg=secondMsg;
firstButton=secondButton;
x=placeX;
y=placeY;
secondMsg=grid[x][y];
secondButton=bz;
if(fristMsg==secondMsg&&secondButton!
=firstButton){//相同的情况下能不能消去。
xiao();
}
}
}
publicvoidxiao()
{
if((x0==x&&(y0==y+1||y0==y-1))
||(y0==y)&&((x0==x+1||x0==x-1)))//判断是否相邻
{
remove();
}else{
for(j=0;j<7;j++){
if(grid[x0][j]==0)//判断第一个按钮同行哪个按钮为空
{
if(y>j)//如果第二个按钮的Y坐标大于空按钮的Y坐标说明第一按钮在第二按钮左边
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 连连 课程设计