连连看课程设计_第1页
连连看课程设计_第2页
连连看课程设计_第3页
连连看课程设计_第4页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第一章引言1.背景游戏 “连连看 ”顾名思义就是找出相关联的东西, 这个连连看在网上基本是用在小游戏中,就是找出相同的两样东西, 在一定的规则之内可以做为相关联处理。“连连看 ”的发展经历了从桌面游戏、在线游戏、社交游戏三个过程。游戏 “连连看 ”是源自台湾的桌面小游戏, 自从流入大陆以来风靡一时, 也吸引众多程序员开发出多种版本的 “连连看 ”。这其中,顾方编写的 “阿达连连看 ”以其精良的制作广受好评,这也成为顾方 “阿达系列软件 ”的核心产品。并于 2004 年,取得了国家版权局的计算机软件著作权登记证书。随着 Flash 应用的流行,网上出现了多种在线 Flash 版本 “连连看 ”。

2、如 “水晶连连看 ”、“果蔬连连看 ”等,流行的 “水晶连连看 ”以华丽界面吸引了一大批的女性玩家。2008 年,随着社交网络的普及和开放平台的兴起,“连连看 ”被引入了社交网络。 “连连看 ”与个人空间相结合,被快速的传播,成为一款热门的社交游戏,其中以开发者 Jonevey 在 Manyou 开放平台上推出的 “宠物连连看 ”最为流行。网络小游戏、 网页游戏越来越受网民欢迎, 除了玩的方法简单外 (不像其他游戏还需要注册下载繁琐过程) ,很多游戏不乏经典。连连看游戏就是典型。不管走到哪个网页游戏网站,连连看游戏总是排在受玩家欢迎排名的前5位,休闲、趣味、益智是连连看玩不厌的精华,且不分男女

3、老少、工薪白领,是一款适合大众的经典网络、单机休闲小游戏。游戏连连看,只要将相同的两张牌用三根以内的直线连在一起就可以消除,规则简单容易上手。游戏速度节奏快,画面清晰可爱,适合细心的玩家。丰富的道具和公共模式的加入, 增强游戏的竞争性。 多样式的地图, 使玩家在各个游戏水平都可以寻找到挑战的目标,长期地保持游戏的新鲜感。该游戏由 30 张不同的图片组成,游戏开始将会出现30 张随机组合的图片,在规则下点击两张相同的图片后图片将会消失。 图片全部消完为游戏成功。 游戏还将设置退出,再来一局的按钮,并实现该功能,方便用户进行操作。1.1 课程设计内容( 1)游戏计分功能当消去两个相同的图片后分数将

4、增加 100 分。1( 2)退出功能该功能有一个“退出”按钮,当按下“退出”按钮后,将直接退出游戏。( 3)成功完成任务时显示的该功能有,恭喜成功,一个“再来一局”的按钮,当按下“再来一局”按钮后,图片将会重新排列,重新开始游戏。( 4)游戏倒计时功能在游戏界面的上方有一个倒计时的进度条, 增加游戏的难度, 激发玩家的挑战兴趣。2第二章系统介绍1.连连看游戏规则1.1 游戏基本规则用鼠标左键点击方块, 将 2 个图案相同的方块用连线连接起来, 连接线不多于 3 根直线,连接后方块就会消失。在规定的时间内将 30 张图片全部消除。1.2 操作规则选择一个图片用鼠标左键点击, 图片会变色, 然后点

5、击另一个同样图片, 如果能够连线就成功消失, 如果不能连线, 第一次选择的图片就会失效, 然后将继续寻找符合规则的图片。1.3 胜利和失败把所有的图片成功消除完毕,则认为是本次游戏成功。选择图片时间是有限的, 在规定的时间内, 若未能将图片全部消除, 则失败,提醒是否再来一局。2.游戏流程图分析流程图分析如下图2.1 所示:3开始鼠标点击位置的确定判断是否点击在图片方块?判断是否已选定一个方块?选定第一个方块选定第二个方块判断是否可以抵消方块?抵消方块消除选定方块的记录结束图 2.1 游戏流程图此次设计所使用的语言为Java。主要应用到 Swing 组件, Java小程序,事4件及接口等。这些

