目录第一章引言 (2)1.背景 (2)1.1课程设计内容 (3)第二章系统介绍 (4)1.连连看游戏规则 (4)1.1游戏基本规则 (4)1.2操作规则 (4)1.3胜利和失败 (4)2.游戏流程图分析 (4)第三章系统游戏设计 (7)1.系统分析 (7)1.1游戏系统需求分析 (7)1.2系统开发及运行环境 (7)1.3系统功能主要要求 (7)2.系统总体结构 (8)3. 系统各模块功能介绍 (8)第四章系统的具体实现 (9)1.系统主要运行界面 (9)1.1运行界面 (9)1.2执行界面,进入游戏正常运行 (9)1.3时间到界面 (10)1.4赢家界面 (11)1.5进度条界面 (12)图4.5程序运行进度条 (12)2.游戏实现代码 (12)2.1主面板内所需要的组件的声明 (12)2.2填充一个矩形框,进行显示时间 (12)2.3主面板及各组件初始化 (13)2.4创建时间对象,每隔100毫秒刷新一次 (13)2.5分数代码。
(13)3.消除图片具体情况 (14)3.1两次点击相同图片相邻 (14)3.2水平方向消去算法 (14)3.3竖直方向消去算法 (15)第五章程序清单 (16)第六章结束语 (24)第七章参考文献 (25)第一章引言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系列。
开发工具包:JDK Version1.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竖直消去算法图片第五章程序清单package c02;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.*;import javax.swing.*;class MyPanel extends JPanel {int cnt = 0;public void paint(Graphics g) {super.paint(g);g.setColor(Color.red);g.fillRect(this.getWidth() - cnt, 0, cnt, this.getHeight()); //填充一个矩形区域}public boolean isEnd() {if (cnt++ > this.getWidth())return true;repaint();return false;}}public class LianLianKan implements ActionListener {JFrame mainFrame; // 主面板MyPanel time;JPanel centerPanel, southPanel, northPanel; // 3个子面板JButton diamondsButton[][] = new JButton[6][5];// 游戏按钮数组JButton exitButton, newlyButton; // 退出,重新开始按钮JLabel scoreLable; // 分数标签JButton firstButton, secondButton; // 分别记录两次被选中的按钮Timer timer;int grid[][] = new int[8][7];// 储存游戏按钮位置static boolean pressInformation = false; // 判断是否有按钮被选中int sum=0;int x0 = 0, y0 = 0, x = 0, y = 0, fristMsg = 0, secondMsg = 0; // 游戏按钮的位置坐标int i, j, k, n;// 消除方法控制// =============调用图片================//private static Icon icons[] = new ImageIcon[6 * 5]; //静态数组icons【】用于存放图片绝对地址private static final String imgDir = "f:/meng";static {try{File dir = newFile(imgDir);File[] imgFiles =dir.listFiles(new FilenameFilter() { //获取f:/meng文件中的图片public boolean accept(File dir, String name) {returnname.toLowerCase().endsWith(".jpg");}});for (int i = 0; i < 6 * 5; i++) { //获取f:/meng文件中的图片的绝对路径放在icons数组中icons[i] = new ImageIcon(imgFiles[i].getAbsolutePath());//System.out.println(i+" "+icons[i]);}} catch (Exception e) {e.printStackTrace();// 异常处理}}public void init() { //初始化面板mainFrame = new JFrame("JKJ 连连看");// 设置主面板的名称为"JKJ连连看"mainFrame.setDefaultCloseOperation(JF rame.EXIT_ON_CLOSE);// 结束窗体所在的应用程序mainFrame.setLayout(new BorderLayout()); // 设置为BorderLayout()布局scoreLable= new JLabel("0");centerPanel = new JPanel();// 设置面板southPanel = new JPanel();northPanel = new JPanel();northPanel.setLayout(new BorderLayout()); //设置时间分数面板布局为边界布局mainFrame.add(centerPanel, "Center"); // 添加组件mainFrame.add(southPanel, "South");mainFrame.add(northPanel, "North");centerPanel.setLayout(new GridLayout(6, 5));// 设置一个6*5的网格布局for (int cols = 0; cols < 6;cols++) {for (int rows = 0; rows < 5; rows++) {// ===========设置图片=============//diamondsButton[cols][rows] = new JButton(icons[grid[cols + 1][rows + 1]]);diamondsButton[cols][rows].addActionL istener(this);centerPanel.add(diamondsButton[cols][ro ws]);}}exitButton = new JButton("退出");// 退出按钮exitButton.addActionListener(this);newlyButton = new JButton("再来一局");// 再来一局按钮newlyButton.addActionListener(this);southPanel.add(exitButton);// 添加退出按钮southPanel.add(newlyButton);// 添加再来一局按钮scoreLable.setText(String.valueOf(Intege r.parseInt(scoreLable.getText())));time = new MyPanel();northPanel.add(time, BorderLayout.CENTER); //时间-分数面板上在CENTER位置添加时间northPanel.add(scoreLable, BorderLayout.WEST); //时间-分数面板上在WEST位置添加分数LablemainFrame.setSize(500, 450); // 设置主面板的大小mainFrame.setLocationRelativeTo(null); //设置窗口在屏幕中间显示mainFrame.setVisible(true);//设置窗口可见}public void startt(){timer = new Timer(10, this);//创建时间对象,每隔100毫秒计时一次。