欢乐连连看游戏的设计方案.doc_第1页
欢乐连连看游戏的设计方案.doc_第2页
欢乐连连看游戏的设计方案.doc_第3页
欢乐连连看游戏的设计方案.doc_第4页
欢乐连连看游戏的设计方案.doc_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

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

文档简介

欢乐连连看游戏的设计方案现代科学技术的发展,改变了人类的生活,作为新世纪的大学生,应该站在时代发展的前沿,掌握现代科学技术知识,以适应社会的发展,能够独立完成面临的任务,作一名有创新意识的新型人才。小游戏连连看发展现状及未来趋势的研究认为,小游戏依然是一个能给小游戏市场创造巨大财富的行业,因此急需寻求一个新的亮点。艾瑞咨询分析认为,选择有很大发展空间、且投资金额要求不高的小游戏连连看成了投资者再次介入小游戏行业的首选,其优势主要体现在以下两个方面: 1. 连连看小游戏产品定位合理,外部有利因素促进行业发展;2. 连连看小游戏行业正处于迅猛发展期,上升空间巨大。现在小游戏、网页游戏越来越受网民欢迎,除了玩的方法简单外,很多游戏不乏经典。连连看游戏就是典型了!游戏“连连看”,只要将相同花色的两张牌用三根以内的直线连在一起就可以消除,规则简单容易上手。游戏速度节奏快,画面清晰可爱,老少皆宜。 不管你走到哪个游戏网站,连连看游戏总是排在受玩家欢迎排名的前5位,休闲、趣味、益智是连连看玩不厌的精华,且不分男女老少、工薪白领,是一款适合大众的经典网络休闲小游戏。 需求分析:随着世界经济的长足发展和计算机技术的日益成熟,计算机被应用到人类活动的各个领域,各种应用软件也相继问世,这其中有相当一部分是游戏开发软件。游戏种类繁多,有网络游戏,单机游戏,网页游戏等,其中单机游戏又有很多种类,这里就不详细介绍了,单机游戏中有些小游戏,它们对系统的配置要求较低。能够满足人们对娱乐性的需求,是人们在日常生活中,工作过后放松紧张心情的最佳选择。我所专修的JAVA语言自然而然的成为了我设计这款连连看小游戏的首选语言,它是面向对象的语言,程序语言简洁易懂,可移植性强,几乎不受操作系统版本的影响。设计流程:流程规划大致上可以分为三个部分,分别为:游戏初始化界面设计、游戏规则的设定,菜单控制模块。在这其中最主要的就是游戏规则的设置,与游戏窗口的初始化。当玩家单击“文件”菜单中的“开始游戏”按钮后,系统就会初始化游戏界面。初始化游戏界面主要包括游戏区的图片布局与显示,作弊功能的炸弹个数的初始化,游戏时间的初始化。该游戏的图片张数为64张,分为8行和8列,每次开局的图片布局都是随机的。初始时间设置为600秒,当时间用完,而图片未能全部消除,则提示游戏结束,这里我要申明一下,由于我的技术还不强,所以未能将时间用进度条的形式显示出来,敬请见谅。游戏界面都设置好了也初始化了,接下来就是游戏的开始了,根据游戏设定的规则进行图片的清除,直到最后一对图片消除为止。我设计的连连看游戏的流程图如下图1.1所示:图1.1 流程图数据结构设计:整个游戏地图被抽象成一个有ROWS与COLUMNS坐标位置属性的平面,平面上有序地分布着若干个小方块,并且这些表情方格都是成对出现的。经过前面的描述和分析后,可以把游戏区域地图用一个二维数组Map来表示。Map是把地图设计成一个整型二维数组,对应地图中的行列数。在这里设计Map的ROWS为8,COLUMNS为8。它在MapUI的类文件中对象定义中添加地图核心数据的成员变量,具体如下:public static final int ROWS = 8;/行数public static final int COLUMNS=8;/列数而map数组在Map类中定义:private int map = new intSettings.ROWS + 2Settings.COLUMNS + 2;上面的成员变量中定义了一个二维整型数组map,用于记录动态分配出来的地图数组空间的地址。对于地图区域中的某个小方块的类型,可以用一个整形的ID来进行识别。这里为标识地图的行列位置分别添加ROWS和COLUMNS变量。算法设计:玩家选择的两张图片要能够被消除,它们必须符合几个基本的条件第一就是选中的两个方块图案必须相同。第二个要求就是选中的两个方块之间没有障碍物阻碍的情况下,可以用一条平行或垂直的直线线段连接起来。第三就是这些将它们连接起来的直线线段的折点不超过两个(也就是说直线线段不超过三条)。图片可以消除的连接方式分为三种最简单的就是直连方式。第二种就是有一个折点的平行垂直线段连接。第三种就是有两个折点的平行垂直线段连接。它的具体消除图片实例如图2.1所示。 图2.1 消除图片实例(1)直接连接方式在直接连接方式中,必须要求所选定的两个方块在同一水平直线上或者在同一垂直线上,并且两个方块之间没有任何其它图案方块。(2)有一个转折点连接方式所选定的两个方块如果通过折点的方式连接,那么对折点来说,每个折点必定有且至少有一个坐标(x或y)是和其中一个目标点相同的,即折点必定在两个目标点所在的x方向或y方向的直线上。此外,对于一个折点连接的情况,折点应该为第一个选中方块的横向线或纵向线与第二个选中方块的纵向线和横向线相交而得出。(3)两个转折点的连接方式这种方式的两个折点所连成的直线与两物件的直接连线可以构成平行线,因此可以根据这个规律,将这条水平线在游戏区域允许的条件上下移动,然后通过判断整条带垂直折线点的曲线之间有无障碍物方式来确定是否可以连同。这种情况可以分为两种情况:(1)选中的两图案方块在同一直线,两折点间的直连线可在其这两个方块之间的空间位置作移动,其约束是不超过游戏边界区域。(2)选中的两图案方块不在同一直线,两折点间的直连线可在两个方块之间的空间位置作移动,其约束是两方块之间的区域。经过上面详细的分析后,可以对选定的两方块是否可以作抵消操作可以这样设计下去。它的判断图片是否相同的流程图如图2.2所示。 图2.2 判断图片是否相等的流程图首先,对简单直接连的情况进行判断,看它是否符合条件,假如不能,再加深一个级别的复杂度,对一个折点的情况进行判断,依次类推。规则设计好之后就是判断两张图片能否消除,因此我将这些判断方法统一放在了Map类当中。在该类中首先由oneLine方法判断选择的两张图片是否在同一条直线上,不管是垂直上的还是平行上的都可以消除。如果选择的两张图片不能消除就由oneConner方法来实现通过转一次弯是否能够消除。如果还不能消除则由twoConner方法来实现通过转两次弯是否能够消除。每次玩家点击两张图片后就会调用这个类中的三个判断方法。三个方法的代码如下所示:public boolean oneLine(ArrayPoint p1, ArrayPoint p2)if (p1.value != p2.value)return false;if (oneLineWithoutValue(p1, p2)return true;return false;public boolean oneConner(ArrayPoint p1, ArrayPoint p2)/ 获取P1水平方向的拐点ArrayPoint p1H = new ArrayPoint(p1.i, p2.j, mapp1.ip2.j);/ 获取P1垂直方向的拐点ArrayPoint p1V = new ArrayPoint(p2.i, p1.j, mapp2.ip1.j);if (p1.value != p2.value)return false;if (oneConnerWithoutValue(p1, p2)return true;return false;public boolean twoConner(ArrayPoint p1, ArrayPoint p2)if (p1.value != p2.value)return false;int count = 0;ArrayPoint temp = null;/ 纵坐标左移for (int col = p1.j - 1; col = 0; col-)temp = new ArrayPoint(p1.i, col, mapp1.icol);if (temp.value = 0) & this.oneLineWithoutValue(p1, temp)if (this.oneConnerWithoutValue(temp, p2)return true;elsebreak; / 纵坐标右移count = Settings.COLUMNS + 2 - p1.j;for (int col = p1.j; col = 0; row-)temp = new ArrayPoint(row, p1.j, maprowp1.j);if (temp.value = 0) & oneLineWithoutValue(p1, temp)if (oneConnerWithoutValue(temp, p2)return true;/ 横坐标下移for (int row = p1.i + 1; row Settings.ROWS + 2; row+)temp = new ArrayPoint(row, p1.j, maprowp1.j);if (temp.value = 0) & oneLineWithoutValue(p1, temp)if (oneConnerWithoutValue(temp, p2)return true;return false;程序运行测试:1. 程序主界面图当用户运行程序时将会出现一个灰色带菜单的界面,它是最原始的游戏界面,还没有进行游戏界面的初始化。它的原始界面如图3.1所示。图3.1 原始界面2.游戏开始的界面用户在菜单栏中选择“文件”,单击“开始游戏”,这样就能进入游戏界面了。游戏初始化后的界面如图3.2所示。图3.2 游戏初始化后的界面3. 使用道具界面用户进入游戏界面后,开始游戏,在菜单栏中选择“帮助”,单击“炸弹”。游戏界面如图3.3所示。图3.3 使用道具界面4.游戏成功提示界面如果玩家在游戏规定的时间内消除了游戏区域的所有图片则游戏胜利,该游戏在设计的时候设计了一个游戏胜利后的提示窗口,提供了两种选择,一种是玩家继续挑战下一关另一种选择就是退出游戏。游戏成功的界面如图3.4所示。 3.4游戏成功的界面5.游戏菜单栏界面用户运行程序后,选择菜单栏有如下选择,如图4.1中a,b,c,d所示。 (a) (b) (c) (d)图4.1 游戏菜单栏界面6. 游戏规则界面用户运行程序后,选择菜单栏中的“游戏说明”,单击“游戏规则”,弹出“游戏规则”窗口,如图6.1所示。图6.1 游戏规则窗口7. 版本介绍界面用户运行程序后,选择菜单栏中的“游戏说明”,单击“版本介绍”,弹出“版本介绍”窗口,如图7.1所示。图7.1 版本介绍窗口结束语:这次的课程设计让我收获颇丰,不仅对数据结构有了更胜层次的理解,还学会了怎么去应用,另外还提高了我的JAVA语言应用能力。这次的课程设计,让我彻底了解了连连看小游戏的设计思想和程序设计要领,虽然这个程序不全是我的思想,但是它的总体实现步骤、各种算法、系统函数等我都还是详细的去了解了,遇到不懂的都一一的去网上百度了,或者请教老师与同学,通过这些途径问题都一一的解决了,所以我觉得在学习上遇到困难不是什么大的问题,如果不去解决就会慢慢的变成大问题了。程序的编写需要有耐心,有些事情看起来很复杂,但问题需要一点一点去解决,分析问题,把问题一个一个划分,划分成小块以后就逐个去解决。再总体解决大的问题。这样做起来不仅有条理也使问题得到了轻松的解决。参考文献:1严蔚敏吴伟民编著,数据结构(C语言版),清华大学出版社,20102邓俊辉.数据结构与算法(Java描述).北京:机械工业出版社,2006 3(美)MichaelMain,孔芳等译.数据结构Java语言描述.北京:机械工业出版社,2007附录:/MainFrame.javaimport java.awt.BorderLayout;import java.awt.FlowLayout;import java.awt.Frame;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JTextArea;import javax.swing.JTextField;import javax.swing.SwingUtilities;import javax.swing.Timer;import com.xxy.Settings;import com.xxy.model.Map;public class MainFrame extends JFrameprivate static long a;private static final long serialVersionUID = 1L;/炸弹的次数private int bombCount = Settings.BOMBCOUNT;private JFrame f,f1;final JFrame f2=null;private JPanel jContentPane = null;private JMenuBar menuBar = null;private JMenu fileMenu = null;private JMenu helpMenu=null;private JMenu gsmMenu=null;private JMenu jiluMenu=null;private JMenuItem reloadItem = null;private JMenuItem gguizeItem=null;private JMenuItem gbanbenItem=null;JMenuItem MyjiluItem=null;JTextField text1,text2;private JMenuItem startItem = null;/炸弹private JMenuItem bombItem = null;private JMenuItem exitItem = null;private MapUI mapUI = null;/ 游戏开始时间private long startTime;/ 结束时间private long endTime;private Timer timer = null;private JMenuBar initMenuBar()if (menuBar = null)menuBar = new JMenuBar();fileMenu = new JMenu(文件);helpMenu=new JMenu(帮助);gsmMenu=new JMenu(游戏说明);jiluMenu=new JMenu(查看记录);gguizeItem=new JMenuItem(游戏规则);gbanbenItem=new JMenuItem(游戏版本);MyjiluItem=new JMenuItem(我的记录);helpMenu.setEnabled(false); startItem = new JMenuItem(开始游戏);startItem.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)a0=System.currentTimeMillis()/1000;reload();MyjiluItem.setEnabled(false););reloadItem = new JMenuItem(重来一次);reloadItem.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)a0=System.currentTimeMillis()/1000;reload();MyjiluItem.setEnabled(false);helpMenu.setEnabled(true););bombItem = new JMenuItem(使用炸弹);bombItem.addActionListener(new ActionListener()public void actionPerformed( ActionEvent e )if( bombCount=0 )JOptionPane.showMessageDialog(MainFrame.this,你已经没有炸弹可用了! );bombItem.setEnabled(false);return;mapUI.bomb();bombCount-;JOptionPane.showMessageDialog(MainFrame.this,你使用了一个炸弹了,你只剩+bombCount+个炸弹了 );return;);exitItem = new JMenuItem(退出);exitItem.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)System.exit(0););MyjiluItem.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)jilu();a2=mapUI.getSeconed();System.out.print(Long.toString(a2);a0=a2-a0;text1.setText(Long.toString(a0);if(a0a1)a1=a0;text2.setText(Long.toString(a1););gguizeItem.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)guize(); );gbanbenItem.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)banben(); );fileMenu.add(startItem);fileMenu.add(reloadItem);fileMenu.add(exitItem);helpMenu.add(bombItem);gsmMenu.add(gguizeItem);gsmMenu.add(gbanbenItem);jiluMenu.add(MyjiluItem);menuBar.add(fileMenu);menuBar.add(gsmMenu);menuBar.add(helpMenu);menuBar.add(jiluMenu);return menuBar;/* * param args */public static void main(String args)SwingUtilities.invokeLater(new Runnable()public void run()MainFrame thisClass = new MainFrame();thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);thisClass.setVisible(true););/* * This is the default constructor */public MainFrame()super();a=new long4;a0=59999999;a1=59999999;initialize();/* * This method initializes this * * return void */private void initialize()this.setSize(700, 700);this.setTitle(llk);this.setJMenuBar(initMenuBar();this.setTitle(连连看);private void reload()mapUI = new MapUI();mapUI.f=this;startTime = System.currentTimeMillis() / 1000;endTime = startTime + Settings.PERTIME;jContentPane = new JPanel();jContentPane.setLayout(new BorderLayout();jContentPane.add(mapUI);this.setContentPane(jContentPane);this.validate();Map.LEFTCOUNT = Settings.ROWS * Settings.COLUMNS;initTimer();bombItem.setEnabled(true);bombCount=Settings.BOMBCOUNT;private void jilu()f1=new JFrame(我的记录);JButton button2=new JButton(确定);JLabel label1=new JLabel(上次记录 );JLabel label2=new JLabel(最高记录 );text1=new JTextField(18);text1.setEnabled(false);text1.setText(Long.toString(a0);text2=new JTextField(18);text2.setText(Long.toString(a1);text2.setEnabled(false);f1.setLayout(new FlowLayout();f1.add(label1);f1.add(text1);f1.add(label2);f1.add(text2);f1.add(button2);button2.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)f1.setVisible(false););f1.setBounds(100,100,300,150);f1.setVisible(true);f1.setResizable(false);validate();private void guize()f=new JFrame(游戏规则);JLabel label3=new JLabel(游戏规则: );JLabel label4=new JLabel(辅助控制: );JTextArea text3=new JTextArea(8,20);text3.setText(这是一个连连看的游戏,n游戏规则如下:n如果两个相邻图片一样则可以同时消去n如果两个图片在同一垂直或水平线上n而两者之间没有其他图片则可消去n如果);text3.setEnabled(false);JTextArea text4=new JTextArea(6,20);text4.setText(通过点击鼠标左键来选中图片n连续点击另一个相同的图片n来消去图片n你还可以使用帮助中的炸弹来消去图片);text4.setEnabled(false);f.setLayout(new FlowLayout();f.add(label3);f.add(text3);f.add(label4);f.add(text4);f.setBounds(100,100,400,400);f.setResizable(false);f.setVisible(true);private void banben()JFrame f2=new JFrame(版本介绍);JTextArea text5=new JTextArea(3,3);text5.setText(本游戏为类似游戏的最终版本n游戏作者:肖小粤n本游戏受法律保护,严禁用于商业等其他用途n希望你能玩的愉快!);f2.add(text5);text5.setLocation(0,0);text5.setSize(350,300);text5.setEnabled(false);f2.setLayout(null);f2.setBounds(100,100,350,300);f2.setVisible(true);private void initTimer()ActionListener actionListener = new ActionListener()public void actionPerformed(ActionEvent e)startTime = System.currentTimeMillis() / 1000;if (startTime = endTime)JOptionPane.showMessageDialog(MainFrame.this, 时间到了!);int result = JOptionPane.showConfirmDialog(MainFrame.this,重玩一次?, Again, JOptionPane.YES_NO_CANCEL_OPTION);if (result = JOptionPane.YES_OPTION)reload();elsejContentPane.setVisible(false);validate();timer = new javax.swing.Timer(1000, actionListener);timer.start();/ChessButton.javaimport .URL;import javax.swing.ImageIcon;import javax.swing.JButton;import com.xxy.Settings;import com.xxy.model.ArrayPoint;public class ChessButton extends JButton/ 按钮所对应的数组中的值和位置,用ArrayPoint结构来表示protected ArrayPoint point = null;/* * 构造函数,指定按钮所代表的值和位置 * * param row * 所在行号 * param col * 所在列号 * param value * 代表的值 */public ChessButton(int row, int col, int value)this(new ArrayPoint(row, col, value);/* * 构造函数 * * param point * 值和位置的数据结构 */public ChessButton(ArrayPoint point)this.point = point;String name =Resource/+point.getValue() + Settings.RELEX;URL url = ChessButton.class.getResource(name);ImageIcon icon = new ImageIcon( url );this.setIcon(icon);/* * 构造函数,使用默认值 */public ChessButton()this(new ArrayPoint(0, 0, 0);/* * 返回当前按钮代表的位置和值 * * return point */public ArrayPoint getPoint()return point;/* * 设置此按钮所代表的位置和值 * * param point * 要设置的 point */public void setPoint(ArrayPoint point)this.point = point;/MapUI.javaimport java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JTextField;import com.xxy.Settings;import com.xxy.model.ArrayPoint;import com.xxy.model.Map;public class MapUI extends JPanel implements ActionListenerprivate static final long serialVersionUID = 1L;MainFrame f;static long s;static boolean isEnd=false;/ 棋子数组,用按钮来表示private ChessButton chesses = null;/ 数据模型private Map map = new Map();/ 判断当前点击的棋子是否是第二次选中的private boolean two = false;/ 前面点的那个棋子private ArrayPoint priviousPoint;/ 第二次选中的棋子private ArrayPoint currPoint;/* * 构造函数 */public MapUI()super();initialize();/* * 初始化函数 * * return void */private void initialize()initChesses();GridLayout gridLayout = new GridLayout(Settings.ROWS + 2,Settings.COLUMNS + 2);gridLayout.setHgap(2);gridLayout.setVgap(2);this.setLayout(gridLayout);this.setSize(10, 10);/ 放置按钮,按行for (int row = 0; row Settings.ROWS + 2; row+)for (int col = 0; col Settings.COLUMNS +2; col+)add(chessesrow * (Settings.COLUMNS + 2) + col);private void initChesses()int values = map.getMap();/ 初始化棋子,和数据模型里保持一样this.chesses = new ChessButton(Settings.ROWS + 2) * (Settings.COLUMNS + 2);for (int row = 0; row 10; row+)for (int col = 0; col 10; col+)/ 通过二维的数据模型坐标得到一维的棋子坐标int index = row * (Settings.COLUMNS + 2) + col;/ 对棋子的数据模型,即ArrayPoint对象进行设置,指定此棋子具体的位置和值chessesindex = new ChessButton(row, col, valuesrowcol);/ 添加监听器chessesindex.addActionListener(this);/ 将外围的一圈设为不可见,行,列为0 和为最大值的情况if (row = 0 | row = (Settings.ROWS + 2 - 1) | col = 0| col = (Settings.COLUMNS + 2 - 1)chessesindex.setVisible(false);public void clearCheese(ArrayPoint priviousPoint, ArrayPoint currPoint,MainFrame f)this.f=f;/ 处理匹配,看两点中否联通/ 获得数据模型中的数组int values = map.getMap();/ 将模型中对应的棋子设为0valuespriviousPoint.getI()priviousPoint.getJ() = 0;valuescurrPoint.getI()currPoint.getJ() = 0;/ 使两个已经消除的按钮不可见int index1 = priviousPoint.getI() * (Settings.COLUMNS + 2)+ priviousPoint.getJ();int index2 = currPoint.getI() * (Settings.COLUMNS +2)+ currPoint.getJ();chessesindex1.setVisible(false);chessesindex2.setVisible(false);/ 如果棋子总数已为0,则程序结束if (map.LEFTCOUNT = 0)isEnd=true;s=System.currentTimeMillis()/1000;JOptionPan

温馨提示

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

评论

0/150

提交评论