6、接口为游戏的制作提供了便捷的条件, 本系统的主要特点就是运用 Swing 组件和事件处理技术, 进行界面的绘制, 鼠标的操作, 以及积分的显示等功能。这次通过连连看的设计开发将对理解 Swing 组件技术以及事件处理技术在游戏方面的应用起到很大的帮助作用,同时为掌握 Java 编程技术及二维休闲游戏设计的一般方法打下坚实的基础。游戏程序设计一般都采用面向对象的设计模式, 提供了一个简单的图像显示接口,利用多文档视图结构的面向对象设计模式。5第三章系统游戏设计1.系统分析1.1 游戏系统需求分析主要设计目标:使用 GUI 设计连连看,载入图片信息,进行正确分析系统的功能,总载入30 张图片,且图

7、片信息成对出现,且可以偶数项删除,并具有计时等功能游戏中将有“退出”功能,选择退出命令后程序将终止执行,关闭窗口。还将有“再来一局”功能,选择再来一局命令后程序将对图片重新排列,重新开始游戏。 该游戏还有一个时间倒计时的进度条, 提醒玩家剩余的时间, 增加游戏的难度。在界面的顶部有计分功能, 当玩家消去图片后就会赢得相应的分数。1.2 系统开发及运行环境硬件平台:本游戏对硬件要求较低,基本都可以正常运行。软件平台:操作系统: Windows 系列。开发工具包:。1.3 系统功能主要要求1.系统采用图片连连看方式.界面美观 ,用户使用灵活 ,方便快捷 .2.计分自动完成,提高工作效率。3.用进度

8、条进行游戏界面的计时功能。4.可方便快捷地进行下一盘游戏,并且两盘的分数在规定的时间内会叠加起来。5.操作员可以随时退出游戏。6.对用户输入的信息,系统进行严格的信息检验,尽可能排除人为的错误。7.系统最大限度地实现了易维护性和易操作性。8.系统运行稳定、安全可靠。62.系统总体结构连连看是基于 java 基本知识设置的一个小游戏,最中间有连连看的主体构成连连看图片,上面有计分、时间条,下面有退出、再来一局按键。一个标准的连连看系统应该包括以下几大功结构:1、鼠标操作模块;2、图像处理模块;3、菜单模块;4、显示模块。3. 系统各模块功能介绍系统各功能模块实现的功能为鼠标操作模块: 玩家在玩游

9、戏时需要运用鼠标与游戏系统进行交互, 这个模块的实现 是运用鼠标事件触发的,在连连看的游戏场景中运用鼠标进行交互的事件主要有两个,一个 是用户点击游戏场景中的图片时触发的事件。另外一种是用户点击菜单栏上的菜单按钮时说 触发的鼠标事件。当用户点击游戏场景中的图像块时就会响应鼠标的 OnLButtonDown 事件,然后进行相应的逻辑判断。当用户点击菜单栏上的菜单命令时就会触发相应的菜单命令对应的相应的事件。图像处理模块 : 程序运行后,用户通过游戏菜单的开始命令进入游戏,在这个模块里要把资源文件中的图片进行处理然后加载到游戏场景中这在程序中是通过 DrawMap() 方法实现的。其中用到的 AP

10、I 函数主要是是 BitBlt ,他的主要功能是将某一内存块的数据传送到另一内存块,前一内存块被称为 "源 ",后一内存块被称为 "目标 "图象程序开发者使用 Blit 的函数在内存中将某页面上的一幅位图经过一定的变换转移到另一个页面上。菜单模块 : 玩家在游戏游戏过程中随时可以通过选择不同的菜单命令来进行相应的操作,菜单的制作是通过MFC 框架中多文档程序的菜单栏来添加的,菜单包含一下几个部分 :(1)游戏菜单中的开始、放弃和退出命令。界面显示模块 : 游戏场景中界面的显示包括以下部分: 游戏计分,剩余时间、游戏主场景,游戏完成提示界面。这些显示信息会

