《图片连连看游戏程序.doc》由会员分享,可在线阅读,更多相关《图片连连看游戏程序.doc(29页珍藏版)》请在三一办公上搜索。
1、高级语言程序设计(2)课程设计任务书题 目图片连连看游戏程序 学生姓名学号专业班级设计内容与要求【问题描述】图片连连看游戏是利用java图形用户界面设计而设计的图片连连看游戏界面。它的游戏规则就是选择一对内容相同的图案进行连线,但此连线不能穿跨其他图案。连线的转折点不能多于两个,如果符合规定则消除此对图案。如果游戏找不到可连接消除的图案,可以通过鼠标点击重列按钮让它重新排列图案,也可以通过鼠标重新开始新的游戏,时间结束后游戏自动结束,还可以通过鼠标退出游戏。【软件功能】 1 利用awt实现良好的游戏界面,游戏界面尽可能美观。 2 游戏开始时,能产生随机数字和随机位置以及限制的时间。 3 在按动
2、鼠标和键盘时,游戏能玩起来,即能响应鼠标事件。4 能消去满足条件的含有相同数字的图片。5 能重列图片顺序。6 能选择退出游戏和重新再来一局。【基本要求】1 用二维数组存放游戏按钮的位置坐标。2 用二维数组存放随机位置。3 调用按钮方法将图片添加到游戏按钮上。4 要求用户界面采用图形用户界面,响应鼠标事件。5 利用awt实现良好的GUI界。6 用GridLayout类以矩形网格形式和BorderLayout类以界面布局形式对容器中的组件进行布局。7 源程序中要有充分的注释,报告中要有详细的流程图和文字材料。8 运行的结果以及图形用户界面要进行屏幕拷贝,插入报告中。【提交成果】 1“高级语言程序设
3、计(2)课程设计任务书”和“高级语言程序设计(2)课程设计报告”打印件各一份; 2 先将上面两项内容的word文档,通过电子邮件交到指导教师,待许可后,打印装袋。起止时间2012 年 12 月 24 日 至 2012 年12月 30 日指导教师签名 2012年 12 月 22 日系(教研室)主任签名 2012 年 12月 22 日学生签名 2012年 12 月 25 日 高级语言程序设计(2)课程设计报告 专业: 班级: 学号:姓名: 完成日期: 指导教师 一、程序设计说明书【设计题目】 图片连连看游戏程序【问题描述】 图片连连看游戏是利用java图形用户界面设计而设计的图片连连看游戏界面。它
4、的游戏规则就是选择一对内容相同的图案进行连线,但此连线不能穿跨其他图案。连线的转折点不能多于两个,如果符合规定则消除此对图案。如果游戏找不到可连接消除的图案,可以通过鼠标点击重列按钮让它重新排列图案,也可以通过鼠标重新开始新的游戏,时间结束后游戏自动结束,还可以通过鼠标退出游戏。 【软件功能】 1 利用awt实现良好的游戏界面,游戏界面尽可能美观。 2 游戏开始时,能产生随机数字和随机位置以及限制的时间。 3 在按动鼠标和键盘时,游戏能玩起来,即能响应鼠标事件。4 能消去满足条件的含有相同数字的图片。5 能重列图片顺序。6 能选择退出游戏和重新再来一局。【算法思想】 在检验两个图片能否消掉的时
5、候,要让两个图片同时满足两个条件才行,就是两者配对并且连线成功。分 3 种情况:这三种情况都需要三个检测,这三个检测分别检测一条直路经。这样就会有三条路经。若这三条路经上都是空按钮,那么就刚好是三种直线(两个转弯点)把两个按钮连接起来了。 (1)、相邻 (2)、若不相邻的先在第一个按钮的同行找一个空按钮。1.找到后看第二个按钮横向到这个空按钮所在的列是否有按钮。2.没有的话再看第一个按钮到与它同行的那个空按钮之间是否有按钮。3.没有的话,再从与第一个按钮同行的那个空按钮竖向到与第二个按钮的同行看是否有按钮。没有的话路经就通了可以消了. (3)、若(2)失败后,再在第一个按钮的同列找一个空按钮。
6、1.找到后看第二个按钮竖向到这个空按钮所在的行是否有按钮 2.没有的话,再看第一个按钮到与它同列的那个空按钮之间是否有按钮。3.没有的话,再从与第一个按钮同列的那个空按钮横向到与第二个按钮同列看是否有按钮。没有的话路经就通了,可以消了。若以上三步都失败,说明这两个按钮不可以消去两图能相连的所有情况: 【类的设计】 图片连连看游戏程序中只有一个类,类名为LianLianKan,该类实现了接口ActionListener;该类总共有十三个方法,他们的功能分别是:init()初始化;createImgBtn()传进两个String类型的参数,返回带有数字和图片的按钮;randomBuild(),产生
7、十五对随机的数字;fraction()计算得分;reload()将游戏按钮重列;estimateEven()传进两个int型和一个JButton型的三个参数(分别是击中的按钮位置坐标和按钮),选中按钮信息的存储与操作;xiao()消去符合游戏规则的相同的两个按钮;linePassOne()在第一按钮同行有空按钮的条件下判断第二转折点出现的情况;rowPassOne()在第一按钮同列有空按钮的条件下判断第二转折点出现的情况;remove()将相同的两个按钮消去;actionPerformed()实现按钮事件的监听;timerDemo()时间提示;main()主方法;【用户界面】 【程序技巧】 1
8、.程序采用图形用户界面,简单大方,且易于操作;2.连连看图片采用大家熟悉的图片,能激起玩家的游戏兴趣;3.游戏功能较为齐全,可实现退出、重列和下一局的功能,重列功能可对游戏中剩余的图片进行重新排列,使游戏继续进行,下一局功能可以使游戏重新开始4.游戏具有倒计时功能,能够控制游戏时限,使游戏具有一定难度,倒计时结束时显示“game over”5.游戏可以统计玩家的游戏得分 【模块划分及调用关系】根据对连连看游戏的分析,该游戏可分化为三个模块:算法模块、界面显示模块、菜单控制模块。 调用关系: rowPassOne()linePassOne()remove()xiao()init()timerDe
9、mo()randomBuild()estimateEven()reload()actionPerformed()createImgBtn()fractionLabel()init()timerDemo()main方法randomBuild() 新建LianLianKan对象 【模块流程图】 主模块流程图:连连看游戏用户界面模块菜单模块算法模块 用户界面模块流程图:Button下一局Button重列Button退出Label:您的得分Label:Fraction(分数)Label:TimeLabel:剩余时间EastPanelBorderLayout布局WestPanelBorderLayout
10、布局thisContainer主界面NorthPanelBorderLayout布局SouthPanel BorderLayout布局CenterPanel GriLayout布局 (7x8)算法模块流程图:消去是否直线相连消去是否相邻消去是否直线相连是否相邻是否为同一图片消去不能消去是否在一条竖线是否在一条横线是否在同一位置否是是否是否否是是是否是否否当两图不在一条直线上,则以两图在X、Y方向的延长线上去找两个点,使其能连成直线是否不能消去消去【运行说明】将25个图片和LianLianKan.java文件存在同一个文件夹里javac LianLianKan.java java LianLia
11、nKan二、 程序上机调试报告【语法错误及其排除】 将图片加载在按钮上,并在调用按钮时会出现随机的图片时出现错误,最后创建了一个方法JButton createImgBtn(String ing,String txt),作用是传进两个String类型的参数,返回带有数字和图片的按钮,方法中的主要内容有ImageIcon image = new ImageIcon(getClass().getResource(ing);JButton button = new JButton(txt,image);通过调用这个方法就可以将图片与按钮固定在一起。 加载计时器时出现错误,即如果只在初始方法init(
12、)里调用timerDemo()方法时,在点击重列按钮或者下一局按钮时,时间提示里的时间是两次时间相掺杂的;改为只在main()方法里调用timerDemo()方法,在点击重列按钮时没有问题,但在点击下一局按钮时,时间还是相掺杂着出现;最后改为在main()方法里调用timerDemo()方法的同时在actionPerformed()方法里将if(e.getSource()=newlyButton) int grid = new int87; this.grid = grid; randomBuild(); mainFrame.setVisible(false); pressInformatio
13、n=false; Init(); 改为:if(e.getSource()=newlyButton) flag=true;int grid = new int87; this.grid = grid; randomBuild(); mainFrame.setVisible(false); pressInformation=false; init(); timerDemo(); 【算法错误及其排除】 在编辑randomBuild()方法产生随机的两两相同的数字时,程序中会出现并非两两相同的图片,达不到预期的效果,后改为在randomBuild()方法里添加如下这样的程序: while(gridco
14、lsrows!=0) cols=(int)(Math.random()*6+1); rows=(int)(Math.random()*5+1); 程序才正确。 在编辑程序时,定义了一个grid数组,用来存放游戏按钮的位置,刚开始定义的是6行5列,结果玩游戏时,周边的按钮不能被消去,后将数组改为8行7列时才可以,这样按钮周边的一圈就是空按钮,周边的按钮就可以被消去。三、 程序测试结果【测试数据】1、程序运行结果: 2、点击重列按钮结果:3、点击下一局:4、游戏结束界面:【输出结果】 【收获及体会】通过这次图片连连看游戏的设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所
15、学的理论知识与实践相结合起来,从理论中得出结论,才能真正的提高自己的水平,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,并且还发现了自己的许多不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。同时在这次的设计中也小小的体验了一下做项目的感受。我完成了这次JAVA课程设计,不过这只是我学习路上的驿站。我相信我在未来的学习中会记住从本次课程设计中所学到的东西,并将它用到未来的学习中去。四、 源程序代码import java.awt.BorderLayout;import java.awt.Color;import java.awt.Contain
16、er;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.Timer;import java.util.TimerTask;import javax.swing.ImageIcon;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;public class Li
17、anLianKan implements ActionListener /主面板JFrame mainFrame; /面板容器Container thisContainer; /子面板 JPanel centerPanel,southPanel,northPanel,westPanel,eastPanel;/游戏按钮数组JButton diamondsButton = new JButton65;/开始,退出,重列,重新开始按钮JButton exitButton,resetButton,newlyButton; /JButton startButton;/分数标签JLabel fractio
18、nLable=new JLabel(0);/时间标签JLabel time=new JLabel();/分别记录两次被选中的按钮 JButton fristButton,secondButton; /储存游戏按钮位置 int grid = new int87; /判断是否有按钮被击中 static boolean pressInformation=false; /被选中的两个游戏按钮的位置坐标(x0,y0),(x,y) int x0=0,y0=0,x=0,y=0; /两个被选中按钮上相应的数字int fristMsg=0,secondMsg=0;int i,j,k,n;/int s=0;fin
19、al Timer t=new Timer();Color b=Color.orange;Color g=Color.cyan;Color m=Color.pink;/Color c=Color.blue;boolean flag;/初始化public void init() /创建主面板,并命为连连看mainFrame=new JFrame(连连看); thisContainer = mainFrame.getContentPane(); /thisContainer.setBackground(c);/* * 把thisContainer划分为Center、South、North三个区域 *
20、 North区域添加分数 * Center区域添加游戏按钮 * South区域添加退出、重列、下一局等按钮 */thisContainer.setLayout(new BorderLayout(); centerPanel=new JPanel();centerPanel.setBackground(b);southPanel=new JPanel();southPanel.setBackground(g);northPanel=new JPanel(new BorderLayout() ); /northPanel.setBackground(m);westPanel=new JPanel(
21、);westPanel.setBackground(m);eastPanel=new JPanel();eastPanel.setBackground(m);/Label time=new Label(剩余时间:);thisContainer.add(centerPanel,Center); thisContainer.add(southPanel,South); thisContainer.add(northPanel,North); northPanel.add(westPanel,West);northPanel.add(eastPanel,Center);westPanel.add(B
22、orderLayout.WEST,new JLabel( 剩余时间:);westPanel.add(BorderLayout.EAST,time);eastPanel.add(BorderLayout.CENTER,new JLabel(您的得分:);eastPanel.add(BorderLayout.EAST,fractionLable);eastPanel.add(fractionLable,Center);/northPanel.add(fractionLable); /* * eastPanel.add(new JLabel(您的得分:); * eastPanel.add(fract
23、ionLable); * westPanel.add(BorderLayout.WEST,new JLabel( 剩余时间:); *westPanel.add(BorderLayout.EAST,new JLabel(time); * northPanel.add(westPanel); */把CenterPanel区域设置为网格布局centerPanel.setLayout(new GridLayout(6,5); for(int cols = 0;cols 6;cols+) for(int rows = 0;rows 5;rows+ ) if(gridcols+1rows+1!=0) /给
24、指定按钮添加图片diamondsButtoncolsrows=createImgBtn(gridcols+1rows+1+.jpg, String.valueOf(gridcols+1rows+1); else /当指定按钮为空时传空字符串即照片为传的照片为空 diamondsButtoncolsrows=createImgBtn(,String.valueOf(gridcols+1rows+1); /* *else* * /当指定按钮为空时将其定义为新的按钮*diamondsButtoncolsrows=new JButton();* */diamondsButtoncolsrows.add
25、ActionListener(this); centerPanel.add(diamondsButtoncolsrows); /startButton=new JButton(开始);/startButton.addActionListener(this);exitButton=new JButton(退出); exitButton.addActionListener(this); resetButton=new JButton(重列); resetButton.addActionListener(this); newlyButton=new JButton(下一局); newlyButton
26、.addActionListener(this);/southPanel.add(startButton);southPanel.add(exitButton); southPanel.add(resetButton); southPanel.add(newlyButton); /*为该标签设置一个文本字符串*该字符串为标签字符串所显示的文本字符串作为有符号的十进制整数为参数的字符串*/fractionLable.setText(String.valueOf(Integer.parseInt(fractionLable.getText(); mainFrame.setBounds(180,10
27、,800,650);/设置主面板的位置和大小 mainFrame.setVisible(false);mainFrame.setVisible(true); /centerPanel.setVisible(false);/timerDemo(); /创建带有图片的按钮public JButton createImgBtn(String ing,String txt) /根据给定名称的资源创建一个 ImageIcon。ImageIcon image = new ImageIcon(getClass().getResource(ing);JButton button = new JButton(t
28、xt,image);/设置文本(即数字)相对于图标的垂直位置为底及水平位置为中心button.setVerticalTextPosition(JButton.BOTTOM);button.setHorizontalTextPosition(JButton.CENTER);return button; /* *产生游戏中的随机数字 *数字至少两两相同 */public void randomBuild() int randoms,cols,rows; for(int twins=1;twins=15;twins+) randoms=(int)(Math.random()*25+1);/随机产生一
29、个125的数字 for(int alike=1;alike=2;alike+) /产生两个随机的坐标来存放同一个数字cols=(int)(Math.random()*6+1); rows=(int)(Math.random()*5+1); while(gridcolsrows!=0)/避免出现重复的坐标 cols=(int)(Math.random()*6+1); rows=(int)(Math.random()*5+1); this.gridcolsrows=randoms; /计算得分public void fraction() fractionLable.setText(String.v
30、alueOf(Integer.parseInt(fractionLable.getText()+100); /重列public void reload() int save = new int30; int n=0,cols,rows; int grid= new int87;/time.setVisible(false);for(int i=0;i=6;i+) for(int j=0;j=0) /将剩下的所有图片数字重新随机放在数组grid中cols=(int)(Math.random()*6+1); rows=(int)(Math.random()*5+1); while(gridcols
31、rows!=0)/避免出现重复的坐标 cols=(int)(Math.random()*6+1); rows=(int)(Math.random()*5+1); this.gridcolsrows=saven; n-; mainFrame.setVisible(false); /将按钮点击信息归为初始 pressInformation=false;init(); for(int i = 0;i 6;i+) for(int j = 0;j 5;j+ ) if(gridi+1j+1=0) /将消去的按钮设置为不可见 diamondsButtonij.setVisible(false); /选中按钮
32、信息的存储与操作public void estimateEven(int placeX,int placeY,JButton bz) if(pressInformation=false) /如果第一个按钮未被击中,则将传来的按钮坐标赋给(x,y) x=placeX; y=placeY; fristMsg=gridxy;/将按钮上的数字赋给fristMsg fristButton=bz;/将(placeX,placey)位置上的按钮bz赋给fristButton pressInformation=true;/将按钮点击信息设置为true else /* *如果第一个按钮被击中 ,则将第一个按钮坐
33、标赋给(x0,y0) *将fristButton按钮赋给secondButton按钮 *将传来的按钮坐标赋给坐标(x,y) *如果当两个不同的按钮上的数字相等时则调用remove()函数消去 */x0=x; y0=y; secondMsg=fristMsg;/将击中的第一个按钮上的数字赋给第二个按钮secondButton=fristButton;/将第一个按钮赋给第二个按钮x=placeX; y=placeY; fristMsg=gridxy;/将传过来的按钮上的数字赋给fristMsgfristButton=bz;/将传过来的按钮赋给fristButton if(fristMsg=seco
34、ndMsg & secondButton!=fristButton) /如果当两个不同的按钮上的数字相等时则消去xiao(); /消去public void xiao() if(x0=x &(y0=y+1|y0=y-1) | (x0=x+1|x0=x-1)&(y0=y) /如果两个按钮相邻,则消去 remove(); else /如果两个按钮不相邻/判断与第一按钮同行的情况for (j=0;jj) /如果第二个按钮的y坐标大于空按钮的j坐标说明空按钮在第二按钮左边 for (i=y-1;i=j;i-) /判断第二按钮左侧直到位置(x,j)有没有按钮 /即判断与空按钮同列、与第二按钮同行的位置到
35、第二按钮的左侧为止有没有按钮if (gridxi!=0) /如果有按钮,则将k初始化为零,并将跳出循环 k=0; break; else /如果没有按钮k=1;/K=1说明通过了第一次验证 if (k=1) /k=1说明横坐标为x,纵坐标从j到(y-1)的位置都没有按钮/即说明与空按钮同列、与第二按钮同行的位置到第二按钮的左侧为止没有按钮linePassOne(); if (yj) /如果第二个按钮的y坐标小于空按钮的j坐标说明空按钮在第二按钮右边 for (i=y+1;i=j;i+) /判断第二按钮右侧直到位置(x,j)有没有按钮 if (gridxi!=0) /如果有按钮,则将k初始化为零
36、,并将跳出循环k=0; break; else /如果没有按钮k=1; if (k=1) /通过第一次验证,即第二按钮右侧直到位置(x,j)没有按钮linePassOne(); if (y=j ) /第二个按钮与空按钮同列,即第二按钮与第一按钮同行linePassOne(); if (k=2) /通过第二验证if (x0=x) /两个按钮在同一行remove(); if (x0x) /第二个按钮所在行在第一按钮所在行的下面for (n=x0;nx) /第二个按钮所在行在第一按钮所在行的上面for (n=x0;n=x+1;n-) /判断空按钮上侧直到位置(x+1,j)有没有按钮if (gridnj!=0) /如果有按钮,将k初始化为零,并跳出循环k=0; break; if(gridnj=0