11、随着游戏的进行而动态改变。在连连看游戏中。整个连连看游戏的系统是在 VC+6.0 开发环境中进行开发的,开发过程中大量的使用了微软提供的 API 接口方法,减少了程序代码的编写量、提高了编程效率。7第四章系统的具体实现1.系统主要运行界面1.1 运行界面运行界面如下图 4.1 所示:图 4.1 运行界面1.2 执行界面,进入游戏正常运行执行界面如下图 4.2 所示:8图 4.2 执行界面1.3 时间到界面时间到界面如下图4.3 所示:9图 4.3 时间到界面1.4 赢家界面游戏运行成功界面如下图4.4 所示:图 4.4 游戏运行成功界面101.5 进度条界面程序运行进度条如下图4.5 所示:图

12、 4.5 程序运行进度条2.游戏实现代码2.1 主面板内所需要的组件的声明主面板内所需要的组件的声明代码如下图4.6 所示:图 4.6 组件声明2.2 填充一个矩形框,进行显示时间填充一个矩形框,进行显示时间代码如下图4.7 所示:图 4.7 填充矩形框显示时间112.3 主面板及各组件初始化主面板及各组件初始化如下图4.8 所示:图 4.8 主面板及各组件初始化2.4 创建时间对象,每隔100 毫秒刷新一次创建时间对象,每隔100 毫秒刷新一次代码如下图4.9 所示:图 4.9 创建时间对象2.5 分数代码。每消除一对图片,则分数加上100。代码如下图 4.10 所示:12图 4.10 分数

13、代码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

14、 是否 grid( x0,j )都为 0,若是,则再判断 x 和x0,若相等消去,若不等判断在 j 竖直方向上是否 grid( n,j)(n 为 x 到 x0 之间的数)都为 0,若是则消去。13图 4.12 水平消去算法图片3.3 竖直方向消去算法竖直方向消去算法。情况与水平方向基本相同,重点提一下图片 4.13 所示的情况,其余情况不再重复描述。 出现下图情况则会消去, 消去原理与水平方向消去算法相似。图 4.13 竖直消去算法图片14第五章程序清单package c02;class MyPanel extends JPanel int cnt = 0;public void paint(

15、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 c

16、enterPanel, southPanel, northPanel; / 3 个子面板JButton diamondsButton = new JButton65;/ 游戏按钮数组JButton exitButton, newlyButton; / 退出,重新开始按钮JLabel scoreLable; / 分数标签 JButton firstButton, secondButton;/ 分别记录两次被选中的按钮Timer timer;int grid = new int87;/ 储存游戏按钮位置static boolean pressInformation =false; / 判断是否有按

17、钮被选中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 ImageIcon6 * 5; /静态数组 icons【】用于存放图片绝对地址private static final String imgDir ="f:/meng"static tryFile dir = newFile(imgDir);File imgFiles =dir

18、.listFiles(new FilenameFilter() / 获取f:/meng 文件中的图片public booleanaccept(File dir, String name) returnname.toLowerCase().endsWith(".jpg"););for (int i = 0; i < 6 * 5; i+)/获取 f:/meng 文件中的图片的绝对路径放在icons 数组中 iconsi = newImageIcon(imgFilesi.getAbsolutePath();/"+iconsi); catch (Exception

19、e) e.printStackTrace();/ 异常处理public void init() /初始化面板mainFrame = new JFrame("JKJ 连连看 ");/ 设置主面板的名称为 "JKJ 连连15看"mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/结束窗体所在的应用程序mainFrame.setLayout(newBorderLayout();/ 设置为 BorderLayout()布局scoreLable= new JLabel("0");c

20、enterPanel = new JPanel();/设置面板southPanel = new JPanel();northPanel = new JPanel();northPanel.setLayout(newBorderLayout(); /设置时间分数面板布局为边界布局mainFrame.add(centerPanel,"Center");/ 添加组件mainFrame.add(southPanel,"South");mainFrame.add(northPanel,"North");centerPanel.setLayout

21、(newGridLayout(6, 5);/设置一个6*5 的网格布局for (int cols = 0; cols < 6;cols+) for (int rows = 0; rows < 5;rows+) / = 设置图片 =/diamondsButtoncolsrows = new JButton(iconsgridcols + 1rows + 1);diamondsButtoncolsrows.addActionL istener(this);centerPanel.add(diamondsButtoncolsrows);exitButton = new JButton(&

22、quot; 退出 ");/ 退出按钮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 = ne

23、w 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

24、 = new Timer(10, this);/ 创建时间对象,每隔 100 毫秒计时一次。 init();timer.start();public void randomBuild() /初始化存放游戏按钮位置的grid 数组(也就是icon【】下标 +1)int randoms, cols, rows; /变量定义16for (int twins = 1; twins <= 15;n+;twins+) randoms = (int)(Math.random() *24);for (int alike = 1; alike <=n = n - 1;2; alike+) this.

25、grid = grid; / this出现在cols = (int)实例方法中,表示使用该方法的当前对象(Math.random() * 6 + 1);while (n >= 0) / while循环rows = (int)(Math.random() * 5 + 1);cols = (int) (Math.random()while*6+1);(gridcolsrows != 0) rows = (int)cols = (int)(Math.random() * 5 + 1);(Math.random() * 6 + 1);while (gridcolsrows !=rows = (i

26、nt)0)/ 循环嵌套(Math.random() * 5 + 1);cols = (int)this.gridcolsrows(Math.random() * 6 + 1);= randoms;rows = (int)(Math.random() * 5 + 1);this.gridcolsrows =public void score()/ 方法声明saven; / this 出现在实例方法中, 表示使用该方法的当前对象n-;scoreLable.setText(String.valueOf(Intege r.parseInt(scoreLable.getText() + 100);pub

27、lic void reload()/方法声明int save = new int30; /创建声明数组int n = 0, cols, rows; /变量定义int grid = new int87; /创建声明数组for (int i = 0; i <= 6; i+) for (int j = 0; j <= 5; j+)mainFrame.setVisible(false);/窗口不可见pressInformation = false; / 这里一定要将按钮点击信息归为初始init();for (int i = 0; i < 6; i+)/ for循环for (int j

28、 = 0; j < 5; j+)/循环嵌套if (gridi + 1j + 1= 0)if (this.gridij != 0)diamondsButtonij.setVisible(false);/窗口不可见saven =this.gridij;17public void estimateEven(int placeX, int placeY , JButton bz) / 点击按钮触发if (pressInformation = false)/选择语句x = placeX;y = placeY;secondMsg = gridxy;secondButton = bz;pressInf

29、ormation = true; else x0 = x;y0 = y;fristMsg = secondMsg;firstButton =secondButton;x = placeX;y = placeY;secondMsg = gridxy;secondButton = bz;if (fristMsg =secondMsg && secondButton != firstButton)/ 相同的情况下能不能消去。 xiao();public void xiao()if (x0 = x && (y0 = y + 1 |y0 = y - 1)|(y0 = y)

30、 && (x0= x + 1 | x0 = x - 1) )/ 判断是否相邻remove(); else for (j = 0; j < 7; j+) if (gridx0j = 0)/判断第一个按钮同行哪个按钮为空if (y > j) /如果第二个按钮的Y 坐标大于空按钮的Y 坐标说明第一按钮在第二按钮左边for (i = y -1; i >= j; i-)/判断第二按钮左侧直到第一按钮中间有没有按钮if(gridxi != 0) k= 0;break; elsek= 1; /K=1 说明通过了第一次验证if (k = 1)linePassOne();if

31、(y < j) /如果第二个按钮的 Y 坐标小于空按钮的 Y 坐标说明第一按钮在第二按钮右边for (i = y +1; i <= j; i+)/判断第二按钮左侧直到第一按钮中间有没有按钮if(gridxi != 0) k= 0;break; elsek18=1;if(gridnj = 0 && n = x + 1) if (k = 1)remove();linePassOne();if (y = j) for (i = 0; i < 8; i+)/列linePassOne();if (gridiy0 = 0) if (x > i) if (k = 2)

32、 for (j = x -if (x0 = x) 1; j >= i; j-) remove();if(gridjy != 0) if (x0 < x) kfor (n = x0;= 0;n <= x - 1; n+) ifbreak;(gridnj != 0) elsek= 0;k= 1;break;ifif (k = 1)(gridnj = 0 && n = x - 1) remove();rowPassOne();if (x < i) if (x0 > x) for (j = x +for (n = x0;1; j <= i; j+)

33、n >= x + 1; n-) ifif(gridjy != 0) (gridnj != 0) kk= 0;= 0;break;break; else19kbreak;= 1;if(gridin = 0 && n = y + 1) if (k = 1)remove();rowPassOne();if (x = i) rowPassOne();public void linePassOne() if (y0 > j)/ 第一按钮同行空if (k = 2) 按钮在左边if (y0 = y) remove();for (i = y0 - 1; i >= j; i-)

34、/判断第一按钮同左侧空按钮之间有没按钮if (y0 < y) for (n = y0;if (gridx0i != 0) n <= y - 1; n+) k = 0;ifbreak;(gridin != 0) else kk = 2;= 0; / K=2 说明通过了第二次验证break;ifif (y0 < j)/ 第一按钮同行空(gridin = 0 && n = y - 1) 按钮在与第二按钮之间remove();for (i = y0 + 1; i <= j; i+)if (gridx0i != 0) k = 0;if (y0 > y) br

35、eak;for (n = y0; else n >= y + 1; n-) k = 2;if(gridin != 0) k= 0;20public void rowPassOne() "恭喜你,你赢if (x0 > i) 了!想再来一局吗? ", " 胜利 ",for (j = x0 - 1; j >= i; j-) if (gridjy0 != 0) JOptionPane.YES_NO_OPTION)=k = 0;JOptionPane.OK_OPTION) break;int grid = new else int87;k = 2

36、;this.grid = grid;randomBuild();mainFrame.setVisible(false);/ 窗口不可if (x0 < i) 见for (j = x0 + 1; j <= i; j+)pressInformation =false;if (gridjy0 != 0) init();k = 0;break;timer.start();/ 启动线 else 程k = 2;sum=0; elseSystem.exit(0);public void remove() /消除两个按钮if(gridx0y0 !=0 &&gridxy!= 0)pub

37、lic voidactionPerformed(ActionEvent e) /接口实现firstButton.setVisible(false); /不可见if (e.getSource() =newlyButton) secondButton.setVisible(false);int grid = newscore();int87;/ 创建数组/分数加 100this.grid = grid;pressInformation = false;randomBuild();gridx0y0 = 0;gridxy = 0;mainFrame.setVisible(false);/ 窗口不可su

38、m+;见if(sum=15)pressInformation = false;init();timer.stop();timer.start();ifsum=0;(JOptionPane.showConfirmDialog(mainFrame,if (e.getSource() = exitButton)21System.exit(0);动线程if (e.getSource() = timer) sum=0;if (time.isEnd() elsetimer.stop();/ 时间到System.exit(0);的提示if(JOptionPane.showConfirmDialog(main

39、Framfor (int cols = 0; cols < 6;e,cols+) " 时间到for (int rows = 0; rows < 5;了,o( )o n 要再来一局吗? ", " 提示 ",rows+) if (e.getSource() =JOptionPane.YES_NO_OPTION)=diamondsButtoncolsrows)JOptionPane.OK_OPTION) int grid =estimateEven(cols + 1, rows + 1,new int87;diamondsButtoncolsrow

40、s);this.grid = grid;randomBuild();mainFrame.setVisible(false);/ 窗口不可public static void main(String args)见/ 主函数LianLianKan llk = newpressInformation = false;LianLianKan();/ 创建对象llk.randomBuild();/ 调用方法init();llk.startt();timer.start();/ 启22第六章结束语本次 java 课程设计,通过一学期的学习知识, 成功的设计出一个非常经典的连连看小游戏,参考网络上的知识,进行扩展知识面,本节只要了解了图形界面的概念,及其应用到实际界面中,深刻的了解了AWT得基本体系结构,SWING组件的功能, Swing组件从功能上分为三种类型 : 顶级组件,中间组件和基本组件。深刻的了解到它是用 java 纯代码来实现的,并且它在不同的平台上的运行效果

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论